//Microsoft .NET Framework using System; using System.Collections.Generic; using System.Linq; using System.Text; //MUD Engine 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; namespace MudEngine.GameObjects.Characters { public class BaseCharacter : BaseObject { /// /// The current Room this Character is located at. /// public Room CurrentRoom { get; set; } /// /// 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; set; } /// /// Gets or Sets if this user has Admin privileges or not. /// public Boolean IsAdmin { get; private set; } /// /// Gets or Sets if this player is active. /// public Boolean IsActive { get; private set; } /// /// Gets a reference to the currently running game. /// public Game Game { get; private set; } public BaseCharacter(Game game) { Game = game; IsActive = false; CurrentRoom = game.InitialRealm.InitialZone.InitialRoom; } /// /// Moves the player from one Room to another if the supplied direction contains a doorway. /// Returns false if no doorway is available. /// /// /// public bool Move(AvailableTravelDirections travelDirection) { //Check if the current room has a doorway in the supplied direction of travel. if (!CurrentRoom.DoorwayExist(travelDirection)) { return false; } //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. } public String ExecuteCommand(string command) { //TODO: Character class can handle a lot of the command management here, checking various things prior to sending //the command off to the command engine for execution. CommandResults result = CommandEngine.ExecuteCommand(command, this); if (result.Result != null) { StringBuilder sb = new StringBuilder(); foreach (object item in result.Result) { if (item is string) sb.AppendLine(item.ToString()); } return sb.ToString(); } return ""; } internal void Initialize() { CurrentRoom = Game.InitialRealm.InitialZone.InitialRoom; IsActive = true; } internal void Receive(byte[] data) { // convert that data to string String str; System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); str = enc.GetString(data); // execute, and get result str = ExecuteCommand(str); // convert the result back to bytes and send it back System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); Send(encoding.GetBytes(str)); if (!Game.IsRunning) Clear(); } internal void Send(byte[] data) { try { client.Send(data); } catch (Exception) // error, connection failed: close client { Clear(); } } internal void Clear() { // TODO: Save(); IsActive = false; client.Close(); // TODO: Reset game so it can be used again } internal Socket client; } }