muddesigner/MudEngine/GameManagement/GameWorld.cs
Scionwest_cp de38cbf272 MudEngine:
- Fixed FileManager.GetDataSpan Index out of bounds exception.
 - Game.Save no long invokes the BaseCharacter.ExecuteCommand("Save"); rather it now just directly invokes BaseCharacter.Save(). This fixes the client typing bug where a new command line was printed to the screen everytime the game world saved.
 - GameWorld now supports storing and saving dynamically created Realms.
 - Renamed BaseCharacter.GetRoomByFilename() to just GetRoom() as all Get() named Methods require a filename.
 - Optimized the loading and saving of Realms, Zones and Rooms some.
 - Room now Loads and Saves the RoomLocation property instead of the Room's Zone and Realm properties individually.
 - GameWorld.GetRealm(), Realm.GetZone() and Zone.GetRoom() now perform case-insensitive checking when scanning for content.

MudGame:
 - Re-wrote the 'Create' command script from the ground up. 50% less code and much better approach to creating content. Now to create content you will use the same formatting as the Room.RoomLocation property.
        Example: Creating a Realm is done with 'Create MyRealm'
        Example: Creating a Zone is done with 'Create MyRealm>MyZone'
        Example: Creating a Room is done with 'Create MyRealm>MyZone>MyRoom'
   If the Realm or Zone does not exist when creating a Room or Zone, then the parent will be created automatically for you.
 - Fixed a bug in the WorldCalifornia script were it was saving the Hallway Room with a Zone file extension, preventing it from working correctly during restoration.
2010-09-04 00:10:04 -07:00

206 lines
6.7 KiB
C#

//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
{
/// <summary>
/// Gets the collection of Objects that do not belong to any other Type of categories.
/// </summary>
public List<BaseObject> Objects { get; private set; }
/// <summary>
/// Gets the collection of Items that are available in the game world.
/// </summary>
public List<BaseItem> Items { get; private set; }
/// <summary>
/// Gets the collection of Characters (NPC/Monster) that are available in the Game world
/// </summary>
//TODO: This should be BaseAI
public List<BaseCharacter> Characters { get; private set; }
/// <summary>
/// Gets the collection of Realms currently available in the game world
/// </summary>
public List<Realm> RealmCollection { get; private set; }
private Game _Game;
public GameWorld(Game game)
{
_Game = game;
Objects = new List<BaseObject>();
Items = new List<BaseItem>();
Characters = new List<BaseCharacter>();
RealmCollection = new List<Realm>();
}
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));
Boolean isFound = false;
//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;
isFound = true;
break;
}
}
if (!isFound)
RealmCollection.Add(r);
}
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();
}
}
}
/// <summary>
/// Adds a Realm to the Games current list of Realms.
/// </summary>
/// <param name="realm"></param>
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);
}
/// <summary>
/// Returns a reference to the Realm contained within the Realms collection if it exists.
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public Realm GetRealm(String filename)
{
foreach (Realm r in RealmCollection)
{
if (r.Filename.ToLower() == filename.ToLower())
return r;
}
return null;
}
public virtual void Update()
{
foreach (BaseCharacter character in Characters)
{
character.Update();
}
}
}
}