//Microsoft .NET Framework using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Xml.Serialization; //MUD Engine using MudEngine.FileSystem; using MudEngine.GameObjects; using MudEngine.GameObjects.Items; namespace MudEngine.GameObjects.Environment { [XmlInclude(typeof(Room))] public class Zone : BaseObject { [Category("Environment Information")] [DefaultValue(0)] [Description("The amount to drain each stat by if StatDrain is enabled.")] public int StatDrainAmount { get; set; } [Category("Environment Information")] [Description("Enable or Disable the ability for draining stats while traversing.")] [DefaultValue(false)] public bool StatDrain { get; set; } [ReadOnly(true)] [Category("Environment Information")] [Description("The Realm that this Zone is assigned to. It is not required to be contained within a Realm.")] public string Realm { get; set; } [Category("Environment Information")] [Description("Determins if the Player can be attacked within this Room or not.")] [DefaultValue(false)] public bool IsSafe { get; set; } /// /// Gets or Sets the ability for this Zone to be the initial starting Zone for the game. /// [Category("Environment Information")] [Description("Sets that this Zone is a starting Zone for the game.")] [DefaultValue(false)] public bool IsInitialZone { get; set; } [Category("Environment Information")] //[EditorAttribute(typeof(UIRoomEditor), typeof(UITypeEditor))] [Description("Collection of Rooms that have been created. Editing the Rooms Collection lets you manage the Zones rooms.")] public List RoomCollection { get; private set; } /// /// Gets the initial Room for this Zone. /// [Category("Environment Information")] public Room InitialRoom { get; private set; } public Zone(GameManagement.Game game) : base(game) { RoomCollection = new List(); IsSafe = false; Realm = "No Realm Associated."; } /// /// /// /// /// public Room GetRoom(string name) { foreach (Room room in RoomCollection) { if (room.Name == name) return room; } return null; } /// /// Adds the supplied room into the Zones Room collection. /// /// public void AddRoom(Room room) { if (room.IsInitialRoom) { //Look if we already have a initial room. If so change it. Only 1 InitialRoom per Zone permitted. foreach (Room r in RoomCollection) { if (r.IsInitialRoom) { r.IsInitialRoom = false; break; } } } if (room.IsInitialRoom) InitialRoom = room; //TODO: Check for duplicate Rooms. RoomCollection.Add(room); } public void LinkRooms(AvailableTravelDirections departureDirection, Room arrivalRoom, Room departureRoom) { LinkRooms(departureDirection, arrivalRoom, departureRoom, 0); } public void LinkRooms(AvailableTravelDirections departureDirection, Room arrivalRoom, Room departureRoom, Int32 requiredLevel) { LinkRooms(departureDirection, arrivalRoom, departureRoom, requiredLevel, false, null); } public void LinkRooms(AvailableTravelDirections departureDirection, Room arrivalRoom, Room departureRoom, Int32 requiredLevel, Boolean isLocked, BaseItem requiredKey) { Door door = new Door(ActiveGame); door.ArrivalRoom = arrivalRoom; door.DepartureRoom = departureRoom; if (isLocked) { door.IsLocked = isLocked; door.RequiredKey = requiredKey; } door.TravelDirection = departureDirection; departureRoom.Doorways.Add(door); //Now we set up the door for the opposite room. door = new Door(ActiveGame); door.DepartureRoom = arrivalRoom; door.ArrivalRoom = departureRoom; if (isLocked) { door.IsLocked = isLocked; door.RequiredKey = requiredKey; } door.TravelDirection = TravelDirections.GetReverseDirection(departureDirection); arrivalRoom.Doorways.Add(door); } } }