#region Arthea License
/***********************************************************************
* Arthea MUD by R. Jennings (2007) http://arthea.googlecode.com/ *
* By using this code you comply with the Artistic and GPLv2 Licenses. *
***********************************************************************/
#endregion
using System.Text;
using System.Xml.Serialization;
using Arthea.Connections.Players;
using Arthea.Continents.Areas.Rooms.Enums;
using Arthea.Creation;
using Arthea.Environment;
using Arthea.Interfaces;
namespace Arthea.Continents.Areas.Rooms.Exits
{
/// <summary>
/// Implements a room exit
/// </summary>
public class Exit
{
#region [rgn] Fields (5)
private Direction direction;
private ExitFlags flags = new ExitFlags();
private uint key;
private string keyword;
private ToRoom toRoom;
#endregion [rgn]
#region [rgn] Constructors (3)
/// <summary>
/// Initializes a new instance of the <see cref="Exit"/> class.
/// </summary>
/// <param name="toRoom">To room.</param>
/// <param name="dir">The dir.</param>
public Exit(Room toRoom, Direction dir)
{
this.toRoom = new ToRoom(toRoom);
direction = dir;
}
/// <summary>
/// Initializes a new instance of the <see cref="Exit"/> class.
/// </summary>
/// <param name="id">The id.</param>
/// <param name="dir">The dir.</param>
public Exit(uint id, Direction dir)
{
ToRoom = new ToRoom(id);
direction = dir;
}
/// <summary>
/// Initializes a new instance of the <see cref="Exit"/> class.
/// </summary>
public Exit()
{
}
#endregion [rgn]
#region [rgn] Properties (6)
/// <summary>
/// Gets or sets the direction.
/// </summary>
/// <value>The direction.</value>
[XmlAttribute]
public Direction Direction
{
get { return direction; }
set { direction = value; }
}
/// <summary>
/// Gets or sets the flags.
/// </summary>
/// <value>The flags.</value>
public ExitFlags Flags
{
get { return flags; }
set { flags = value; }
}
/// <summary>
/// Gets or sets the key.
/// </summary>
/// <value>The key.</value>
public uint Key
{
get { return key; }
set { key = value; }
}
/// <summary>
/// Gets or sets the keyword.
/// </summary>
/// <value>The keyword.</value>
public string Keyword
{
get { return keyword; }
set { keyword = value; }
}
/// <summary>
/// Gets or sets to room.
/// </summary>
/// <value>To room.</value>
[XmlIgnore]
public ToRoom ToRoom
{
get { return toRoom; }
set { toRoom = value; }
}
/// <summary>
/// Gets or sets the toRoom id.
/// </summary>
/// <value>The ToRoom id.</value>
[XmlElement("ToRoom")]
public uint XmlToRoom
{
get { return toRoom.Id; }
set { toRoom = new ToRoom(value); }
}
#endregion [rgn]
#region [rgn] Methods (2)
// [rgn] Public Methods (2)
/// <summary>
/// Reverses the specified dir.
/// </summary>
/// <param name="dir">The dir.</param>
/// <returns></returns>
public static Direction Reverse(Direction dir)
{
switch (dir)
{
case Direction.North:
return Direction.South;
case Direction.South:
return Direction.North;
case Direction.East:
return Direction.West;
case Direction.West:
return Direction.East;
case Direction.Up:
return Direction.Down;
case Direction.Down:
return Direction.Up;
default:
Log.Error("Invalid direction.");
return 0;
}
}
/// <summary>
/// Returns a <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
/// </summary>
/// <returns>
/// A <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.
/// </returns>
public override string ToString()
{
StringBuilder buf = new StringBuilder();
buf.Append(direction.ToString());
buf.Append(" - To Room [");
buf.Append(toRoom.Value.ToString());
buf.Append("] Flags [");
buf.Append(flags.ToString());
buf.Append("] Keyword: [");
buf.Append(keyword);
buf.Append("] Key: [");
buf.Append(key.ToString());
buf.Append("]");
return buf.ToString();
}
#endregion [rgn]
}
/// <summary>
/// Implements a room an exit points to.
/// Used for loading an exit before a room exists.
/// </summary>
public class ToRoom : CustomEditType
{
#region [rgn] Fields (2)
private uint id;
private Room room;
#endregion [rgn]
#region [rgn] Constructors (2)
/// <summary>
/// Initializes a new instance of the <see cref="ToRoom"/> class.
/// </summary>
/// <param name="id">The id.</param>
public ToRoom(uint id)
{
this.id = id;
}
/// <summary>
/// Initializes a new instance of the <see cref="ToRoom"/> class.
/// </summary>
/// <param name="room">The room.</param>
public ToRoom(Room room)
{
id = room.Id;
this.room = room;
}
#endregion [rgn]
#region [rgn] Properties (2)
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
public uint Id
{
get { return id; }
set { id = value; }
}
/// <summary>
/// Gets or sets the value.
/// </summary>
/// <value>The value.</value>
[XmlIgnore]
public Room Value
{
get { return room; }
set { room = value; }
}
#endregion [rgn]
#region [rgn] Methods (1)
// [rgn] Public Methods (1)
/// <summary>
/// Sets the value.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="editer">Editer information.</param>
/// <param name="argument">The argument.</param>
public void CustomEdit(Player player, OlcField editer, String argument)
{
uint toRoomId;
if (!uint.TryParse(argument, out toRoomId))
{
player.WriteLine("That is not a valid room id.");
return;
}
Room toRoom = Lists.Rooms[toRoomId];
if (toRoom == null)
{
player.WriteLine("That room does not exist.");
return;
}
room = toRoom;
id = toRoomId;
player.WriteLine("Exit now leads to room {0}.", toRoomId);
}
#endregion [rgn]
}
}