#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;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using Arthea.Clans;
using Arthea.Connections.Players;
using Arthea.Continents.Areas.Characters;
using Arthea.Continents.Areas.Items;
using Arthea.Continents.Areas.Items.Enums;
using Arthea.Continents.Areas.Resets;
using Arthea.Continents.Areas.Rooms;
using Arthea.Continents.Areas.Rooms.Enums;
using Arthea.Creation;
using Arthea.Creation.Attributes;
using Arthea.Database.Interfaces;
using Arthea.Environment;
namespace Arthea.Continents.Areas
{
/// <summary>
/// Implementation of an area.
/// </summary>
public class Area : Indexed
{
#region [rgn] Fields (17)
private short age;
private uint baseId;
[EditIgnore] private CharIndexList characters = new CharIndexList();
[CustomEdit("EditClan")] private Clan clan;
[CustomEdit("EditContinent")] private Continent continent;
private string credits;
private RoomType defaultRoomType = RoomType.Inside;
private string description;
private string fileName;
private AreaFlags flags = new AreaFlags();
[EditIgnore] private ItemIndexList items = new ItemIndexList();
private uint maxId;
private string name;
private short players;
private ResetList resets = new ResetList();
private short resetTime = 30;
[EditIgnore] private RoomList rooms = new RoomList();
#endregion [rgn]
#region [rgn] Constructors (2)
/// <summary>
/// Initializes a new instance of the <see cref="Area"/> class.
/// </summary>
/// <param name="continent">The continent.</param>
/// <param name="name">The name.</param>
public Area(Continent continent, string name)
{
Continent = continent;
this.name = name;
}
/// <summary>
/// Initializes a new instance of the <see cref="Area"/> class.
/// </summary>
public Area()
{
}
#endregion [rgn]
#region [rgn] Properties (19)
/// <summary>
/// Gets or sets the age.
/// </summary>
/// <value>The age.</value>
[XmlIgnore]
public short Age
{
get { return age; }
set { age = value; }
}
/// <summary>
/// Gets or sets the base id.
/// </summary>
/// <value>The base id.</value>
public uint BaseId
{
get { return baseId; }
set { baseId = value; }
}
/// <summary>
/// Gets or sets the characters.
/// </summary>
/// <value>The characters.</value>
public CharIndexList Characters
{
get { return characters; }
set { characters = value; }
}
/// <summary>
/// Gets or sets the clan.
/// </summary>
/// <value>The clan.</value>
[XmlIgnore]
public Clan Clan
{
get { return clan; }
set { clan = value; }
}
/// <summary>
/// Gets or sets the continent.
/// </summary>
/// <value>The continent.</value>
[XmlIgnore]
public Continent Continent
{
get { return continent; }
set
{
continent = value;
if (continent != null)
defaultRoomType = continent.DefaultAreaType;
}
}
/// <summary>
/// Gets or sets the credits.
/// </summary>
/// <value>The credits.</value>
public string Credits
{
get { return credits; }
set { credits = value; }
}
/// <summary>
/// Gets or sets the default room type.
/// </summary>
/// <value>The default room type.</value>
public RoomType DefaultRoomType
{
get { return defaultRoomType; }
set { defaultRoomType = value; }
}
/// <summary>
/// Gets or sets the description.
/// </summary>
/// <value>The description.</value>
public string Description
{
get { return description; }
set { description = value; }
}
/// <summary>
/// Gets or sets the name of the file.
/// </summary>
/// <value>The name of the file.</value>
[XmlIgnore]
public string FileName
{
get { return Paths.AreaDir + fileName; }
set
{
if (string.IsNullOrEmpty(value))
throw new Exception("File name cannot be empty.");
if (Persistance.XmlFileExists(FileName)
&& fileName != value)
{
File.Move(Persistance.XmlFileName(FileName),
Persistance.XmlFileName(Paths.AreaDir + value));
}
fileName = value;
}
}
/// <summary>
/// Gets or sets the flags.
/// </summary>
/// <value>The flags.</value>
public AreaFlags Flags
{
get { return flags; }
set { flags = value; }
}
/// <summary>
/// Gets or sets the items.
/// </summary>
/// <value>The items.</value>
public ItemIndexList Items
{
get { return items; }
set { items = value; }
}
/// <summary>
/// Gets or sets the max id.
/// </summary>
/// <value>The max id.</value>
public uint MaxId
{
get { return maxId; }
set { maxId = 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 players.
/// </summary>
/// <value>The players.</value>
[XmlIgnore]
public short Players
{
get { return players; }
set { players = value; }
}
/// <summary>
/// Gets or sets the resets.
/// </summary>
/// <value>The resets.</value>
public ResetList Resets
{
get { return resets; }
set { resets = value; }
}
/// <summary>
/// Gets or sets the reset time.
/// </summary>
/// <value>The reset time.</value>
public short ResetTime
{
get { return resetTime; }
set { resetTime = value; }
}
/// <summary>
/// Gets or sets the rooms.
/// </summary>
/// <value>The rooms.</value>
public RoomList Rooms
{
get { return rooms; }
set { rooms = value; }
}
/// <summary>
/// Gets or set the clan as a string
/// </summary>
/// <value>The clan name</value>
[XmlElement("Clan")]
public string XmlClan
{
get { return clan != null ? clan.Name : string.Empty; }
set { clan = Lists.Clans.FindName(value); }
}
/// <summary>
/// Gets or sets the continent name.
/// </summary>
/// <value>The continent name.</value>
[XmlElement("Continent")]
public string XmlContinent
{
get
{
if (continent != null)
return continent.Name;
else
return string.Empty;
}
set { continent = Lists.Continents.FindName(value); }
}
/// <summary>
/// Gets the id.
/// </summary>
/// <value>The id.</value>
public uint Id
{
get { return baseId; }
}
#endregion [rgn]
#region [rgn] Methods (12)
// [rgn] Public Methods (12)
/// <summary>
/// Attaches this instance to applicable lists.
/// </summary>
public void Attach()
{
if (continent != null)
continent.Areas.Add(this);
Lists.Areas.Add(this);
}
/// <summary>
/// Creates an instance for editing by a player.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="argument">The argument.</param>
public static void Create(Player player, String argument)
{
Area area = new Area(player.Room.Area.Continent, argument);
area.FileName = string.Format("area{0}", Lists.Areas.Count);
area.Credits = player.Name;
KeyValuePair<uint, uint> ids = Lists.Areas.FindFreeIdRange(99);
area.BaseId = ids.Key;
area.MaxId = ids.Value;
if (area.Continent != null)
{
area.DefaultRoomType = area.Continent.DefaultAreaType;
}
area.Attach();
Room newRoom = new Room();
newRoom.Area = area;
newRoom.Name = area.Name;
newRoom.Id = area.baseId;
newRoom.Type = area.defaultRoomType;
newRoom.Attach();
player.Room = newRoom;
player.WriteLine("Area created.");
player.Connection.Edit(area);
}
/// <summary>
/// Creates the default area.
/// </summary>
public static void CreateDefaultArea()
{
Area area = new Area(null, "The Void");
area.Attach();
area.FileName = "void.xml";
Room room = new Room(area, Globals.Limbo, "Limbo", "You are floating in darkness.");
room.Attach();
CharIndex mob = new CharIndex(area, 1, 1, "soul lost", "a lost soul",
"Another soul is here looking lost.");
mob.Attach();
ItemIndex item = new ItemIndex(area, 1, "book", "the arthea history book",
"A thick leather book floats here.", ItemType.Trash);
item.Attach();
area.Resets.Add(new ItemReset(room, item, 1));
area.Resets.Add(new CharReset(room, mob, 1));
}
/// <summary>
/// Edits the clan.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="editor">The field editor.</param>
/// <param name="argument">The argument.</param>
public static void EditClan(Player player, OlcField editor, String argument)
{
Clan clan = Lists.Clans.FindName(argument);
if (clan == null)
{
player.WriteLine("No such clan.");
return;
}
editor.Set(clan);
player.WriteLine("Clan set to {0}.", clan.Name);
}
/// <summary>
/// Edits the continent.
/// </summary>
/// <param name="player">The player.</param>
/// <param name="editor">The field editor.</param>
/// <param name="argument">The argument.</param>
public static void EditContinent(Player player, OlcField editor, String argument)
{
Continent c = Lists.Continents.FindName(argument);
if (c == null)
{
player.WriteLine("No such continent.");
return;
}
editor.Set(c);
player.WriteLine("Continent set to {0}.", c.Name);
}
/// <summary>
/// Gets the next char id.
/// </summary>
/// <returns></returns>
public uint GetNextCharId()
{
if (characters.Count == maxId)
{
return 0;
}
else
{
return baseId + (uint) characters.Count;
}
}
/// <summary>
/// Gets the next item id.
/// </summary>
/// <returns></returns>
public uint GetNextItemId()
{
if (items.Count == maxId)
{
return 0;
}
else
{
return baseId + (uint) items.Count;
}
}
/// <summary>
/// Gets the next room id.
/// </summary>
/// <returns></returns>
public uint GetNextRoomId()
{
if (rooms.Count == maxId)
{
return 0;
}
else
{
return baseId + (uint) rooms.Count;
}
}
/// <summary>
/// Releases this instance from applicable lists.
/// </summary>
public void Release()
{
if (continent != null)
continent.Areas.Remove(this);
Lists.Areas.Remove(this);
}
/// <summary>
/// Saves this instance.
/// </summary>
public void Save()
{
Persistance.Save(FileName, this);
}
/// <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 name;
}
/// <summary>
/// Updates this instance.
/// </summary>
public void Update()
{
if (Server.Instance.State == ServerState.Booting ||
(players > 0 && ++age >= resetTime/2) ||
age >= resetTime)
{
resets.Update();
age = 0;
}
}
#endregion [rgn]
}
}