From ee3cd897f203fa3e40a121be21ab1d21149d1f30 Mon Sep 17 00:00:00 2001 From: Scionwest_cp Date: Sat, 10 Mar 2012 20:47:12 -0800 Subject: [PATCH] Began work on Environment save code. Restructured the project save data folder layout when the engine starts. The XMLData class now creates directories if they are missing. Individual classes no longer need to check if a path is valid before saving. Filenames are now automatically generated and no longer assigned by developers. This change has been made across all classes that are savable which required some changing of the Save() method arguments. --- .../WinPC_Engine/Core/Interfaces/ISavable.cs | 4 +-- MudEngine/WinPC_Engine/DAL/DataPaths.cs | 2 +- .../Game/Characters/StandardCharacter.cs | 14 ++++----- .../Game/Environment/Environment.cs | 29 ++++++++++++++----- .../WinPC_Engine/Game/Environment/Realm.cs | 25 ++++++++++++++++ .../WinPC_Engine/Game/Environment/Zone.cs | 20 +++++++++++++ MudEngine/WinPC_Engine/Game/StandardGame.cs | 2 ++ MudEngine/WinPC_Engine/Game/World.cs | 4 +++ .../GameScripts/BaseCommands/CreatePlayer.cs | 2 +- .../WinPC_Engine/GameScripts/BaseScript.cs | 20 +++++++++---- .../WinPC_Engine/GameScripts/SampleGame.cs | 3 +- MudEngine/WinPC_Engine/WinPC_Engine.csproj | 4 +-- 12 files changed, 101 insertions(+), 28 deletions(-) diff --git a/MudEngine/WinPC_Engine/Core/Interfaces/ISavable.cs b/MudEngine/WinPC_Engine/Core/Interfaces/ISavable.cs index d669eb8..d8e3350 100644 --- a/MudEngine/WinPC_Engine/Core/Interfaces/ISavable.cs +++ b/MudEngine/WinPC_Engine/Core/Interfaces/ISavable.cs @@ -19,9 +19,9 @@ namespace MudEngine.Core.Interfaces /// Save method for dumping the object to physical file. /// /// - Boolean Save(String filename); + Boolean Save(); - Boolean Save(String filename, Boolean ignoreFileWrite); + Boolean Save(Boolean ignoreFileWrite); /// /// Load method for retrieving saved data from file. diff --git a/MudEngine/WinPC_Engine/DAL/DataPaths.cs b/MudEngine/WinPC_Engine/DAL/DataPaths.cs index 6145087..eba9d16 100644 --- a/MudEngine/WinPC_Engine/DAL/DataPaths.cs +++ b/MudEngine/WinPC_Engine/DAL/DataPaths.cs @@ -48,7 +48,7 @@ namespace MudEngine.DAL this.SetAbsolutePath(Path.Combine(this._InstallRoot, "Environments"), DataTypes.Environments); this.SetAbsolutePath(Path.Combine(this._InstallRoot, "Equipment"), DataTypes.Equipment); this.SetAbsolutePath(Path.Combine(this._InstallRoot, "Players"), DataTypes.Players); - this.SetAbsolutePath(Path.Combine(this._InstallRoot, "GameScripts"), DataTypes.Scripts); + this.SetAbsolutePath(Path.Combine(this.GetInstallPath(), "GameScripts"), DataTypes.Scripts); } public void SetAbsolutePath(String path, DataTypes objectType) diff --git a/MudEngine/WinPC_Engine/Game/Characters/StandardCharacter.cs b/MudEngine/WinPC_Engine/Game/Characters/StandardCharacter.cs index 06dc9f4..7eb3905 100644 --- a/MudEngine/WinPC_Engine/Game/Characters/StandardCharacter.cs +++ b/MudEngine/WinPC_Engine/Game/Characters/StandardCharacter.cs @@ -27,7 +27,7 @@ namespace MudEngine.Game.Characters /// Gets a reference to the currently active game. /// - public string Filename + public new string Filename { get { @@ -138,20 +138,20 @@ namespace MudEngine.Game.Characters this.Commands = null; } - public override bool Save(String filename) + public override bool Save() { - return this.Save(filename, true); + return this.Save(true); } - public override bool Save(String filename, Boolean verbose) + public override bool Save(Boolean verbose) { - base.Save(filename, true); + base.Save(true); SaveData.AddSaveData("Immovable", Immovable.ToString()); SaveData.AddSaveData("Password", Password); SaveData.AddSaveData("Role", this.Role.ToString()); - if (this.SaveData.Save(filename)) + if (this.SaveData.Save(this.Filename)) { if (!verbose) this.SendMessage("Save completed."); @@ -236,7 +236,7 @@ namespace MudEngine.Game.Characters public void Disconnect() { - this.Save(this.Filename); + this.Save(); //Purge all of this characters commands. this.Destroy(); diff --git a/MudEngine/WinPC_Engine/Game/Environment/Environment.cs b/MudEngine/WinPC_Engine/Game/Environment/Environment.cs index 8f1e9a9..19d4c35 100644 --- a/MudEngine/WinPC_Engine/Game/Environment/Environment.cs +++ b/MudEngine/WinPC_Engine/Game/Environment/Environment.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.IO; using MudEngine.Core; using MudEngine.Core.Interfaces; @@ -11,12 +12,19 @@ using MudEngine.GameScripts; namespace MudEngine.Game.Environment { - public class Environment : BaseScript, IGameComponent, ISavable, IUpdatable + public abstract class Environment : BaseScript, IGameComponent, ISavable, IUpdatable { /// /// Gets or Sets the filename for this environment when it is saved. /// - public string Filename { get; set; } + public new string Filename + { + get + { + String path = Path.Combine(this.Game.SavePaths.GetPath(DAL.DataTypes.Environments), this.Name + this.Game.SavePaths.GetExtension(DAL.DataTypes.Environments)); + return path; + } + } /// /// Gets or Sets if this object is enabled. When disabled, characters can not traverse it. @@ -53,16 +61,21 @@ namespace MudEngine.Game.Environment this.Enabled = false; } - public override bool Save(String filename, Boolean ignoreFileWrite) + public override bool Save() { - base.Save(filename, true); + return this.Save(false); + } - SaveData.AddSaveData("Filename", this.Filename); + public override bool Save(Boolean ignoreFileWrite) + { + base.Save(true); + + //SaveData.AddSaveData("Filename", this.Filename); SaveData.AddSaveData("Enabled", this.Enabled.ToString()); SaveData.AddSaveData("RequiredRole", this.RequiredRole.ToString()); if (!ignoreFileWrite) - return this.SaveData.Save(filename); + return this.SaveData.Save(this.Filename); else return true; } @@ -70,10 +83,10 @@ namespace MudEngine.Game.Environment public override void Load(string filename) { base.Load(filename); - + /* try { this.Filename = this.SaveData.GetData("Filename"); } catch { LoadFailedMessage("Filename"); } - + */ try { this.Enabled = Convert.ToBoolean(this.SaveData.GetData("Enabled")); } catch { this.LoadFailedMessage("Enabled");} diff --git a/MudEngine/WinPC_Engine/Game/Environment/Realm.cs b/MudEngine/WinPC_Engine/Game/Environment/Realm.cs index 9c1d5ea..9c90892 100644 --- a/MudEngine/WinPC_Engine/Game/Environment/Realm.cs +++ b/MudEngine/WinPC_Engine/Game/Environment/Realm.cs @@ -13,6 +13,15 @@ namespace MudEngine.Game.Environment { public class Realm : Environment { + public new String Filename + { + get + { + String path = Path.Combine(this.Game.SavePaths.GetPath(DAL.DataTypes.Environments), this.Name, this.Name + "." + this.GetType().Name); + return path; + } + } + public Realm(StandardGame game, String name, String description) : base(game, name, description) { this._ZoneCollection = new List(); @@ -35,6 +44,22 @@ namespace MudEngine.Game.Environment return v.First(); } + public override bool Save(Boolean ignoreFileWrite) + { + if (!base.Save(true)) + return false; + + foreach (Zone zone in this._ZoneCollection) + { + this.SaveData.AddSaveData("Zone", zone.Name); + zone.Save(); + } + + this.SaveData.Save(this.Filename); + + return true; + } + private List _ZoneCollection; } } diff --git a/MudEngine/WinPC_Engine/Game/Environment/Zone.cs b/MudEngine/WinPC_Engine/Game/Environment/Zone.cs index 6666845..dd61ee2 100644 --- a/MudEngine/WinPC_Engine/Game/Environment/Zone.cs +++ b/MudEngine/WinPC_Engine/Game/Environment/Zone.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.IO; using MudEngine.Core.Interfaces; using MudEngine.GameScripts; @@ -12,6 +13,15 @@ namespace MudEngine.Game.Environment { public class Zone : Environment { + public new String Filename + { + get + { + String path = Path.Combine(this.Game.SavePaths.GetPath(DAL.DataTypes.Environments), this.Realm.Name, "Zones", this.Name + "." + this.GetType().Name); + return path; + } + } + /// /// Gets or Sets the what stats /// @@ -26,6 +36,16 @@ namespace MudEngine.Game.Environment this._RoomCollection = new List(); } + public override bool Save() + { + if (!base.Save(true)) + return false; + + this.SaveData.AddSaveData("Safe", this.Safe.ToString()); + this.SaveData.Save(this.Filename); + return true; + } + public Room CreateRoom(String name, String description) { Room room = new Room(this.Game, name, description, this); diff --git a/MudEngine/WinPC_Engine/Game/StandardGame.cs b/MudEngine/WinPC_Engine/Game/StandardGame.cs index e219aa4..9766260 100644 --- a/MudEngine/WinPC_Engine/Game/StandardGame.cs +++ b/MudEngine/WinPC_Engine/Game/StandardGame.cs @@ -230,6 +230,8 @@ namespace MudEngine.Game if (this.Server.Enabled) this.Enabled = true; + this.World.Save(); + return this.Enabled; } diff --git a/MudEngine/WinPC_Engine/Game/World.cs b/MudEngine/WinPC_Engine/Game/World.cs index 063204b..ad83b1e 100644 --- a/MudEngine/WinPC_Engine/Game/World.cs +++ b/MudEngine/WinPC_Engine/Game/World.cs @@ -49,6 +49,10 @@ namespace MudEngine.Game public void Save() { + foreach (Realm realm in this._RealmCollection) + { + realm.Save(); + } } public void Load() diff --git a/MudEngine/WinPC_Engine/GameScripts/BaseCommands/CreatePlayer.cs b/MudEngine/WinPC_Engine/GameScripts/BaseCommands/CreatePlayer.cs index 2aa262d..b3d10c8 100644 --- a/MudEngine/WinPC_Engine/GameScripts/BaseCommands/CreatePlayer.cs +++ b/MudEngine/WinPC_Engine/GameScripts/BaseCommands/CreatePlayer.cs @@ -86,7 +86,7 @@ namespace MudEngine.GameScripts.Commands character.Move(game.World.StartLocation); //TODO: Create a class and setup Stats. - character.Save(character.Filename, false); + character.Save(false); } catch (Exception ex) { diff --git a/MudEngine/WinPC_Engine/GameScripts/BaseScript.cs b/MudEngine/WinPC_Engine/GameScripts/BaseScript.cs index ec5dc85..404dd5b 100644 --- a/MudEngine/WinPC_Engine/GameScripts/BaseScript.cs +++ b/MudEngine/WinPC_Engine/GameScripts/BaseScript.cs @@ -18,6 +18,14 @@ namespace MudEngine.GameScripts [DefaultValue("Scripted Object")] public String Name { get; set; } + public String Filename + { + get + { + return Path.Combine(this.Game.SavePaths.GetPath(DataTypes.Root), this.Name + "." + this.Game.SavePaths.GetExtension(DataTypes.Root)); + } + } + public String ID { get; set; } public String Description { get; set; } @@ -37,15 +45,15 @@ namespace MudEngine.GameScripts this.SaveData = new XMLData(this.GetType().Name); } - public virtual Boolean Save(String filename) + public virtual Boolean Save() { - return this.Save(filename, false); + return this.Save(false); } - public virtual Boolean Save(String filename, Boolean ignoreFileWrite) + public virtual Boolean Save(Boolean ignoreFileWrite) { - if (File.Exists(filename)) - File.Delete(filename); + if (File.Exists(this.Filename)) + File.Delete(this.Filename); try { @@ -55,7 +63,7 @@ namespace MudEngine.GameScripts this.SaveData.AddSaveData("Description", Description); if (!ignoreFileWrite) - this.SaveData.Save(filename); + this.SaveData.Save(this.Filename); } catch { diff --git a/MudEngine/WinPC_Engine/GameScripts/SampleGame.cs b/MudEngine/WinPC_Engine/GameScripts/SampleGame.cs index 1fa1b60..8c409e2 100644 --- a/MudEngine/WinPC_Engine/GameScripts/SampleGame.cs +++ b/MudEngine/WinPC_Engine/GameScripts/SampleGame.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using MudEngine.Game; using MudEngine.DAL; using MudEngine.Game.Environment; using MudEngine.Game; @@ -24,6 +23,7 @@ namespace MudEngine.GameScripts public override Boolean Start(Int32 maxPlayers, Int32 maxQueueSize) { this.Server.ServerOwner = "Admin"; + base.Start(maxPlayers, maxQueueSize); //Quick demonstration on how to create the initial starting room for new players. this.World.CreateRealm("Azeroth", "Starting Realm for beginning players"); @@ -43,6 +43,7 @@ namespace MudEngine.GameScripts if (startOK && linked) { this.World.StartLocation = bedroom; + this.World.Save(); return true; } //Otherwise return false and prevent the game from running. diff --git a/MudEngine/WinPC_Engine/WinPC_Engine.csproj b/MudEngine/WinPC_Engine/WinPC_Engine.csproj index c7fcf73..a1a833c 100644 --- a/MudEngine/WinPC_Engine/WinPC_Engine.csproj +++ b/MudEngine/WinPC_Engine/WinPC_Engine.csproj @@ -73,9 +73,9 @@ Always - + Always - +