muddesigner/MudEngine/WinPC_Engine/Scripting/ScriptFactory.cs
Scionwest_cp 8639403255 DataPaths now have values for the games Root directory and Script directory.
DataPath class is now completed and includes a new SetExtension() method for setting game object file extensions.
Scripting support fully implemented.
StandardGame now contains a Initialize() method for compiling scripts and searching for sub-classes of StandardGame
Server app will now use a Scripted game class instead of the default StandardGame if one is present.
StandardGame.Start() is now virtual so child classes can override it.
Sample Game script created to show how to create a custom game script, including how to setup the game and create Rooms pragamatically.
ScriptFactory has a new method for searching all scripts and scripts that inherit from a specified class.
Renamed all of the Command scripts.  They no longer start with 'Command'.  Example: "CommandSay" has now become "Say".  There is no need to preceed the command name with the word "Command" anymore.
2012-03-05 20:30:54 -08:00

187 lines
5.7 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using MudEngine.Core;
using MudEngine.Game;
using MudEngine.GameScripts;
namespace MudEngine.Scripting
{
public class ScriptFactory
{
public Assembly Assembly { get; private set; }
//The assembly loaded that will be used.
private List<Assembly> _AssemblyCollection;
#if WINDOWS_PC
/// <summary>
/// Constructor for a Windows PC Script Factory
/// </summary>
/// <param name="assembly"></param>
public ScriptFactory(String assembly)
{
Assembly a;
_AssemblyCollection = new List<Assembly>();
//See if a file exists first with this assembly name.
if (File.Exists(assembly))
{
a = Assembly.Load(new AssemblyName(assembly));
}
//If not, then try and load it differently
else
{
a = Assembly.Load(assembly);
}
if (a == null)
return;
//Add the assembly to our assembly collection.
_AssemblyCollection.Add(a);
}
/// <summary>
/// Alternate Constructor for a Windows PC ScriptFactory
/// </summary>
/// <param name="assembly"></param>
public ScriptFactory(Assembly assembly)
{
_AssemblyCollection = new List<Assembly>();
//Add the supplied assembly to our AssemblyCollection
_AssemblyCollection.Add(assembly);
this.Assembly = assembly;
}
#endif
/// <summary>
/// Adds another assembly to the factories assembly collection.
/// </summary>
/// <param name="assembly">provides the name of the assembly, or file name that needs to be loaded.</param>
public void AddAssembly(String assembly)
{
Assembly a;
//See if a file exists first with this assembly name.
if (File.Exists(assembly))
{
a = Assembly.Load(new AssemblyName(assembly));
}
//If not, then try and load it differently
else
{
a = Assembly.Load(assembly);
}
//Add the assembly to our assembly collection.
_AssemblyCollection.Add(a);
}
/// <summary>
/// Adds another assembly to the factories assembly collection.
/// </summary>
/// <param name="assembly">Provides a reference to the assembly that will be added to the collection.</param>
public void AddAssembly(Assembly assembly)
{
//Add the supplied assembly to our AssemblyCollection
_AssemblyCollection.Add(assembly);
}
public BaseScript GetScript(String scriptName, StandardGame game)
{
Type script = typeof(Object);
Boolean foundScript = false;
if (_AssemblyCollection.Count == 0)
return new BaseScript(game, "New Object", String.Empty);
try
{
foreach (Assembly a in _AssemblyCollection)
{
//The assembly can be null if accessing after a failed compilation.
if (a == null)
continue;
foreach (Type t in a.GetTypes())
{
if (t.Name == scriptName)
{
script = t;
foundScript = true;
break;
}
}
if (foundScript)
break;
}
}
catch
{
throw new Exception("Error encounted during factory instancing of script " + scriptName + ".");
}
try
{
BaseScript obj = (BaseScript)Activator.CreateInstance(script, game, "New Object", String.Empty);
return obj;
}
catch
{
Logger.WriteLine("ERROR: Failed to locate and instance script (" + scriptName + ")");
return new BaseScript(game, "New Object", String.Empty);
}
}
public Object FindInheritedScripted(String baseScript, params Object[] arguments)
{
Type script = typeof(BaseScript);
Boolean foundScript = false;
if (this._AssemblyCollection.Count == 0)
return null;
try
{
foreach (Assembly a in _AssemblyCollection)
{
if (a == null)
continue;
foreach (Type t in a.GetTypes())
{
if (t.BaseType.Name == baseScript)
{
script = t;
foundScript = true;
break;
}
}
if (foundScript)
break;
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
try
{
Object obj = Activator.CreateInstance(script, arguments);
return obj;
}
catch
{
return null;
}
}
}
}