diff --git a/MUDEngine/Objects/Environment/Door.cs b/MUDEngine/Objects/Environment/Door.cs index ee50dbc..c0d06d3 100644 --- a/MUDEngine/Objects/Environment/Door.cs +++ b/MUDEngine/Objects/Environment/Door.cs @@ -53,5 +53,10 @@ namespace MUDEngine.Objects.Environment get; set; } + + public Door(AvailableTravelDirections TravelDirection) + { + this.TravelDirection = TravelDirection; + } } } diff --git a/RoomDesigner/frmMain.cs b/RoomDesigner/frmMain.cs index c3eef2e..1ba30ae 100644 --- a/RoomDesigner/frmMain.cs +++ b/RoomDesigner/frmMain.cs @@ -16,85 +16,188 @@ namespace RoomDesigner { public partial class frmMain : Form { - Room room; - Door door; + //Current _CurrentRoom + Room _CurrentRoom; + + //Doorway currently loaded. + Door _CurrentDoor; + public frmMain() { InitializeComponent(); - room = new Room(); - door = new Door(); - propertyRoom.SelectedObject = room; + //Initialize the Room & Doorway + _CurrentRoom = new Room(); + _CurrentDoor = new Door(AvailableTravelDirections.None); + + //Show the user(s) the rooms properties + propertyRoom.SelectedObject = _CurrentRoom; + + //This instances a copy of AvailableTravelDirections which is a list of + //currently available directions users can travel within rooms. + //Instead of updating the editor each time a new travel direction is implemented, + //we simply build an array that contains each travel direction currently available + //within the engine by getting each element from the AvailableTravelDirections enum AvailableTravelDirections type = new AvailableTravelDirections(); + //Build an array of travel directions currently implemented Array Values = System.Enum.GetValues(type.GetType()); + //Loop through each travel direction within the array and add it + //to the lstDirections listbox. foreach (int Value in Values) { string Display = Enum.GetName(type.GetType(), Value); - if (Display != "None") + //The array contains a 'None' direction. As the editor will allow for + //installing and uninstalling doorways, we don't need to show a 'None' direction + //in the listbox. + if (!Display.Equals("None")) this.lstDirections.Items.Add(Display); } - } + /// + /// Closes the editor. + /// TODO: Serialize the Room out to file. + /// + /// + /// private void btnCloseEditor_Click(object sender, EventArgs e) { Application.Exit(); } + /// + /// Change the currently selected direction, allowing users to uninstall or install + /// a doorway, and display the selected doorways properties for editing. + /// + /// + /// private void lstDirections_SelectedIndexChanged(object sender, EventArgs e) { + //Used to indicate that the direction the user selected exists, + //and was found for editing bool IsFound = false; - foreach (Door newDoor in room.InstalledDoors) + //Loop through each doorway installed within the _CurrentRoom and see if the user has + //selected a direction that belongs to a _CurrentDoor already created. If a _CurrentDoor with + //the selected direction is found, we display it's properties for editing instead + //of creating a new _CurrentDoor and overwriting the previously created doorway. + foreach (Door newDoor in _CurrentRoom.InstalledDoors) { + //Check if the current _CurrentDoor in the loop matches the currently selected + //travel direction the user has selected in the listbox. if (newDoor.TravelDirection.ToString() == lstDirections.SelectedItem.ToString()) { - door = newDoor; + //The travel directions match, let's set the current _CurrentDoor in the loop as our + //new selected doorway so that the user can edit it. + _CurrentDoor = newDoor; + + //Indicates that we found a matching doorway and have set it up for + //editing within the propertygrid IsFound = true; + + //Exit the loop break; } } + //There isn't a _CurrentDoor installed into the _CurrentRoom yet with a travel direction + //matching that of the users currently selected travel direction within the listbox. + //so we instance a new _CurrentDoor if (!IsFound) - door = new Door(); - - propertyDoor.SelectedObject = door; + { + AvailableTravelDirections direction = GetDirection(lstDirections.SelectedItem.ToString()); + _CurrentDoor = new Door(direction); + } + //Display the properties for users to edit. This could be a pre-existing doorway + //found within our loop, or a new doorway. + propertyDoor.SelectedObject = _CurrentDoor; } + /// + /// Modified values within the doorway get stored within the currentDoor Field. + /// + /// + /// private void propertyDoor_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { - if (door.DoorState == Door.AvailableDoorStates.Installed) + //Check if we are installing the door into the room or + //uninstalling it from the current room. + switch (_CurrentDoor.DoorState) { - foreach(Door newDoor in room.InstalledDoors) - { - if (newDoor.TravelDirection == door.TravelDirection) - { - DialogResult result = MessageBox.Show("Door already exists! Overwrite it?", "Room Designer", MessageBoxButtons.YesNo); - if (result == DialogResult.No) - return; + case Door.AvailableDoorStates.Installed: + InstallDoor(); + break; + case Door.AvailableDoorStates.Uninstalled: + UninstallDoor(); + break; + } + } - room.InstalledDoors.Remove(newDoor); - room.InstalledDoors.Add(door); - break; - } - else - { - room.InstalledDoors.Add(door); - } + private AvailableTravelDirections GetDirection(string Direction) + { + foreach (AvailableTravelDirections value in Enum.GetValues(typeof(AvailableTravelDirections))) + { + string name = value.ToString(); + + if (name == Direction) + return value; + } + + return AvailableTravelDirections.None; + } + + /// + /// Installs the _CurrentDoor into the _CurrentRoom's collection of doorways + /// + private void InstallDoor() + { + //Indicates if we found a door already installed within the room + //matching the selected travel direction. + bool IsInstalled = false; + + //Incase there are no existing doors, the foreach loop gets skipped. + if (_CurrentRoom.InstalledDoors.Count == 0) + { + //Add the new door to the room + _CurrentRoom.InstalledDoors.Add(_CurrentDoor); + return; + } + + //Loop through all of the installed doors within this room and + //check to see if we have a doorway with the same travel direction + //that the user has selected within the list box. If so then we + //need to prompt the user to ensure it's ok to overwrite the previous + //door with a new door. + //TODO: Look at this closer, do i need this messagebox? + foreach (Door newDoor in _CurrentRoom.InstalledDoors) + { + if (newDoor.TravelDirection == _CurrentDoor.TravelDirection) + { + /*DialogResult result = MessageBox.Show("Door already exists! Overwrite it?", "Room Designer", MessageBoxButtons.YesNo); + if (result == DialogResult.No) + return; + */ + _CurrentRoom.InstalledDoors.Remove(newDoor); + _CurrentRoom.InstalledDoors.Add(_CurrentDoor); + IsInstalled = true; + break; } - //Incase there are no existing doors, the foreach loop gets skipped. - if (room.InstalledDoors.Count == 0) - {/* - foreach (Enum e in door.TravelDirection) - { - if (e.ToString() == lstDirections.SelectedItem.ToString()) - { - door.TravelDirection = e; - } - } - */ + } + + if (!IsInstalled) + _CurrentRoom.InstalledDoors.Add(_CurrentDoor); + } + + private void UninstallDoor() + { + foreach (Door door in _CurrentRoom.InstalledDoors) + { + if (door.TravelDirection == _CurrentDoor.TravelDirection) + { + _CurrentRoom.InstalledDoors.Remove(door); + break; } } }