#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.Xml.Serialization;
using Arthea.Affects;
using Arthea.Continents.Areas.Characters;
using Arthea.Continents.Areas.Items.Enums;
using Arthea.Continents.Areas.Rooms;
using Arthea.Creation.Attributes;
using Arthea.Environment;
using Arthea.Interfaces;
using Arthea.Scripts;
namespace Arthea.Continents.Areas.Items
{
/// <summary>
/// Implements an item
/// </summary>
public class Item : Scriptable
{
#region [rgn] Fields (10)
private AffectList affects = new AffectList();
private Character carriedBy;
[EditIgnore] private ItemList contents = new ItemList();
[EditShow] private ItemIndex index;
[XmlIgnore] private Room inRoom;
[EditIgnore] private Item inside;
private string name;
private string roomDescr;
private string shortDescr;
private WearLocation wearLocation = WearLocation.None;
#endregion [rgn]
#region [rgn] Constructors (2)
/// <summary>
/// Initializes a new instance of the <see cref="Item"/> class.
/// </summary>
/// <param name="item">The item.</param>
public Item(ItemIndex item)
{
index = item;
name = item.Name;
shortDescr = item.ShortDescr;
roomDescr = item.RoomDescr;
affects = item.Affects;
}
/// <summary>
/// Initializes a new instance of the <see cref="Item"/> class.
/// </summary>
public Item()
{
}
#endregion [rgn]
#region [rgn] Properties (14)
/// <summary>
/// Gets or sets the affects.
/// </summary>
/// <value>The affects.</value>
public AffectList Affects
{
get { return affects; }
set { affects = value; }
}
/// <summary>
/// Gets or sets the carried by.
/// </summary>
/// <value>The carried by.</value>
[XmlIgnore]
public Character CarriedBy
{
get { return carriedBy; }
set
{
if (value != null)
{
value.Carrying.Add(this);
}
else if (carriedBy != null)
{
carriedBy.Carrying.Remove(this);
}
carriedBy = value;
if (inRoom != null)
{
inRoom.Items.Remove(this);
inRoom = null;
}
if (inside != null)
{
inside.Contents.Remove(this);
inside = null;
}
}
}
/// <summary>
/// Gets or sets the contents.
/// </summary>
/// <value>The contents.</value>
public ItemList Contents
{
get { return contents; }
set
{
contents = value;
foreach (Item item in contents)
{
item.inside = this;
}
}
}
/// <summary>
/// Gets the id.
/// </summary>
/// <value>The id.</value>
[XmlIgnore]
public uint Id
{
get { return index.Id; }
}
/// <summary>
/// Gets or sets the index.
/// </summary>
/// <value>The index.</value>
[XmlIgnore]
public ItemIndex Index
{
get { return index; }
set { index = value; }
}
/// <summary>
/// Gets or sets the inside.
/// </summary>
/// <value>The inside.</value>
[XmlIgnore]
public Item Inside
{
get { return inside; }
set
{
if (value != null)
{
value.Contents.Add(this);
}
else if (inside != null)
{
inside.Contents.Remove(this);
}
inside = value;
if (inRoom != null)
{
inRoom.Items.Remove(this);
inRoom = null;
}
if (carriedBy != null)
{
carriedBy.Carrying.Remove(this);
carriedBy = null;
}
}
}
/// <summary>
/// Gets or sets the room.
/// </summary>
/// <value>The room.</value>
[XmlIgnore]
public Room Room
{
get { return inRoom; }
set
{
if (value != null)
{
value.Items.Add(this);
}
else if (inRoom != null)
{
inRoom.Items.Remove(this);
}
inRoom = value;
if (carriedBy != null)
{
carriedBy.Carrying.Remove(this);
carriedBy = null;
}
if (inside != null)
{
inside.Contents.Remove(this);
inside = null;
}
}
}
/// <summary>
/// Gets or sets the room descr.
/// </summary>
/// <value>The room descr.</value>
public string RoomDescr
{
get { return roomDescr; }
set { roomDescr = value; }
}
/// <summary>
/// Gets the type.
/// </summary>
/// <value>The type.</value>
[XmlIgnore]
public ItemType Type
{
get { return index.Type; }
}
/// <summary>
/// Gets or sets the wear loc.
/// </summary>
/// <value>The wear loc.</value>
public WearLocation WearLoc
{
get { return wearLocation; }
set { wearLocation = value; }
}
/// <summary>
/// Gets or sets the index id.
/// </summary>
/// <value>The index id.</value>
[XmlElement("Code")]
public uint XmlIndex
{
get { return index.Id; }
set { index = Lists.ItemIndexes[value]; }
}
/// <summary>
/// Gets or sets the XML room.
/// </summary>
/// <value>The XML room.</value>
[XmlElement("Room")]
public uint XmlRoom
{
get { return inRoom.Id; }
set { inRoom = Lists.Rooms[value]; }
}
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name
{
get { return name; }
set { name = value; }
}
/// <summary>
/// Gets or sets the short descr.
/// </summary>
/// <value>The short descr.</value>
public string ShortDescr
{
get { return shortDescr; }
set { shortDescr = value; }
}
#endregion [rgn]
#region [rgn] Methods (4)
// [rgn] Public Methods (4)
/// <summary>
/// Attaches this instance to applicable lists.
/// </summary>
public void Attach()
{
Lists.Items.Add(this);
}
/// <summary>
/// Releases this instance from applicable lists.
/// </summary>
public void Release()
{
Lists.Items.Remove(this);
if (inRoom != null)
{
inRoom.Items.Remove(this);
inRoom = null;
}
if (carriedBy != null)
{
carriedBy.Carrying.Remove(this);
carriedBy = null;
}
if (inside != null)
{
inside.Contents.Remove(this);
inside = null;
}
while (contents.Count > 0)
{
contents[0].Release();
}
}
/// <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()
{
return shortDescr;
}
/// <summary>
/// Get a string representation for a character.
/// </summary>
/// <param name="looker">The looker.</param>
/// <returns></returns>
public string ToString(Character looker)
{
return shortDescr;
}
#endregion [rgn]
#region Scriptable Members
/// <summary>
/// Creates a script of proper type.
/// </summary>
/// <returns></returns>
public Script CreateScript(ScriptCode code, String trigger)
{
return new ItemScript(code, trigger);
}
#endregion
}
}