muddesigner/Mud Designer/Editors/ZoneBuilder.cs
Scionwest_cp 02c7bbca86 Mud Designer:
- Realm Explorer now deletes whole realms correctly.
 - Zone Builder no longer crashes when trying to open after the default Realm has been deleted. No Realm is loaded instead. Some initial setup code is skipped due to the error generated. This will be corrected in the next couple SVN commits.
2010-01-03 16:12:49 -08:00

466 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//MudEngine
using MudDesigner.MudEngine;
using MudDesigner.MudEngine.Attributes;
using MudDesigner.MudEngine.FileSystem;
using MudDesigner.MudEngine.GameObjects;
using MudDesigner.MudEngine.GameObjects.Environment;
using ManagedScripting;
namespace MudDesigner.Editors
{
public partial class ZoneBuilder : Form
{
internal bool IsEditingExisting = false;
bool IsRealmLoaded = false;
bool IsZoneLoaded = false;
bool IsCreatingZone = false;
bool IsRoomLoaded = false;
bool IsCreatingRoom = false;
List<Zone> _Zones = new List<Zone>();
public ZoneBuilder()
{
InitializeComponent();
//Reinstance all of our environments
Program.Realm = new Realm();
//If we have a default Realm selected, lets load it
try
{
if (Program.Settings.DefaultRealm != null)
{
//Load it
string realmPath = Path.Combine(FileManager.GetDataPath(SaveDataTypes.Realms), Program.Settings.DefaultRealm.Name);
string realmFile = Path.Combine(realmPath, Program.Settings.DefaultRealm.Filename);
if (File.Exists(realmFile))
{
Program.Realm = (Realm)FileManager.Load(realmFile, Program.Realm);
this.Text = "Zone Builder: (" + Program.Realm.Name + ")";
IsRealmLoaded = true;
}
//realm is loaded, now clear out the list of zones & rooms and show the zones contained
//within the new realm
lstZones.Items.Clear();
lstRooms.Items.Clear();
_Zones.Clear();
string[] files = Directory.GetFiles(realmPath, "*.zone", SearchOption.AllDirectories);
foreach (string file in files)
{
string filename = Path.GetFileName(file);
if (Program.Realm.Zones.Contains(filename))
{
Zone zone = new Zone();
zone = (Zone)FileManager.Load(file, zone);
zone.RefreshRoomList();
_Zones.Add(zone);
lstZones.Items.Add(zone.Name);
}
else
continue;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnNewZone_Click(object sender, EventArgs e)
{
//Check if a realm is loaded
if (!IsRealmLoaded)
{
MessageBox.Show("You need to select a Realm to create a Zone in first.",
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (IsCreatingZone)
{
DialogResult result = MessageBox.Show("You are currently editing a new Zone, are you sure you want to re-create a new Zone?",
"Zone Builder", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
return;
}
//re-instance our zone and room
Program.Zone = new Zone();
//Assign the realm to the zone
Program.Zone.Realm = Program.Realm.Name;
//Assign to the property view
propertyZone.SelectedObject = Program.Zone;
//Zone is in 'create' mode, and has not been saved/loaded fully yet.
IsZoneLoaded = false;
IsCreatingZone = true;
//Reset our room, as we are creating a new zone, there will be no rooms.
propertyRoom.SelectedObject = null;
lstRooms.Items.Clear();
}
private void btnSaveZone_Click(object sender, EventArgs e)
{
//Get the realm and zone path setup first
string realmPath = System.IO.Path.Combine(FileManager.GetDataPath(SaveDataTypes.Realms), Program.Realm.Name);
string zonePath = Path.Combine(realmPath, Program.Zone.Name);
string zoneFile = Path.Combine(zonePath, Program.Zone.Filename);
if (!Directory.Exists(zonePath))
Directory.CreateDirectory(zonePath);
//adjust our realm
if (!Program.Realm.Zones.Contains(Program.Zone.Filename))
Program.Realm.Zones.Add(Program.Zone.Filename);
//save the Zone
FileManager.Save(zoneFile, Program.Zone);
//Re-save the realm, as we have changed it's Zone collection
FileManager.Save(Path.Combine(realmPath, Program.Realm.Filename), Program.Realm);
//add it to the list box if it isn't already there
if (!lstZones.Items.Contains(Program.Zone.Name))
lstZones.Items.Add(Program.Zone.Name);
//Store it in our collection.
foreach (Zone zone in _Zones)
{
//Check if we have a zone that exists already
//with that name, incase the user is just editing it.
if (zone.Name == Program.Zone.Name)
{
//remove it.
_Zones.Remove(zone);
break;
}
}
//Add the zone to our collection
_Zones.Add(Program.Zone);
IsZoneLoaded = true;
IsCreatingZone = false;
}
private void btnSelectRealm_Click(object sender, EventArgs e)
{
//instance a form displaying all of the realms
ExistingRealms form = new ExistingRealms();
form.Text = "Zones owning Realm.";
//show the form
form.Show();
this.Hide();
//wait for it to be closed
while (form.Created)
Application.DoEvents();
//Restore the zone builder
this.Show();
//Check if we have selected a realm or not
//if not, then cancel creating the zone
if (form.lstRealms.SelectedIndex == -1)
return;
//Load it
string realmPath = Path.Combine(FileManager.GetDataPath(SaveDataTypes.Realms), form._RealmName);
string realmFile = Path.Combine(realmPath, form._RealmFilename);
Program.Realm = (Realm)FileManager.Load(realmFile, Program.Realm);
this.Text = "Zone Builder: (" + Program.Realm.Name + ")";
IsRealmLoaded = true;
IsZoneLoaded = false;
IsRoomLoaded = false;
//realm is loaded, now clear out the list of zones & rooms and show the zones contained
//within the new realm
lstZones.Items.Clear();
lstRooms.Items.Clear();
_Zones.Clear();
string[] files = Directory.GetFiles(realmPath, "*.zone", SearchOption.AllDirectories);
foreach (string file in files)
{
string filename = Path.GetFileName(file);
if (Program.Realm.Zones.Contains(filename))
{
Zone zone = new Zone();
zone = (Zone)FileManager.Load(file, zone);
zone.RefreshRoomList();
_Zones.Add(zone);
lstZones.Items.Add(zone.Name);
}
else
continue;
}
}
private void btnLoadZone_Click(object sender, EventArgs e)
{
if (!IsRealmLoaded)
{
MessageBox.Show("You must first select a realm in order to view Zones for loading.",
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (lstZones.SelectedIndex == -1)
{
MessageBox.Show("Select a Zone to load first.", "Zone Builder", MessageBoxButtons.OK);
return;
}
if (IsCreatingZone)
{
DialogResult result = MessageBox.Show("You are currently editing a new Zone, are you sure you want to re-create a new Zone?",
"Zone Builder", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
return;
}
//Loop through the collection we generated when we selected our realm
//and find the zone that the user selected to load
foreach (Zone zone in _Zones)
{
if (zone.Name == lstZones.SelectedItem.ToString())
{
Program.Zone = zone;
Program.Zone.RefreshRoomList();
break;
}
}
//Loop through the zones collection of rooms and add them to the
//room list.
lstRooms.Items.Clear();
foreach (Room room in Program.Zone.Rooms)
{
lstRooms.Items.Add(room.Name);
}
propertyZone.SelectedObject = Program.Zone;
IsZoneLoaded = true;
IsCreatingZone = false;
IsRoomLoaded = false;
}
private void btnNewRoom_Click(object sender, EventArgs e)
{
if (!IsZoneLoaded)
{
string msg = "";
if (IsCreatingZone)
{
msg = "You will need to save the Zone prior to creating a new Room.";
}
else
{
msg = "You will need to load a Zone prior to creating a new Room.";
}
MessageBox.Show(msg,
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
Program.Room = new Room();
Program.Room.Zone = Program.Zone.Name;
propertyRoom.SelectedObject = Program.Room;
IsRoomLoaded = false;
IsCreatingRoom = true;
}
private void btnSaveRoom_Click(object sender, EventArgs e)
{
if (!IsRoomLoaded)
{
if (!IsCreatingRoom)
{
MessageBox.Show("You must create a new Room in order to save.", "Zone Builder", MessageBoxButtons.OK);
return;
}
}
//Get the realm, zone & room path setup first
string realmPath = System.IO.Path.Combine(FileManager.GetDataPath(SaveDataTypes.Realms), Program.Realm.Name);
string zonePath = Path.Combine(realmPath, Program.Zone.Name);
string roomFile = Path.Combine(zonePath, Program.Room.Filename);
//adjust our Zone. Zones are added to the Zone.Rooms
//collection when the Zone is instanced, anything created
//after the Zone is instanced will need to be added manually.
//Zone does not need to be re-saved like Realms would need to be
//as Zones load all of the Rooms it contains on its own when instanced.
if (Program.Zone.GetRoom(Program.Room.Name) == null)
Program.Zone.Rooms.Add(Program.Room);
//save the Room
FileManager.Save(roomFile, Program.Room);
//add it to the list box if it isn't already there
if (!lstRooms.Items.Contains(Program.Room.Name))
lstRooms.Items.Add(Program.Room.Name);
IsRoomLoaded = true;
IsCreatingRoom = false;
}
private void btnLoadRoom_Click(object sender, EventArgs e)
{
if (!IsZoneLoaded)
{
MessageBox.Show("You must first load a Zone in order to aquire Rooms for loading.",
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (lstRooms.SelectedIndex == -1)
{
MessageBox.Show("Select a Room to load first.", "Zone Builder", MessageBoxButtons.OK);
return;
}
if (IsCreatingZone)
{
MessageBox.Show("You are currently editing a new Zone, you must save the Zone prior to attempting to load a Room.",
"Zone Builder", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
return;
}
bool found = false;
foreach (Room room in Program.Zone.Rooms)
{
if (room.Name == lstRooms.SelectedItem.ToString())
{
Program.Room = room;
found = true;
break;
}
}
if (!found)
{
MessageBox.Show("Failed loading room. Unable to locate the selected room within the Zone.",
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
propertyRoom.SelectedObject = Program.Room;
IsRoomLoaded = true;
IsCreatingRoom = false;
//assign the doorways to the UI
foreach (Door door in Program.Room.InstalledDoors)
{
AvailableTravelDirections travelDirection = door.TravelDirection;
Control[] controls = this.Controls.Find("btn" + travelDirection.ToString(), true);
controls[0].Text = travelDirection.ToString() + "\nInstalled";
doorwayHelp.SetToolTip(controls[0], travelDirection.ToString() + " Doorway Installed.\n\n"
+ door.TravelRoom.Realm + "->" + door.TravelRoom.Zone + "->" + door.TravelRoom.Room + "->" + door.TravelRoom.TravelDirection.ToString());
}
}
private void doorwayMenuStrip_Opening(object sender, CancelEventArgs e)
{
if (sender is ContextMenuStrip)
{
ContextMenuStrip mnu = (ContextMenuStrip)sender;
Button btn = (Button)mnu.SourceControl;
mnuInstallDoor.Text = "Install " + btn.Text + " doorway.";
}
}
private void installDoorwayToAnotherZoneToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!IsRoomLoaded)
{
MessageBox.Show("You must load a Room prior to any doorway installation attempts.",
"Zone Builder", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
//Split the menus text into an array, since the menu
//is dynamically generating it's text, depending on the
//button it is right clicked over.
string[] menuWords = mnuInstallDoor.Text.Split(' ');
//Create an array of all available travel directions
AvailableTravelDirections travelDirection = new AvailableTravelDirections();
Array values = Enum.GetValues(typeof(AvailableTravelDirections));
//Loop through each word in the menu, until we find a word
//that matches a travel direction.
foreach (string word in menuWords)
{
foreach (int value in values)
{
//get a copy of the current travel direction in the array
string displayName = Enum.GetName(typeof(AvailableTravelDirections), value);
//check if the current travel direction matches the current word in
//the context menu
if (displayName == word)
{
//If we have a match, store the travel direction so
//we can use it on our Doorway manager
travelDirection = (AvailableTravelDirections)Enum.Parse(typeof(AvailableTravelDirections), displayName);
}
}
}
//Instance a new Doorway manager
DoorwayManager form = new DoorwayManager(travelDirection);
form.Show();
this.Hide();
while (form.Created)
Application.DoEvents();
this.Show();
Control[] controls = this.Controls.Find("btn" + travelDirection.ToString(), true);
controls[0].Text = travelDirection.ToString() + "\nInstalled";
doorwayHelp.SetToolTip(controls[0], travelDirection.ToString() + " Doorway Installed.\n\n"
+ form.linkedRealm.Name + "->" + form.linkedZone.Name + "->" + form.linkedRoom.Name + "->" + form.TravelDirection.ToString());
Door door = new Door(travelDirection);
Door.ConnectedRoom d = new Door.ConnectedRoom();
d.Realm = form.linkedRealm.Name;
d.Room = form.linkedRoom.Name;
d.Zone = form.linkedZone.Name;
door.TravelRoom = d;
foreach (Door obj in Program.Room.InstalledDoors)
{
if (obj.TravelDirection == door.TravelDirection)
{
Program.Room.InstalledDoors.Remove(obj);
break;
}
}
Program.Room.InstalledDoors.Add(door);
}
}
}