using System; using System.Collections.Generic; namespace Server { [Parsable] public abstract class Poison { /*public abstract TimeSpan Interval{ get; } public abstract TimeSpan Duration{ get; }*/ public abstract string Name { get; } public abstract int Level { get; } public static Poison Lesser => GetPoison("Lesser"); public static Poison Regular => GetPoison("Regular"); public static Poison Greater => GetPoison("Greater"); public static Poison Deadly => GetPoison("Deadly"); public static Poison Lethal => GetPoison("Lethal"); public static List Poisons { get; } = new(); public abstract Timer ConstructTimer(Mobile m); /*public abstract void OnDamage( Mobile m, ref object state );*/ public override string ToString() => Name; public static void Register(Poison reg) { var regName = reg.Name.ToLower(); for (var i = 0; i < Poisons.Count; i++) { if (reg.Level == Poisons[i].Level) { throw new Exception("A poison with that level already exists."); } if (regName == Poisons[i].Name.ToLower()) { throw new Exception("A poison with that name already exists."); } } Poisons.Add(reg); } public static Poison Parse(string value) => (int.TryParse(value, out var plevel) ? GetPoison(plevel) : null) ?? GetPoison(value); public static Poison GetPoison(int level) { for (var i = 0; i < Poisons.Count; ++i) { var p = Poisons[i]; if (p.Level == level) { return p; } } return null; } public static Poison GetPoison(string name) { for (var i = 0; i < Poisons.Count; ++i) { var p = Poisons[i]; if (Utility.InsensitiveCompare(p.Name, name) == 0) { return p; } } return null; } public static void Serialize(Poison p, IGenericWriter writer) { if (p == null) { writer.Write((byte)0); } else { writer.Write((byte)1); writer.Write((byte)p.Level); } } public static Poison Deserialize(IGenericReader reader) { switch (reader.ReadByte()) { case 1: return GetPoison(reader.ReadByte()); case 2: // no longer used, safe to remove? reader.ReadInt(); reader.ReadDouble(); reader.ReadInt(); reader.ReadTimeSpan(); break; } return null; } } }