You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
5.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace MobDB
{
[DataContract]
public class Mob
{
internal Mob(uint e)
{
Entry = e;
}
/// <summary>
/// ID of the mob.
/// </summary>
[DataMember]
public readonly uint Entry;
/// <summary>
/// (Short)name of the mob, such as "an ant". This is what we see when fighting the mob.
/// This field is an array because same longname mobs can sometimes have multiple different names.
/// Names here are automatically normalized where first letter of the name is made lower case, rest
/// is left intact. Keep that in mind when comparing names.
/// </summary>
public string[] Name
{
get
{
return _name;
}
internal set
{
_name = value ?? new string[0];
for(int i = 0; i < _name.Length; i++)
{
if(!string.IsNullOrEmpty(_name[i]))
_name[i] = MobDB.NormalizeName(_name[i]);
}
}
}
[DataMember]
private string[] _name;
/// <summary>
/// Return all names separated by a comma ",".
/// </summary>
public string Names
{
get
{
string str = "";
foreach(string x in Name)
{
if(str.Length > 0)
str += ", ";
str += x;
}
return str;
}
}
/// <summary>
/// Long name of the mob, this is what we see in room when we type look.
/// </summary>
[DataMember]
public string Longname
{
get;
internal set;
}
/// <summary>
/// Keywords of the mob, can be multiple separated with a space.
/// </summary>
[DataMember]
public string Keyword
{
get;
internal set;
}
/// <summary>
/// Level of the mob, we get this from lastkills. For non-killable mobs this is -1.
/// </summary>
[DataMember]
public int Level
{
get;
internal set;
}
/// <summary>
/// Keywords of areas this mob can be in. Have a keyword "all" if you want mob to be in any area like the Firestorm Phoenix.
/// </summary>
[DataMember]
public string[] Areas
{
get;
internal set;
}
/// <summary>
/// Override the default color of mob with this. Set to null or empty string to disable this and use
/// default color from the configuration file instead.
/// </summary>
[DataMember]
public string DefaultColor
{
get;
internal set;
}
[DataMember]
internal List<string> Flags;
[DataMember]
internal List<MobLocation> Locations = new List<MobLocation>();
/// <summary>
/// Calculate chance that mob will be in room with this ID.
/// </summary>
/// <param name="RoomId">Room ID to check mob in.</param>
/// <returns></returns>
public double GetChance(uint RoomId)
{
foreach(MobLocation ml in Locations)
{
if(ml.RoomEntry != RoomId)
continue;
return (ml.CountSeen * 100) / (double)(ml.CountSeen - ml.TimesSeen + ml.TimesVisited);
}
return 0.0;
}
/// <summary>
/// Calculate room ID with best chance of having mob in it.
/// </summary>
/// <returns></returns>
public uint GetBestRoom()
{
double b = 0.0;
uint c = uint.MaxValue;
foreach(MobLocation ml in Locations)
{
double a = GetChance(ml.RoomEntry);
if(a > b)
{
b = a;
c = ml.RoomEntry;
}
}
return c;
}
/// <summary>
/// Add a flag to mob.
/// </summary>
/// <param name="f">Flag to add.</param>
public void AddFlag(string f)
{
if(f == null)
return;
f = f.ToLower().Trim();
if(f.Length == 0)
return;
if(Flags == null)
Flags = new List<string>();
if(!Flags.Contains(f))
Flags.Add(f);
}
/// <summary>
/// Remove a flag from mob.
/// </summary>
/// <param name="f">Flag to remove.</param>
/// <returns></returns>
public bool RemoveFlag(string f)
{
if(f == null || Flags == null)
return false;
f = f.ToLower().Trim();
if(f.Length == 0)
return false;
return Flags.Remove(f);
}
public bool HasFlag(string f)
{
if(f == null)
return false;
f = f.ToLower().Trim();
if(f.Length == 0)
return false;
return Flags != null && Flags.Contains(f);
}
}
}