//Microsoft .NET Framework using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Text; //MudEngine using MudEngine.FileSystem; using MudEngine.GameManagement; using MudEngine.GameObjects; using MudEngine.GameObjects.Characters; using MudEngine.GameObjects.Environment; using MudEngine.GameObjects.Items; using MudEngine.Scripting; namespace MudEngine.GameManagement { public enum ObjectTypes { Realm, Zone, Room, Character, Item, Standard, //Any } public class GameWorld { /// /// Gets the collection of Objects that do not belong to any other Type of categories. /// public List Objects { get; private set; } /// /// Gets the collection of Items that are available in the game world. /// public List Items { get; private set; } /// /// Gets the collection of Characters (NPC/Monster) that are available in the Game world /// //TODO: This should be BaseAI public List Characters { get; private set; } /// /// Gets the collection of Realms currently available in the game world /// public List RealmCollection { get; private set; } private Game _Game; public GameWorld(Game game) { _Game = game; Objects = new List(); Items = new List(); Characters = new List(); RealmCollection = new List(); } public void Start() { //See if we have an Initial Realm set //TODO: Check for saved Realm files and load Log.Write("Initializing World..."); foreach (Realm r in RealmCollection) { if (r.IsInitialRealm) { _Game.InitialRealm = r; break; } } //Check if any the initial room exists or not. if ((_Game.InitialRealm == null) || (_Game.InitialRealm.InitialZone == null) || (_Game.InitialRealm.InitialZone.InitialRoom == null)) { Log.Write("ERROR: No initial location defined. Game startup failed!"); Log.Write("Players will start in the Abyss. Each player will contain their own instance of this room."); //return false; } else Log.Write("Initial Location loaded: " + _Game.InitialRealm.InitialZone.InitialRoom.RoomLocationWithoutExtension); } public void Save() { //Save all of the Environments for (Int32 x = 0; x <= RealmCollection.Count - 1; x++) { RealmCollection[x].Save(_Game.DataPaths.Environment); } } public void Load() { String filename = _Game.GameTitle + ".ini"; //Get the Initial Realm information from saved file. String realmFile = FileManager.GetData(filename, "InitialRealm"); String realmFolder = Path.GetFileNameWithoutExtension(realmFile); String realmPath = Path.Combine(_Game.DataPaths.Environment, realmFolder, realmFile); Log.Write("Restoring Game World..."); //Loop through each RealmCollection data entry stored in the _Game saved file. foreach (String realm in FileManager.GetCollectionData(filename, "RealmCollection")) { Log.Write("Restoring Realm " + realm); Realm r = new Realm(_Game); //Restore the Realm objects properties from file. r.Load(Path.Combine(_Game.DataPaths.Environment, Path.GetFileNameWithoutExtension(realm), realm)); //Loop through each of the Realm objects instanced during startup and find one matching the loaded filename for (int x = 0; x != RealmCollection.Count; x++) { //If the filenames match, then overwrite the pre-loaded Realm with the restored Realm with the saved data. if (RealmCollection[x].Filename == r.Filename) { RealmCollection[x] = r; break; } } } foreach (Realm r in RealmCollection) { if (r.IsInitialRealm) { _Game.InitialRealm = r; } foreach (Zone z in r.ZoneCollection) { Log.Write("Restoring Zone: " + z.Filename); z.RestoreLinkedRooms(); } } } /// /// Adds a Realm to the Games current list of Realms. /// /// public void AddRealm(Realm realm) { //If this Realm is set as Initial then we need to disable any previously //set Realms to avoid conflict. if (realm.IsInitialRealm) { foreach (Realm r in RealmCollection) { if (r.IsInitialRealm) { r.IsInitialRealm = false; break; } } } //Set this Realm as the Games initial Realm if (realm.IsInitialRealm) _Game.InitialRealm = realm; //TODO: Check for duplicate Realms. RealmCollection.Add(realm); } /// /// Returns a reference to the Realm contained within the Realms collection if it exists. /// /// /// public Realm GetRealm(String filename) { foreach (Realm r in RealmCollection) { if (r.Filename == filename) return r; } return null; } public virtual void Update() { foreach (BaseCharacter character in Characters) { character.Update(); } } } }