\r
namespace CarFire\r
{\r
+ /// <summary>\r
+ /// The Script class handles the parsing and execution of lists\r
+ /// of functions. Scripts are closely related to triggers.\r
+ /// </summary>\r
public class Script\r
{\r
#region Public Properties\r
\r
+ /// <summary>\r
+ /// Determine if the script is in the process of being run.\r
+ /// </summary>\r
public bool IsRunning { get { return mIsRunning; } }\r
\r
#endregion\r
\r
#region Public Methods\r
\r
- public Script(string code, Game game)\r
+ /// <summary>\r
+ /// Construct a script object with code and a game reference.\r
+ /// </summary>\r
+ /// <param name="code">The script code.</param>\r
+ /// <param name="game">A game reference.</param>\r
+ public Script(string code, object bindings)\r
{\r
- mGame = game;\r
+ mBindings = bindings;\r
\r
string[] functions = Parse.List(code);\r
if (functions != null)\r
else throw new Exception("Script could not be parsed: " + code);\r
}\r
\r
+ /// <summary>\r
+ /// Start execution of the script. If there is no need to break\r
+ /// execution before the script ends, it will finish before this method\r
+ /// call ends. Otherwise, execution will be delayed and will finish sometime\r
+ /// in the future. This will execute each function in sequence as long\r
+ /// as each function evaluates to true. If a function does not evaluate to true,\r
+ /// this method will return and execution will be delayed. In either case,\r
+ /// the evaluation of the last function is returned by this method.\r
+ /// </summary>\r
+ /// <param name="player">The player associated with this script.</param>\r
+ /// <returns>Evaluation of the last function call.</returns>\r
public bool Run(Player player)\r
{\r
bool result = false;\r
return result;\r
}\r
\r
+ public void Reset()\r
+ {\r
+ mIsRunning = false;\r
+\r
+ }\r
+\r
#endregion\r
\r
\r
#region Private Methods\r
\r
+ /// <summary>\r
+ /// Call a function in the last at a certain index.\r
+ /// </summary>\r
+ /// <param name="index">The function index.</param>\r
+ /// <param name="player">The associated player object.</param>\r
+ /// <returns>The evaluation of the function.</returns>\r
bool Call(int index, Player player)\r
{\r
Debug.Assert(0 <= index && index < mFunctions.Count);\r
object[] args = new object[2];\r
args[0] = player;\r
args[1] = mFunctions[index].Arguments;\r
- return (bool)typeof(Impl).InvokeMember(mFunctions[index].Name, BindingFlags.InvokeMethod, null, null, args);\r
+ return (bool)mBindings.GetType().InvokeMember(mFunctions[index].Name, BindingFlags.InvokeMethod, null, mBindings, args);\r
}\r
#pragma warning disable 0168\r
catch (System.MissingMethodException ex)\r
\r
#region Private Types\r
\r
- class Impl\r
- {\r
- public static bool True(Player player, string[] args)\r
- {\r
- return true;\r
- }\r
-\r
- public static bool False(Player player, string[] args)\r
- {\r
- return false;\r
- }\r
-\r
- public static bool Has(Player player, string[] args)\r
- {\r
- return false;\r
- }\r
-\r
- public static bool Print(Player player, string[] args)\r
- {\r
- foreach (string arg in args)\r
- {\r
- string line = Parse.String(arg);\r
- if (line != null) Console.WriteLine(line);\r
- }\r
- return true;\r
- }\r
- }\r
-\r
class Function\r
{\r
public string Name { get { return mName; } }\r
\r
#region Private Variables\r
\r
- Game mGame;\r
+ object mBindings;\r
List<Function> mFunctions = new List<Function>();\r
bool mIsRunning;\r
int mRunningIndex;\r
- Impl mImpl = new Impl();\r
\r
#endregion\r
}\r