#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 Arthea.Abilities.Skills;
using Arthea.Connections.Players;
using Arthea.Environment;
namespace Arthea.Commands
{
/// <summary>
/// Implements a command.
/// </summary>
public abstract class Command
{
#region [rgn] Fields (4)
private string alias = string.Empty;
private string description = string.Empty;
private byte level;
private string name = string.Empty;
#endregion [rgn]
#region [rgn] Constructors (4)
/// <summary>
/// Initializes a new instance of the <see cref="Command"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="desc">The description.</param>
/// <param name="level">The level.</param>
public Command(string name, string desc, byte level)
{
this.name = name;
description = desc;
this.level = level;
}
/// <summary>
/// Initializes a new instance of the <see cref="Command"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="desc">The description.</param>
public Command(string name, string desc)
{
this.name = name;
description = desc;
}
/// <summary>
/// Initializes a new instance of the <see cref="Command"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="level">The level.</param>
public Command(string name, byte level)
{
this.name = name;
this.level = level;
}
/// <summary>
/// Initializes a new instance of the <see cref="Command"/> class.
/// </summary>
/// <param name="name">The name.</param>
public Command(string name)
{
this.name = name;
level = 0;
}
#endregion [rgn]
#region [rgn] Properties (4)
/// <summary>
/// Gets or sets the alias.
/// </summary>
/// <value>The alias.</value>
public string Alias
{
get { return alias; }
set { alias = value; }
}
/// <summary>
/// Gets or sets the description.
/// </summary>
/// <value>The description.</value>
public string Description
{
get { return description; }
set { description = value; }
}
/// <summary>
/// Gets or sets the level.
/// </summary>
/// <value>The level.</value>
public byte Level
{
get { return level; }
set { level = value; }
}
/// <summary>
/// Gets the name.
/// </summary>
/// <value>The name.</value>
public string Name
{
get { return name; }
set { name = value; }
}
#endregion [rgn]
#region [rgn] Methods (4)
// [rgn] Public Methods (4)
/// <summary>
/// Interprets an argument from a player to a command.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="argument">The argument.</param>
public static void Interpret(Player player, String argument)
{
if (argument.Empty())
{
AutoLookCommand.Look(player);
return;
}
String arg;
// allow arguments like "'"
if (!char.IsLetterOrDigit(argument[0]))
{
arg = argument[0].ToString();
argument = argument.Substring(1).Trim();
}
else
{
arg = argument.FirstArg();
}
// check skills
Skill skill = Lists.Abilities.FindSkill(arg);
if (skill != null)
{
Skill.Execute(skill, player, argument);
return;
}
// check socials
if (!Lists.Socials.Parse(player, arg, argument))
{
// finally its a command
Lists.Commands.Lookup(arg, player).Process(player, argument);
}
}
/// <summary>
/// Processes the command for a player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="argument">The argument.</param>
public abstract void Process(Player player, String argument);
/// <summary>
/// Syntaxes of the command displayed to a player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="args">The args.</param>
public void Syntax(Player player, params string[] args)
{
player.WriteLine("Syntax:");
for (int i = 0; i < args.Length; i++)
{
player.WriteLine("{0}: {1}", name, args[i]);
}
}
/// <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()
{
return name;
}
#endregion [rgn]
}
/// <summary>
/// Implements an unknown command.
/// </summary>
public class UnknownCommand : Command
{
#region [rgn] Constructors (1)
/// <summary>
/// Initializes a new instance of the <see cref="UnknownCommand"/> class.
/// </summary>
/// <param name="name">The name.</param>
public UnknownCommand(String name) : base(name.ToString())
{
}
#endregion [rgn]
#region [rgn] Methods (1)
// [rgn] Public Methods (1)
/// <summary>
/// Processes the command for a player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="argument">The argument.</param>
public override void Process(Player player, String argument)
{
player.WriteLine("Huh? What does '{0}' mean?", Name);
}
#endregion [rgn]
}
/// <summary>
/// Implements a restricted command.
/// </summary>
public class RestrictedCommand : Command
{
#region [rgn] Constructors (2)
/// <summary>
/// Initializes a new instance of the <see cref="RestrictedCommand"/> class.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="level">The level.</param>
public RestrictedCommand(String name, byte level) : base(name.ToString(), level)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="RestrictedCommand"/> class.
/// </summary>
/// <param name="name">The name.</param>
public RestrictedCommand(String name) : base(name.ToString())
{
}
#endregion [rgn]
#region [rgn] Methods (1)
// [rgn] Public Methods (1)
/// <summary>
/// Processes the command for a player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="argument">The argument.</param>
public override void Process(Player player, String argument)
{
if (Level == 0)
{
player.WriteLine("You are not allowed to use {0}.", Name);
}
else
{
player.WriteLine("You must be level {0} to use {1}.", Level, Name);
}
}
#endregion [rgn]
}
}