#region Arthea License
/***********************************************************************
* Arthea MUD by R. Jennings (2007) http://arthea.googlecode.com/ *
* By using this code you comply with the Artistic and GPLv2 Licenses. *
***********************************************************************/
#endregion
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using Arthea.Connections.Colors;
using Arthea.Connections.Players;
using Arthea.Continents.Areas.Characters;
using Arthea.Continents.Areas.Items;
using Arthea.Environment;
using Arthea.Scripts.Enums;
namespace Arthea
{
/// <summary>
/// Miscellaneous code
/// </summary>
public struct Util
{
/// <summary>
/// Simulates rolling of dice
/// </summary>
/// <param name="rolls">the number of die to roll</param>
/// <param name="dieSize">the number of faces on a die</param>
/// <returns>the sum of die rolls</returns>
public static int Dice(int rolls, int dieSize)
{
int idice;
int sum;
switch (dieSize)
{
case 0:
return 0;
case 1:
return rolls;
}
for (idice = 0, sum = 0; idice < rolls; idice++)
sum += Randomizer.Next(1, dieSize);
return sum;
}
/// <summary>
/// Encrypts a string
/// </summary>
/// <param name="inp">the string to encrypt</param>
/// <returns>an encrypted version of input</returns>
public static string Encrypt(string inp)
{
MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
byte[] tBytes = Globals.Encoding.GetBytes(inp);
byte[] hBytes = hasher.ComputeHash(tBytes);
return Convert.ToBase64String(hBytes);
}
}
/// <summary>
/// Handles serialization
/// </summary>
public struct Persistance
{
/// <summary>
/// formats a string into a would-be file name
/// </summary>
/// <param name="words">the words to format</param>
/// <returns>a possible file name</returns>
public static string MakeFileName(string words)
{
return words.Replace(' ', '_').ToLower();
}
/// <summary>
/// Makes sure there is a .xml extension on a filename
/// </summary>
/// <param name="filename">the filename to check</param>
/// <returns>a filename that ends in .xml</returns>
public static string XmlFileName(string filename)
{
if (!filename.EndsWith(".xml"))
filename += ".xml";
return filename;
}
/// <summary>
/// Checks if an xml file of given name exits.
/// </summary>
/// <param name="file">the file name to check</param>
/// <returns>true if the file exists</returns>
public static bool XmlFileExists(string file)
{
return File.Exists(XmlFileName(file));
}
/// <summary>
/// Deserializes (Loads) a type from a given reader
/// </summary>
/// <typeparam name="T">The type of object</typeparam>
/// <param name="reader">the xml reader</param>
/// <returns>and instance of T</returns>
public static T Load<T>(XmlReader reader)
{
XmlSerializer s = new XmlSerializer(typeof (T));
return (T) s.Deserialize(reader);
}
/// <summary>
/// Deserializes an object in a file
/// </summary>
/// <typeparam name="T">The type of object</typeparam>
/// <param name="filename">The filename to load</param>
/// <returns>an instance of T</returns>
public static T Load<T>(string filename)
{
XmlSerializer s = new XmlSerializer(typeof (T));
TextReader r = new StreamReader(XmlFileName(filename));
T data = (T) s.Deserialize(r);
r.Close();
return data;
}
/// <summary>
/// Loads if file exists.
/// </summary>
/// <typeparam name="T">the type of object to load</typeparam>
/// <param name="filename">The filename.</param>
/// <returns>an instance of T</returns>
public static T LoadIfExists<T>(string filename) where T : new()
{
if (!XmlFileExists(filename))
return new T();
return Load<T>(filename);
}
/// <summary>
/// Saves an object to a given xml writer
/// </summary>
/// <param name="writer">the xml writer</param>
/// <param name="obj">the object to save</param>
public static void Save(XmlWriter writer, object obj)
{
XmlSerializer x = new XmlSerializer(obj.GetType());
x.Serialize(writer, obj);
}
/// <summary>
/// Saves an object to a file.
/// </summary>
/// <param name="filename">The file name</param>
/// <param name="obj">The object to save.</param>
public static void Save(string filename, object obj)
{
XmlSerializer x = new XmlSerializer(obj.GetType());
string tempFile = Path.GetTempFileName();
string xmlFile = XmlFileName(filename);
TextWriter w = new StreamWriter(tempFile);
x.Serialize(w, obj);
w.Close();
if (File.Exists(xmlFile))
File.Delete(xmlFile);
File.Move(tempFile, xmlFile);
}
/// <summary>
/// Gets a list of xml files in a specified directory
/// </summary>
/// <param name="path">The directory to explore</param>
/// <returns>an array of files</returns>
public static FileInfo[] GetDirectoryXmlFiles(string path)
{
DirectoryInfo di = new DirectoryInfo(path);
return di.GetFiles("*.xml");
}
}
/// <summary>
/// Handles action messages
/// </summary>
public class Act : Flag
{
#region [rgn] Fields (5)
/// <summary>
/// Display to room not include the victim
/// </summary>
public const ulong ToNotVict = (1UL << 3);
/// <summary>
/// Display to the player
/// </summary>
public const ulong ToPlayer = (1UL << 0);
/// <summary>
/// Display to the room
/// </summary>
public const ulong ToRoom = (1UL << 2);
/// <summary>
/// Display to the victim
/// </summary>
public const ulong ToVictim = (1UL << 1);
/// <summary>
/// Display to all players
/// </summary>
public const ulong ToWorld = (1UL << 4);
#endregion [rgn]
#region [rgn] Constructors (1)
/// <summary>
/// Initializes a new instance of the <see cref="Act"/> class.
/// </summary>
/// <param name="value">The value.</param>
public Act(ulong value)
: base(value)
{
}
#endregion [rgn]
#region [rgn] Methods (1)
// [rgn] Public Methods (1)
/// <summary>
/// Displayes an action message
/// </summary>
/// <param name="player">the player causing the action</param>
/// <param name="arg1">arg1 in the formating</param>
/// <param name="arg2">arg2 in the formating</param>
/// <param name="to">the player recieving the action message</param>
/// <param name="text">the action message</param>
public static void Show(Character player, object arg1, object arg2, Character to, string text)
{
Character victim = arg2 as Character;
Item item1 = arg1 as Item;
Item item2 = arg2 as Item;
CharEnumerator ch = text.GetEnumerator();
StringBuilder buf = new StringBuilder();
while (ch.MoveNext())
{
if (ch.Current != '$')
{
buf.Append(ch.Current);
continue;
}
if (!ch.MoveNext())
break;
if (ch.Current == '$')
{
buf.Append('$');
continue;
}
if (arg2 == null && char.IsUpper(ch.Current))
{
Log.Bug("Act.Show: missing argument for {0}", ch.Current);
}
else
{
switch (ch.Current)
{
default:
Log.Bug("Act.Show: bad code {0}", ch.Current);
break;
case 't':
if (arg1 != null)
buf.Append(arg1 as string);
break;
case 'T':
if (arg2 != null)
buf.Append(arg2 as string);
break;
case 'n':
if (player != null)
buf.Append(player.ToString(to));
else
Log.Bug("Bad act code $n");
break;
case 'N':
if (victim != null)
buf.Append(victim.ToString(to));
else
Log.Bug("Bad act code $N");
break;
case 'o':
if (item1 != null)
buf.Append(item1.ToString(to));
break;
case 'O':
if (item2 != null)
buf.Append(item2.ToString(to));
break;
}
}
}
to.WriteLine(buf.ToString());
if (to.Index != null)
{
to.Index.Scripts.HandleTrigger(TriggerType.Act, to, buf.ToString(), player, arg1, arg2);
}
if (to.Room != null)
{
to.Room.Scripts.HandleTrigger(TriggerType.Act, to.Room, buf.ToString(), player, arg1, arg2);
foreach (Item item in to.Room.Items)
{
if (item.Index != null)
item.Index.Scripts.HandleTrigger(TriggerType.Act, item, buf.ToString(), player, arg1, arg2);
}
}
}
#endregion [rgn]
}
/// <summary>
/// Handles displaying text in columns
/// </summary>
public struct Columns
{
/// <summary>
/// Displays a list of objects in columns
/// </summary>
/// <param name="player">the player viewing the columns</param>
/// <param name="columns">the number of columns</param>
/// <param name="width">the width of a column</param>
/// <param name="objects">the list of objects to display in the columns as an array</param>
public static void Show(Player player, ushort columns, ushort width, object[] objects)
{
string format = string.Format("{{0,-{0}}}", width);
for (int i = 0; i < objects.Length; i++)
{
player.Write(format, Color.Convert(objects[i].ToString(), player));
if ((i + 1)%columns == 0 || (i + 1) == objects.Length)
{
player.WriteLine();
}
}
}
}
}