diff --git a/MudEngine/Attributes/ParseProperty.cs b/MudEngine/Attributes/ParseProperty.cs
new file mode 100644
index 0000000..f56e43f
--- /dev/null
+++ b/MudEngine/Attributes/ParseProperty.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Reflection;
+using System.ComponentModel;
+namespace MudEngine.Attributes
+{
+ [System.AttributeUsage(System.AttributeTargets.Property)]
+ public class ParseProperty
+ : System.Attribute
+ {
+ Object obj;
+
+ public ParseProperty(Object var)
+ {
+ obj = var;
+ }
+
+ public object GetObject()
+ {
+ return obj;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/MudEngine/GameObjects/BaseObject.cs b/MudEngine/GameObjects/BaseObject.cs
index 005477f..8249cb8 100644
--- a/MudEngine/GameObjects/BaseObject.cs
+++ b/MudEngine/GameObjects/BaseObject.cs
@@ -4,14 +4,17 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
+using System.Reflection;
using System.Xml.Serialization;
using System.IO;
-using System.Reflection;
//MUD Engine
using MudEngine.FileSystem;
using MudEngine.GameManagement;
+using rScripting;
+using rScripting.LateBinding;
+
namespace MudEngine.GameObjects
{
public class BaseObject
@@ -175,6 +178,43 @@ namespace MudEngine.GameObjects
{
}
+ public virtual void NewSave()
+ {
+ ScriptObject obj = new ScriptObject(this);
+ PropertyInfo[] prop = this.GetType().GetProperties();
+
+ string path = this.SavePath;
+
+ if (String.IsNullOrEmpty(path))
+ return;
+
+ if (!Directory.Exists(path))
+ Directory.CreateDirectory(path);
+
+ string filename = Path.Combine(path, Filename);
+
+ if (File.Exists(filename))
+ File.Delete(filename);
+
+ foreach (var p in prop)
+ {
+ object[] attributes = p.GetCustomAttributes(typeof(MudEngine.Attributes.ParseProperty), false);
+
+ foreach (Attribute a in attributes)
+ {
+ if (a.GetType().Name == "ParseProperty")
+ {
+ ParseProperty(p);
+ }
+ }
+ FileManager.WriteLine(filename, obj.GetProperty(p.Name).ToString(), p.Name);
+ }
+ }
+
+ private void ParseProperty(PropertyInfo propety)
+ {
+ }
+
public virtual void Save()
{
string path = this.SavePath;
diff --git a/MudEngine/GameObjects/Characters/BaseCharacter.cs b/MudEngine/GameObjects/Characters/BaseCharacter.cs
index 6e23f2c..156499d 100644
--- a/MudEngine/GameObjects/Characters/BaseCharacter.cs
+++ b/MudEngine/GameObjects/Characters/BaseCharacter.cs
@@ -1,496 +1,499 @@
- //Microsoft .NET Framework
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.IO;
+//Microsoft .NET Framework
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
- //MUD Engine
- using MudEngine.FileSystem;
- using MudEngine.Commands;
- using MudEngine.GameManagement;
- using MudEngine.GameObjects;
- using MudEngine.GameObjects.Environment;
- using MudEngine.GameObjects.Items;
+//MUD Engine
+using MudEngine.Attributes;
+using MudEngine.FileSystem;
+using MudEngine.Commands;
+using MudEngine.GameManagement;
+using MudEngine.GameObjects;
+using MudEngine.GameObjects.Environment;
+using MudEngine.GameObjects.Items;
- using System.Net;
- using System.Net.Sockets;
+using System.Net;
+using System.Net.Sockets;
- namespace MudEngine.GameObjects.Characters
+namespace MudEngine.GameObjects.Characters
+{
+ public class BaseCharacter : BaseObject
{
- public class BaseCharacter : BaseObject
+ ///
+ /// Password for the player's account.
+ ///
+ private String Password { get; set; }
+
+ ///
+ /// The last time that the AI (if IsControlled=false) performed any major changes like traversing Rooms etc.
+ ///
+ private GameTime.Time _LastUpdate;
+
+ ///
+ /// Gets or Sets if the AI (if IsControlled=false) cannot move from it's CurrentRoom.
+ /// This is used by Shop keeper type NPC's
+ ///
+ public Boolean IsStatic { get; set; }
+
+ ///
+ /// The current Room this Character is located at.
+ ///
+ [ParseProperty(typeof(Room))]
+ public Room CurrentRoom { get; set; }
+
+ ///
+ /// Gets the complete path to the Characters current location, including Realm, Zone and Room.
+ ///
+ public String CurrentWorldLocation
{
- ///
- /// Password for the player's account.
- ///
- private String Password { get; set; }
-
- ///
- /// The last time that the AI (if IsControlled=false) performed any major changes like traversing Rooms etc.
- ///
- private GameTime.Time _LastUpdate;
-
- ///
- /// Gets or Sets if the AI (if IsControlled=false) cannot move from it's CurrentRoom.
- /// This is used by Shop keeper type NPC's
- ///
- public Boolean IsStatic { get; set; }
-
- ///
- /// The current Room this Character is located at.
- ///
- public Room CurrentRoom { get; set; }
-
- ///
- /// Gets the complete path to the Characters current location, including Realm, Zone and Room.
- ///
- public String CurrentWorldLocation
+ get
{
- get
+ return CurrentRoom.Realm + "." + CurrentRoom.Zone + "." + CurrentRoom.Filename;
+ }
+ }
+
+ protected override string SavePath
+ {
+ get
+ {
+ return ActiveGame.DataPaths.Players;
+ }
+ }
+ ///
+ /// Gets or Sets if this Character is controlled by the user. If not user controlled then it will be AI controlled.
+ ///
+ public Boolean IsControlled
+ {
+ get
+ {
+ return _IsControlled;
+ }
+ set
+ {
+ if (value)
{
- return CurrentRoom.Realm + "." + CurrentRoom.Zone + "." + CurrentRoom.Filename;
+ //TODO: Begin AI initialization
+ }
+ _IsControlled = value;
+ }
+ }
+ private Boolean _IsControlled;
+
+ ///
+ /// Gets if this user has Admin privileges or not.
+ ///
+ public SecurityRoles Role { get; private set; }
+
+ ///
+ /// Gets or if this character is active.
+ ///
+ public Boolean IsActive { get; internal set; }
+
+ ///
+ /// Gets the current inventory of the character
+ ///
+ public Bag Inventory { get; private set; }
+
+ ///
+ /// Gets the characters Dialog Branch.
+ /// If the Character contains Quests, then the Dialog will only be visible when the Quests are not available
+ /// to the users.
+ ///
+ public DialogChat Dialog { get; internal set; }
+
+ ///
+ /// Gets a working copy of the CommandEngine used by the player.
+ ///
+ public CommandEngine CommandSystem { get; internal set; }
+
+ ///
+ /// Gets or Sets the characters stats.
+ /// Note that this will more and likely become Read-Only in the future.
+ ///
+ public BaseStats Stats { get; set; }
+
+ public BaseCharacter(Game game)
+ : base(game)
+ {
+ ActiveGame = game;
+ IsActive = false;
+
+ if ((game.InitialRealm == null) || (game.InitialRealm.InitialZone == null) || (game.InitialRealm.InitialZone.InitialRoom == null))
+ {
+ CurrentRoom = new Room(game);
+ CurrentRoom.Name = "Abyss";
+ CurrentRoom.Description = "You are currently in the abyss.";
+ }
+ else
+ CurrentRoom = game.InitialRealm.InitialZone.InitialRoom;
+ Inventory = new Bag(game);
+ CommandSystem = new CommandEngine();
+ }
+
+ public override void Load(String filename)
+ {
+ base.Load(filename);
+
+ Password = FileManager.GetData(filename, "Password");
+ this.IsControlled = Convert.ToBoolean(FileManager.GetData(filename, "IsControlled"));
+
+ //Need to re-assign the enumerator value that was previously assigned to the Role property
+ Array values = Enum.GetValues(typeof(SecurityRoles));
+ foreach (Int32 value in values)
+ {
+ //Since enum values are not strings, we can't simply just assign the String to the enum
+ String displayName = Enum.GetName(typeof(SecurityRoles), value);
+
+ //If the value = the String saved, then perform the needed conversion to get our data back
+ if (displayName.ToLower() == FileManager.GetData(filename, "Role").ToLower())
+ {
+ Role = (SecurityRoles)Enum.Parse(typeof(SecurityRoles), displayName);
+ break;
}
}
- protected override string SavePath
+ //Restore the users current Room.
+ Realm realm = (Realm)ActiveGame.World.GetRealm(FileManager.GetData(filename, "CurrentRealm"));
+
+ if (realm == null)
{
- get
- {
- return ActiveGame.DataPaths.Players;
- }
+ realm = new Realm(ActiveGame);
+ return;
}
- ///
- /// Gets or Sets if this Character is controlled by the user. If not user controlled then it will be AI controlled.
- ///
- public Boolean IsControlled
+
+ List zones = realm.GetZone(FileManager.GetData(filename, "CurrentZone"));
+ Zone zone = new Zone(ActiveGame);
+ if (zones.Count == 0)
{
- get
+ Log.Write("Error: Failed to find " + FileManager.GetData(filename, "CurrentZone") + " zone.");
+ return;
+ }
+ else if (zones.Count == 1)
+ {
+ zone = zones[0];
+ }
+ else
+ {
+ //TODO: determin which zone is the appropriate zone to assign if more than one exists.
+ foreach (Zone z in zones)
{
- return _IsControlled;
- }
- set
- {
- if (value)
+ if (z.GetRoom(FileManager.GetData(filename, "CurrentRoom")) != null)
{
- //TODO: Begin AI initialization
- }
- _IsControlled = value;
- }
- }
- private Boolean _IsControlled;
-
- ///
- /// Gets if this user has Admin privileges or not.
- ///
- public SecurityRoles Role { get; private set; }
-
- ///
- /// Gets or if this character is active.
- ///
- public Boolean IsActive { get; internal set; }
-
- ///
- /// Gets the current inventory of the character
- ///
- public Bag Inventory { get; private set; }
-
- ///
- /// Gets the characters Dialog Branch.
- /// If the Character contains Quests, then the Dialog will only be visible when the Quests are not available
- /// to the users.
- ///
- public DialogChat Dialog { get; internal set; }
-
- ///
- /// Gets a working copy of the CommandEngine used by the player.
- ///
- public CommandEngine CommandSystem { get; internal set; }
-
- ///
- /// Gets or Sets the characters stats.
- /// Note that this will more and likely become Read-Only in the future.
- ///
- public BaseStats Stats { get; set; }
-
- public BaseCharacter(Game game) : base(game)
- {
- ActiveGame = game;
- IsActive = false;
-
- if ((game.InitialRealm == null) || (game.InitialRealm.InitialZone == null) || (game.InitialRealm.InitialZone.InitialRoom == null))
- {
- CurrentRoom = new Room(game);
- CurrentRoom.Name = "Abyss";
- CurrentRoom.Description = "You are currently in the abyss.";
- }
- else
- CurrentRoom = game.InitialRealm.InitialZone.InitialRoom;
- Inventory = new Bag(game);
- CommandSystem = new CommandEngine();
- }
-
- public override void Load(String filename)
- {
- base.Load(filename);
-
- Password = FileManager.GetData(filename, "Password");
- this.IsControlled = Convert.ToBoolean(FileManager.GetData(filename, "IsControlled"));
-
- //Need to re-assign the enumerator value that was previously assigned to the Role property
- Array values = Enum.GetValues(typeof(SecurityRoles));
- foreach (Int32 value in values)
- {
- //Since enum values are not strings, we can't simply just assign the String to the enum
- String displayName = Enum.GetName(typeof(SecurityRoles), value);
-
- //If the value = the String saved, then perform the needed conversion to get our data back
- if (displayName.ToLower() == FileManager.GetData(filename, "Role").ToLower())
- {
- Role = (SecurityRoles)Enum.Parse(typeof(SecurityRoles), displayName);
+ zone = z;
break;
}
}
-
- //Restore the users current Room.
- Realm realm = (Realm)ActiveGame.World.GetRealm(FileManager.GetData(filename, "CurrentRealm"));
-
- if (realm == null)
- {
- realm = new Realm(ActiveGame);
- return;
- }
-
- List zones = realm.GetZone(FileManager.GetData(filename, "CurrentZone"));
- Zone zone = new Zone(ActiveGame);
- if (zones.Count == 0)
- {
- Log.Write("Error: Failed to find " + FileManager.GetData(filename, "CurrentZone") + " zone.");
- return;
- }
- else if (zones.Count == 1)
- {
- zone = zones[0];
- }
- else
- {
- //TODO: determin which zone is the appropriate zone to assign if more than one exists.
- foreach (Zone z in zones)
- {
- if (z.GetRoom(FileManager.GetData(filename, "CurrentRoom")) != null)
- {
- zone = z;
- break;
- }
- }
- }
-
- List rooms = zone.GetRoom(FileManager.GetData(filename, "CurrentRoom"));
-
- if (rooms.Count == 0)
- {
- Log.Write("Error: Failed to find " + FileManager.GetData(filename, "CurrentRoom") + " room.");
- return;
- }
- else if (rooms.Count == 1)
- {
- CurrentRoom = rooms[0];
- }
- else
- {
- //TODO: Loop through each found room and determin in some manor what should be the correct Room to assign.
- }
-
- if (CurrentRoom == null)
- {
- CurrentRoom = new Room(ActiveGame);
- CurrentRoom.Name = "Abyss";
- CurrentRoom.Description = "You are in the Aybss. It is void of all life.";
- return;
- }
-
- //TODO: Load player Inventory.
- /* Due to private accessor Inv needs to be restored via
- * foreach (Item in Inventory)
- * this.AddItem(Item);
- */
}
- public override void Save()
+ List rooms = zone.GetRoom(FileManager.GetData(filename, "CurrentRoom"));
+
+ if (rooms.Count == 0)
{
- base.Save();
-
- String path = Path.Combine(SavePath, Filename);
-
- FileManager.WriteLine(path, this.Password, "Password");
- FileManager.WriteLine(path, this.IsControlled.ToString(), "IsControlled");
- FileManager.WriteLine(path, this.Role.ToString(), "Role");
- FileManager.WriteLine(path, this.CurrentRoom.Filename, "CurrentRoom");
- FileManager.WriteLine(path, this.CurrentRoom.Zone, "CurrentZone");
- FileManager.WriteLine(path, this.CurrentRoom.Realm, "CurrentRealm");
+ Log.Write("Error: Failed to find " + FileManager.GetData(filename, "CurrentRoom") + " room.");
+ return;
}
-
- public virtual void Update()
+ else if (rooms.Count == 1)
{
- //TODO: Update AI logic.
-
- Log.Write("BaseCharacter.Update Called!", true);
- //TODO: AI Logic: Don't attack anything if CurrentRoom.IsSafe
- //TODO: Add Stat modifiers for Zone and Rooms.
+ CurrentRoom = rooms[0];
}
-
- ///
- /// Moves the player from one Room to another if the supplied direction contains a doorway.
- /// Returns false if no doorway is available.
- ///
- ///
- ///
- public Boolean Move(AvailableTravelDirections travelDirection)
+ else
{
- //Check if the current room has a doorway in the supplied direction of travel.
- if (!CurrentRoom.DoorwayExist(travelDirection))
- {
- return false;
- }
-
- //Let other players know that the user walked out.
- for (Int32 i = 0; i != ActiveGame.GetPlayerCollection().Length; i++)
- {
- if (ActiveGame.GetPlayerCollection()[i].Name == Name)
- continue;
-
- String room = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Filename;
- String realm = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Realm;
- String zone = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Zone;
-
- if ((room == CurrentRoom.Filename) && (realm == CurrentRoom.Realm) && (zone == CurrentRoom.Zone))
- {
- ActiveGame.GetPlayerCollection()[i].Send(Name + " walked out towards the " + travelDirection.ToString());
- }
- }
-
- //We have a doorway, lets move to the next room.
- CurrentRoom = CurrentRoom.GetDoor(travelDirection).ArrivalRoom;
-
- OnTravel(travelDirection);
-
- return true;
+ //TODO: Loop through each found room and determin in some manor what should be the correct Room to assign.
}
- public virtual void OnTravel(AvailableTravelDirections travelDirection)
+ if (CurrentRoom == null)
{
- //TODO: Check the Room/Zone/Realm to see if anything needs to occure during travel.
- //Let other players know that the user walked in.
- for (Int32 i = 0; i != ActiveGame.GetPlayerCollection().Length; i++)
- {
- if (ActiveGame.GetPlayerCollection()[i].Name == Name)
- continue;
-
- String room = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Name;
- String realm = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Realm;
- String zone = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Zone;
-
- if ((room == CurrentRoom.Name) && (realm == CurrentRoom.Realm) && (zone == CurrentRoom.Zone))
- {
- ActiveGame.GetPlayerCollection()[i].Send(Name + " walked in from the " + TravelDirections.GetReverseDirection(travelDirection));
- }
- }
+ CurrentRoom = new Room(ActiveGame);
+ CurrentRoom.Name = "Abyss";
+ CurrentRoom.Description = "You are in the Aybss. It is void of all life.";
+ return;
}
- public virtual void OnTalk(String message, BaseCharacter instigator)
- {
- //If the instigator is not sending a message to this character, then the
- //AI can ignore it. No response will be sent.
- if (!message.ToLower().Substring("say".Length).Trim().Contains(this.Name.ToLower()))
- return;
-
- //If the message was directed at this player, we will only respond
- //if this character is controlled by AI.
- if (!this.IsControlled)
- {
- //Instance a new Say command, and send the dialog response that we have saved.
- IGameCommand cmd = CommandEngine.GetCommand("Say");
- if (cmd != null)
- cmd.Execute("say " + this.Dialog.Response, instigator);
- }
- }
-
- public void ExecuteCommand(String command)
- {
- CommandSystem.ExecuteCommand(command, this);
-
- Send(""); //Blank line to help readability.
-
- //Now that the command has been executed, restore the Command: message
- Send("Command: ", false);
- }
-
- public virtual void Create(string playerName, string password)
- {
- Name = playerName;
- Password = password;
-
- Save();
- }
-
- public bool VarifyPassword(string password)
- {
- if (Password == password)
- return true;
- else
- return false;
- }
-
- public virtual void Initialize()
- {
- if (ActiveGame.IsMultiplayer)
- client.Receive(new byte[255]);
-
- //Ensure custom commands are loaded until everything is fleshed out.
- if (Game.IsDebug)
- {
- foreach (String command in CommandEngine.GetCommands())
- {
- Log.Write("Command loaded: " + command);
- }
- }
-
- //Set the players initial room
- if ((ActiveGame.InitialRealm == null) || (ActiveGame.InitialRealm.InitialZone == null) || (ActiveGame.InitialRealm.InitialZone.InitialRoom == null))
- {
- CurrentRoom = new Room(ActiveGame);
- CurrentRoom.Name = "Abyss";
- CurrentRoom.Description = "You are in the Abyss. It is dark and void of life.";
- }
- else
- CurrentRoom = ActiveGame.InitialRealm.InitialZone.InitialRoom;
-
- IGameCommand gc = CommandEngine.GetCommand("CommandLogin");
- gc.Execute("Login", this);
- Log.Write(Name + " has logged in.");
- gc = CommandEngine.GetCommand("CommandLook");
- gc.Execute("Look", this); //MUST happen after Room setup is completed, otherwise the player default Abyss Room is printed.
- this.Send("Command: ", false);
- }
- internal void Receive(String data)
- {
- //data = ExecuteCommand(data);
- ExecuteCommand(data);
- //Send(data); //Results no longer returned as Player.Send() is used by the commands now.
- if (!ActiveGame.IsRunning)
- Disconnect();
- }
-
- ///
- /// Sends data to the player.
- ///
- ///
- ///
- public void Send(String data, Boolean newLine)
- {
- try
- {
- System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
- if (newLine)
- data += "\n\r";
-
- if (ActiveGame.IsMultiplayer)
- client.Send(encoding.GetBytes(data));
- else
- Console.Write(data);
- }
- catch (Exception)
- {
- Disconnect();
- }
- }
-
- ///
- /// Sends data to the player.
- ///
- ///
- public void Send(String data)
- {
- Send(data, true);
- }
-
- public void FlushConsole()
- {
- try
- {
- if (ActiveGame.IsMultiplayer)
- {
- System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
-
- //\x1B is hex
- //[2J is terminal sequences for clearing the screen.
- client.Send(encoding.GetBytes("\x1B[2J"));
- //[H is terminal sequence for sending the cursor back to its home position.
- client.Send(encoding.GetBytes("\x1B[H"));
- }
- else
- Console.Clear();
- }
- catch
- {
- Disconnect();
- }
- }
-
- public void Disconnect()
- {
- if (IsActive)
- {
- this.Save();
-
- Send("Goodbye!");
- IsActive = false;
- client.Close();
-
- Log.Write(Name + " disconnected.");
- }
- }
-
- public String ReadInput()
- {
- if (ActiveGame.IsMultiplayer)
- {
- List buffer = new List();
- while (true)
- {
- try
- {
- byte[] buf = new byte[1];
- Int32 recved = client.Receive(buf);
-
- if (recved > 0)
- {
- if (buf[0] == '\n' && buffer.Count > 0)
- {
- if (buffer[buffer.Count - 1] == '\r')
- buffer.RemoveAt(buffer.Count - 1);
-
- String str;
- System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
- str = enc.GetString(buffer.ToArray());
- return str;
- }
- else
- buffer.Add(buf[0]);
- }
- }
- catch (Exception e)
- {
- Disconnect();
- return e.Message;
- }
- }
- }
- else
- {
- return Console.ReadLine();
- }
- }
-
- internal Socket client;
+ //TODO: Load player Inventory.
+ /* Due to private accessor Inv needs to be restored via
+ * foreach (Item in Inventory)
+ * this.AddItem(Item);
+ */
}
+
+ public override void Save()
+ {
+ base.Save();
+
+ String path = Path.Combine(SavePath, Filename);
+
+ FileManager.WriteLine(path, this.Password, "Password");
+ FileManager.WriteLine(path, this.IsControlled.ToString(), "IsControlled");
+ FileManager.WriteLine(path, this.Role.ToString(), "Role");
+ FileManager.WriteLine(path, this.CurrentRoom.Filename, "CurrentRoom");
+ FileManager.WriteLine(path, this.CurrentRoom.Zone, "CurrentZone");
+ FileManager.WriteLine(path, this.CurrentRoom.Realm, "CurrentRealm");
+ }
+
+ public virtual void Update()
+ {
+ //TODO: Update AI logic.
+
+ Log.Write("BaseCharacter.Update Called!", true);
+ //TODO: AI Logic: Don't attack anything if CurrentRoom.IsSafe
+ //TODO: Add Stat modifiers for Zone and Rooms.
+ }
+
+ ///
+ /// Moves the player from one Room to another if the supplied direction contains a doorway.
+ /// Returns false if no doorway is available.
+ ///
+ ///
+ ///
+ public Boolean Move(AvailableTravelDirections travelDirection)
+ {
+ //Check if the current room has a doorway in the supplied direction of travel.
+ if (!CurrentRoom.DoorwayExist(travelDirection))
+ {
+ return false;
+ }
+
+ //Let other players know that the user walked out.
+ for (Int32 i = 0; i != ActiveGame.GetPlayerCollection().Length; i++)
+ {
+ if (ActiveGame.GetPlayerCollection()[i].Name == Name)
+ continue;
+
+ String room = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Filename;
+ String realm = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Realm;
+ String zone = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Zone;
+
+ if ((room == CurrentRoom.Filename) && (realm == CurrentRoom.Realm) && (zone == CurrentRoom.Zone))
+ {
+ ActiveGame.GetPlayerCollection()[i].Send(Name + " walked out towards the " + travelDirection.ToString());
+ }
+ }
+
+ //We have a doorway, lets move to the next room.
+ CurrentRoom = CurrentRoom.GetDoor(travelDirection).ArrivalRoom;
+
+ OnTravel(travelDirection);
+
+ return true;
+ }
+
+ public virtual void OnTravel(AvailableTravelDirections travelDirection)
+ {
+ //TODO: Check the Room/Zone/Realm to see if anything needs to occure during travel.
+ //Let other players know that the user walked in.
+ for (Int32 i = 0; i != ActiveGame.GetPlayerCollection().Length; i++)
+ {
+ if (ActiveGame.GetPlayerCollection()[i].Name == Name)
+ continue;
+
+ String room = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Name;
+ String realm = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Realm;
+ String zone = ActiveGame.GetPlayerCollection()[i].CurrentRoom.Zone;
+
+ if ((room == CurrentRoom.Name) && (realm == CurrentRoom.Realm) && (zone == CurrentRoom.Zone))
+ {
+ ActiveGame.GetPlayerCollection()[i].Send(Name + " walked in from the " + TravelDirections.GetReverseDirection(travelDirection));
+ }
+ }
+ }
+
+ public virtual void OnTalk(String message, BaseCharacter instigator)
+ {
+ //If the instigator is not sending a message to this character, then the
+ //AI can ignore it. No response will be sent.
+ if (!message.ToLower().Substring("say".Length).Trim().Contains(this.Name.ToLower()))
+ return;
+
+ //If the message was directed at this player, we will only respond
+ //if this character is controlled by AI.
+ if (!this.IsControlled)
+ {
+ //Instance a new Say command, and send the dialog response that we have saved.
+ IGameCommand cmd = CommandEngine.GetCommand("Say");
+ if (cmd != null)
+ cmd.Execute("say " + this.Dialog.Response, instigator);
+ }
+ }
+
+ public void ExecuteCommand(String command)
+ {
+ CommandSystem.ExecuteCommand(command, this);
+
+ Send(""); //Blank line to help readability.
+
+ //Now that the command has been executed, restore the Command: message
+ Send("Command: ", false);
+ }
+
+ public virtual void Create(string playerName, string password)
+ {
+ Name = playerName;
+ Password = password;
+
+ Save();
+ }
+
+ public bool VarifyPassword(string password)
+ {
+ if (Password == password)
+ return true;
+ else
+ return false;
+ }
+
+ public virtual void Initialize()
+ {
+ if (ActiveGame.IsMultiplayer)
+ client.Receive(new byte[255]);
+
+ //Ensure custom commands are loaded until everything is fleshed out.
+ if (Game.IsDebug)
+ {
+ foreach (String command in CommandEngine.GetCommands())
+ {
+ Log.Write("Command loaded: " + command);
+ }
+ }
+
+ //Set the players initial room
+ if ((ActiveGame.InitialRealm == null) || (ActiveGame.InitialRealm.InitialZone == null) || (ActiveGame.InitialRealm.InitialZone.InitialRoom == null))
+ {
+ CurrentRoom = new Room(ActiveGame);
+ CurrentRoom.Name = "Abyss";
+ CurrentRoom.Description = "You are in the Abyss. It is dark and void of life.";
+ }
+ else
+ CurrentRoom = ActiveGame.InitialRealm.InitialZone.InitialRoom;
+
+ IGameCommand gc = CommandEngine.GetCommand("CommandLogin");
+ gc.Execute("Login", this);
+ Log.Write(Name + " has logged in.");
+ gc = CommandEngine.GetCommand("CommandLook");
+ gc.Execute("Look", this); //MUST happen after Room setup is completed, otherwise the player default Abyss Room is printed.
+ this.Send("Command: ", false);
+ }
+ internal void Receive(String data)
+ {
+ //data = ExecuteCommand(data);
+ ExecuteCommand(data);
+ //Send(data); //Results no longer returned as Player.Send() is used by the commands now.
+ if (!ActiveGame.IsRunning)
+ Disconnect();
+ }
+
+ ///
+ /// Sends data to the player.
+ ///
+ ///
+ ///
+ public void Send(String data, Boolean newLine)
+ {
+ try
+ {
+ System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
+ if (newLine)
+ data += "\n\r";
+
+ if (ActiveGame.IsMultiplayer)
+ client.Send(encoding.GetBytes(data));
+ else
+ Console.Write(data);
+ }
+ catch (Exception)
+ {
+ Disconnect();
+ }
+ }
+
+ ///
+ /// Sends data to the player.
+ ///
+ ///
+ public void Send(String data)
+ {
+ Send(data, true);
+ }
+
+ public void FlushConsole()
+ {
+ try
+ {
+ if (ActiveGame.IsMultiplayer)
+ {
+ System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
+
+ //\x1B is hex
+ //[2J is terminal sequences for clearing the screen.
+ client.Send(encoding.GetBytes("\x1B[2J"));
+ //[H is terminal sequence for sending the cursor back to its home position.
+ client.Send(encoding.GetBytes("\x1B[H"));
+ }
+ else
+ Console.Clear();
+ }
+ catch
+ {
+ Disconnect();
+ }
+ }
+
+ public void Disconnect()
+ {
+ if (IsActive)
+ {
+ this.Save();
+
+ Send("Goodbye!");
+ IsActive = false;
+ client.Close();
+
+ Log.Write(Name + " disconnected.");
+ }
+ }
+
+ public String ReadInput()
+ {
+ if (ActiveGame.IsMultiplayer)
+ {
+ List buffer = new List();
+ while (true)
+ {
+ try
+ {
+ byte[] buf = new byte[1];
+ Int32 recved = client.Receive(buf);
+
+ if (recved > 0)
+ {
+ if (buf[0] == '\n' && buffer.Count > 0)
+ {
+ if (buffer[buffer.Count - 1] == '\r')
+ buffer.RemoveAt(buffer.Count - 1);
+
+ String str;
+ System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
+ str = enc.GetString(buffer.ToArray());
+ return str;
+ }
+ else
+ buffer.Add(buf[0]);
+ }
+ }
+ catch (Exception e)
+ {
+ Disconnect();
+ return e.Message;
+ }
+ }
+ }
+ else
+ {
+ return Console.ReadLine();
+ }
+ }
+
+ internal Socket client;
}
+}
diff --git a/MudEngine/MudEngine.csproj b/MudEngine/MudEngine.csproj
index b75f1a7..792c526 100644
--- a/MudEngine/MudEngine.csproj
+++ b/MudEngine/MudEngine.csproj
@@ -40,9 +40,8 @@
-
- False
- ..\..\rScript\rScripting\bin\Release\rScripting.dll
+
+ ..\..\rScripting\rScripting\bin\Release\rScripting.dll
@@ -58,6 +57,7 @@
+
diff --git a/MudEngine/Scripting/MudScriptCompiler.cs b/MudEngine/Scripting/MudScriptCompiler.cs
index db1a7c6..5ba8f83 100644
--- a/MudEngine/Scripting/MudScriptCompiler.cs
+++ b/MudEngine/Scripting/MudScriptCompiler.cs
@@ -139,8 +139,8 @@ namespace MudEngine.Scripting
public Boolean Compile(CompilerParameters param, FileInfo scriptFile)
{
//TODO: Add single-file compilation support
- return false; //Single file compiling not implemented
-
+ return false; //Single file compiling not implemented. TODO!
+
//Make sure we have a compiler version supplied.
if (!CompilerOptions.ContainsKey("CompilerVersion"))
CompilerOptions.Add("CompilerVersion", "v4.0");
diff --git a/MudGame/MudGame.csproj b/MudGame/MudGame.csproj
index 0d33ad9..a3cbf09 100644
--- a/MudGame/MudGame.csproj
+++ b/MudGame/MudGame.csproj
@@ -40,7 +40,7 @@
False
- ..\..\rScript\rScripting\bin\Release\rScripting.dll
+ ..\..\rScripting\rScripting\bin\Release\rScripting.dll