#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.Collections.Generic;
using System.Text;
using Arthea.Connections.Players;
using Arthea.Continents.Areas.Characters;
using Arthea.Creation;
using Arthea.Environment;
using Arthea.Interfaces;
using Arthea.Scripts.Enums;
namespace Arthea.Scripts
{
/// <summary>
/// Implementation of a script list.
/// </summary>
public class ScriptList : List<Script>, CustomEditType
{
#region [rgn] Methods (3)
// [rgn] Public Methods (3)
/// <summary>
/// Adds the specified script.
/// </summary>
/// <param name="script">The script.</param>
public new void Add(Script script)
{
base.Add(script);
if (script.Code != null)
{
script.Code.Attach();
}
}
/// <summary>
/// Handles the trigger.
/// </summary>
/// <param name="trig">The trigger.</param>
/// <param name="from">The object with the script.</param>
/// <param name="phrase">The phrase.</param>
/// <param name="ch">The character who triggered the script.</param>
/// <param name="arg1">The arg1.</param>
/// <param name="arg2">The arg2.</param>
public void HandleTrigger(TriggerType trig, Scriptable from, string phrase, Character ch, object arg1,
object arg2)
{
foreach (Script script in this)
{
if (script.Type == trig && phrase.Contains(phrase))
{
script.Interpret(from, ch, arg1, arg2);
}
}
}
/// <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()
{
if (Count == 0)
return "none";
StringBuilder buf = new StringBuilder();
buf.AppendLine();
buf.AppendLine(" Type Id Trigger");
buf.AppendLine("----------------------------------");
for (int i = 0; i < Count; i++)
{
buf.AppendFormat("{0,3}) ", i + 1);
buf.AppendFormat("{0,-8} {1,-4} {2}",
this[i].Type, this[i].Code.Id, this[i].Trigger);
}
return buf.ToString();
}
#endregion [rgn]
#region CustomEditType Members
/// <summary>
/// Allows custom editing of this type by player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="editor">The editor values.</param>
/// <param name="argument">The argument.</param>
public void CustomEdit(Player player, OlcField editor, String argument)
{
String arg = argument.FirstArg();
switch (arg)
{
case "create":
Scriptable from;
if (!(editor.BaseObj is Scriptable) || (from = (editor.BaseObj as Scriptable)) == null)
{
player.WriteLine("You cannot create scripts for a {0}.", editor.Obj.GetType().Name.ToLower());
return;
}
ScriptCode code = new ScriptCode();
code.Id = ScriptCode.GetNextId();
Script script = from.CreateScript(code, argument);
Add(script);
player.Connection.Edit(script);
return;
case "delete":
player.WriteLine("Function not implemented yet.");
return;
case "add":
if (!(editor.BaseObj is Scriptable) || (from = (editor.BaseObj as Scriptable)) == null)
{
player.WriteLine("You cannot create scripts for a {0}.", editor.Obj.GetType().Name.ToLower());
return;
}
uint scriptId;
arg = argument.FirstArg();
if (!uint.TryParse(arg, out scriptId))
{
player.WriteLine("Invalid script code id.");
return;
}
code = Lists.Scripts[scriptId];
if (code == null)
{
player.WriteLine("No such script code");
return;
}
script = from.CreateScript(code, argument);
Add(script);
player.WriteLine("Script code added.");
return;
case "remove":
int num;
if (!int.TryParse(argument, out num))
{
player.WriteLine("Delete which script? (provide a number)");
return;
}
if (num < 1 || num > Count)
{
player.WriteLine("No such script.");
return;
}
RemoveAt(num - 1);
player.WriteLine("Script removed.");
return;
default:
player.WriteLine("Syntax: {0} create|delete|add|remove", editor.Name);
return;
}
}
#endregion
}
}