#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.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using Arthea.Abilities.Skills;
using Arthea.Clans;
using Arthea.Classes;
using Arthea.Commands;
using Arthea.Commands.Admin;
using Arthea.Connections.Colors;
using Arthea.Continents.Areas;
using Arthea.Continents.Areas.Characters;
using Arthea.Creation;
using Arthea.Creation.Attributes;
using Arthea.Environment;
using Arthea.Interfaces;
namespace Arthea.Connections.Players
{
/// <summary>
/// Implements a player
/// </summary>
public class Player : Character
{
#region [rgn] Fields (13)
private Clan clan;
[EditIgnore] private Color[] colors = CustomColor.CreateColorArray();
private PlayerConfig config = new PlayerConfig(PlayerConfig.Color);
[EditIgnore] private Connection connection;
private int experience;
private SkillValues learned = new SkillValues();
private DateTime login = DateTime.Now;
private string password;
private TimeSpan played = new TimeSpan();
private PowerList powers = new PowerList();
private string prompt;
private PlayerStats stats = new PlayerStats();
private string title;
#endregion [rgn]
#region [rgn] Constructors (2)
/// <summary>
/// Initializes a new instance of the <see cref="Player"/> class.
/// </summary>
/// <param name="conn">The conn.</param>
/// <param name="name">The name.</param>
public Player(Connection conn, String name) : base(0, name)
{
connection = conn;
initialize();
}
/// <summary>
/// Initializes a new instance of the <see cref="Player"/> class.
/// </summary>
public Player()
{
initialize();
}
#endregion [rgn]
#region [rgn] Properties (22)
/// <summary>
/// Gets the area.
/// </summary>
/// <value>The area.</value>
public override Area Area
{
get { return Room.Area; }
}
/// <summary>
/// Gets or sets the clan.
/// </summary>
/// <value>The clan.</value>
[XmlIgnore]
public Clan Clan
{
get { return clan; }
set
{
if (value == null && clan != null)
{
clan.Members.Remove(this);
}
clan = value;
if (value != null)
{
clan.Members.Add(this);
}
}
}
/// <summary>
/// Gets or sets the class.
/// </summary>
/// <value>The class.</value>
[XmlIgnore]
public Class Class
{
get { return @class; }
set { @class = value; }
}
/// <summary>
/// Gets or sets the colors.
/// </summary>
/// <value>The colors.</value>
[XmlIgnore]
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
/// <summary>
/// Gets or sets the config.
/// </summary>
/// <value>The config.</value>
public PlayerConfig Config
{
get { return config; }
set { config = value; }
}
/// <summary>
/// Gets or sets the connection.
/// </summary>
/// <value>The connection.</value>
[XmlIgnore]
public Connection Connection
{
get { return connection; }
set { connection = value; }
}
/// <summary>
/// Gets or sets the experience.
/// </summary>
/// <value>The experience.</value>
public int Experience
{
get { return experience; }
set { experience = value; }
}
/// <summary>
/// Gets or sets learned skills.
/// </summary>
/// <value>The list of learned skills.</value>
public SkillValues Learned
{
get { return learned; }
set { learned = value; }
}
/// <summary>
/// Gets or sets the login.
/// </summary>
/// <value>The login.</value>
public DateTime Login
{
get { return login; }
set { login = value; }
}
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>The password.</value>
public string Password
{
get { return password; }
set { password = value; }
}
/// <summary>
/// Gets or sets the time played.
/// </summary>
/// <value>The time played.</value>
public TimeSpan Played
{
get { return played; }
set { played = value; }
}
/// <summary>
/// Gets or sets the powers.
/// </summary>
/// <value>The powers.</value>
public PowerList Powers
{
get { return powers; }
set { powers = value; }
}
/// <summary>
/// Gets or sets the prompt.
/// </summary>
/// <value>The prompt.</value>
public string Prompt
{
get { return prompt; }
set { prompt = value; }
}
/// <summary>
/// Gets the room descr.
/// </summary>
/// <value>The room descr.</value>
[XmlIgnore]
public override string RoomDescr
{
get
{
return string.Format("{0}{1} is here.",
Config.Has(PlayerConfig.AFK) ? "(AFK) " : "", Name);
}
}
/// <summary>
/// Gets or sets the screen height
/// Will not set if NAWS has been detected.
/// </summary>
/// <value>the screen height</value>
[XmlElement("ScreenHeight", typeof (int))]
public int ScreenHeight
{
get { return connection.ScreenHeight; }
set
{
if (connection != null && !connection.Flags.Has(ConnectionFlags.NAWS))
connection.ScreenHeight = value;
}
}
/// <summary>
/// Gets ot sets the screen width
/// Will not set if NAWS has been detected.
/// </summary>
/// <value>the screen width</value>
[XmlElement("ScreenWidth", typeof (int))]
public int ScreenWidth
{
get { return connection.ScreenWidth; }
set
{
if (connection != null && !connection.Flags.Has(ConnectionFlags.NAWS))
connection.ScreenWidth = value;
}
}
/// <summary>
/// Gets the short descr.
/// </summary>
/// <value>The short descr.</value>
[XmlIgnore]
public override string ShortDescr
{
get { return Name; }
}
/// <summary>
/// Gets or sets the stats.
/// </summary>
/// <value>The stats.</value>
public PlayerStats Stats
{
get { return stats; }
set { stats = value; }
}
/// <summary>
/// Gets or sets the title.
/// </summary>
/// <value>The title.</value>
public string Title
{
get { return title; }
set { title = value; }
}
/// <summary>
/// Gets or sets the clan name
/// </summary>
/// <value>The clan name.</value>
[XmlElement("Clan")]
public string XmlClan
{
get { return clan == null ? "" : clan.Name; }
set { clan = Lists.Clans.FindName(value); }
}
/// <summary>
/// Gets or sets the class as a string.
/// </summary>
/// <value>The class as a string.</value>
[XmlElement("Class")]
public string XmlClass
{
get { return (@class != null) ? @class.ToString() : ""; }
set { @class = Lists.Classes.FindName(value); }
}
/// <summary>
/// Gets or sets the XML colors.
/// </summary>
/// <value>The XML colors.</value>
[XmlElement("CustomColors")]
public string XmlColors
{
get
{
StringBuilder buf = new StringBuilder();
for (int i = 0; i < colors.Length; i++)
{
if (i != 0)
buf.Append(",");
buf.Append(colors[i].ToString(0));
}
return buf.ToString();
}
set
{
string[] values = value.Split(',');
for (int i = 0; i < values.Length; i++)
{
colors[i] = Color.Parse(values[i]);
}
}
}
#endregion [rgn]
#region [rgn] Methods (9)
// [rgn] Public Methods (8)
/// <summary>
/// Attaches this instance to applicable lists.
/// </summary>
public override void Attach()
{
base.Attach();
Lists.Players.Add(this);
}
/// <summary>
/// Determines whether this instance [can gain level].
/// </summary>
/// <returns>
/// <c>true</c> if this instance [can gain level]; otherwise, <c>false</c>.
/// </returns>
public bool CanGainLevel()
{
return false;
}
/// <summary>
/// Displays a prompt.
/// </summary>
public void DisplayPrompt()
{
if (Connection.Composing != null)
{
Write("Enter a line of text (/h for help):");
}
else if (string.IsNullOrEmpty(prompt))
{
if (Connection.Editing == null)
Write("> ");
else
Write("{0}> ", Connection.Editing);
}
else if (!prompt.Contains("%"))
{
Write("{0} ", prompt);
}
else
{
StringBuilder buf = new StringBuilder();
for (IEnumerator<char> ch = prompt.GetEnumerator(); ch.MoveNext();)
{
if (ch.Current != '%')
{
buf.Append(ch.Current);
continue;
}
if (!ch.MoveNext())
break;
switch (ch.Current)
{
case 'E':
if (Connection.Editing != null)
buf.Append(Connection.Editing);
break;
case 'R':
buf.Append(Room.ToString(this));
break;
case 'A':
buf.Append(Room.Area);
break;
default:
Log.Bug("DisplayPrompt: Bad format %{0}.", ch);
break;
}
}
buf.Append(" ");
Write(buf.ToString());
}
Connection.SentPrompt = true;
}
/// <summary>
/// Draws a line.
/// </summary>
public void DrawLine()
{
StringBuilder buf = new StringBuilder();
for (int i = 0; i < 80; i++)
{
buf.Append("-");
}
WriteLine(buf.ToString());
}
/// <summary>
/// Loads the specified name.
/// </summary>
/// <param name="name">The name.</param>
/// <returns></returns>
public static Player Load(string name)
{
return Persistance.Load<Player>(Paths.PlayerDir + name);
}
/// <summary>
/// Removes character from lists
/// </summary>
public override void Release()
{
base.Release();
Lists.Players.Remove(this);
}
/// <summary>
/// Saves this instance.
/// </summary>
public void Save()
{
Persistance.Save(Paths.PlayerDir + Name, this);
}
/// <summary>
/// A string representation of a player.
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Name;
}
// [rgn] Private Methods (1)
/// <summary>
/// Inits the player.
/// </summary>
private void initialize()
{
RoomDescrSpecified = false;
ShortDescrSpecified = false;
XmlIndexSpecified = false;
}
#endregion [rgn]
private Class @class;
#region Write Methods
/// <summary>
/// Writes the specified text.
/// </summary>
/// <param name="text">The text.</param>
public override void Write(string text)
{
connection.Write(text);
}
/// <summary>
/// Writes the specified text.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="args">The args.</param>
public override void Write(string text, params object[] args)
{
connection.Write(text, args);
}
/// <summary>
/// Writes a line.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="args">The args.</param>
public override void WriteLine(string text, params object[] args)
{
connection.WriteLine(text, args);
}
/// <summary>
/// Writes an object.
/// </summary>
/// <param name="obj">The obj.</param>
public void WriteLine(object obj)
{
connection.WriteLine(obj.ToString());
}
/// <summary>
/// Writes a line.
/// </summary>
public override void WriteLine()
{
connection.WriteLine();
}
#endregion
}
/// <summary>
/// Implements a power list
/// </summary>
public class PowerList : List<string>, CustomEditType
{
#region [rgn] Properties (2)
/// <summary>
/// Gets the <see cref="System.Boolean"/> with the specified power.
/// </summary>
/// <value>true if power is contained</value>
public bool this[Powers power]
{
get { return Contains(power.ToString().ToLower()); }
}
/// <summary>
/// Gets the <see cref="System.Boolean"/> with the specified CMD.
/// </summary>
/// <value>true if cmd is contained</value>
public bool this[Command cmd]
{
get { return Contains(cmd.Name); }
}
#endregion [rgn]
#region [rgn] Methods (6)
// [rgn] Public Methods (6)
/// <summary>
/// Sets the value of this instance.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="editer">Information from the editer.</param>
/// <param name="argument">The argument.</param>
public void CustomEdit(Player player, OlcField editer, String argument)
{
try
{
Powers power = (Powers) Enum.Parse(typeof (Powers), argument, true);
Add(power);
player.WriteLine("{0}: {1} set.", editer.Name, power);
}
catch
{
Command cmd = Lists.Commands.FindName(argument);
if (cmd == null || cmd.Level != Levels.Admin)
{
player.WriteLine("That is not an admin command.");
GrantCommand.ValidPowers(player);
return;
}
Add(cmd);
player.WriteLine("{0}: {1} set.", editer.Name, cmd);
}
}
/// <summary>
/// Adds the specified power.
/// </summary>
/// <param name="power">The power.</param>
public void Add(Powers power)
{
Add(power.ToString().ToLower());
}
/// <summary>
/// Adds the specified command.
/// </summary>
/// <param name="cmd">The command.</param>
public void Add(Command cmd)
{
Add(cmd.Name.ToLower());
}
/// <summary>
/// Removes the specified power.
/// </summary>
/// <param name="power">The power.</param>
/// <returns>true if sucessful</returns>
public bool Remove(Powers power)
{
return Remove(power.ToString().ToLower());
}
/// <summary>
/// Removes the specified command.
/// </summary>
/// <param name="cmd">The command.</param>
/// <returns>true if succesful.</returns>
public bool Remove(Command cmd)
{
return Remove(cmd.Name.ToLower());
}
/// <summary>
/// Returns a <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
/// </summary>
/// <returns>
/// A <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
/// </returns>
public override string ToString()
{
StringBuilder buf = new StringBuilder();
foreach (string str in this)
{
buf.Append(str);
buf.Append(",");
}
if (buf.Length > 0)
buf.Remove(buf.Length - 1, 1);
return buf.ToString();
}
#endregion [rgn]
}
}