using System.Collections.Generic; namespace Server.Factions.AI { public enum ReactionType { Ignore, Warn, Attack } public enum MovementType { Stand, Patrol, Follow } public class Reaction { public Reaction(Faction faction, ReactionType type) { Faction = faction; Type = type; } public Reaction(GenericReader reader) { int version = reader.ReadEncodedInt(); switch (version) { case 0: { Faction = Faction.ReadReference(reader); Type = (ReactionType)reader.ReadEncodedInt(); break; } } } public Faction Faction{ get; } public ReactionType Type{ get; set; } public void Serialize(GenericWriter writer) { writer.WriteEncodedInt(0); // version Faction.WriteReference(writer, Faction); writer.WriteEncodedInt((int)Type); } } public class Orders { private List m_Reactions; public Orders(BaseFactionGuard guard) { Guard = guard; m_Reactions = new List(); Movement = MovementType.Patrol; } public Orders(BaseFactionGuard guard, GenericReader reader) { Guard = guard; int version = reader.ReadEncodedInt(); switch (version) { case 1: { Follow = reader.ReadMobile(); goto case 0; } case 0: { int count = reader.ReadEncodedInt(); m_Reactions = new List(count); for (int i = 0; i < count; ++i) m_Reactions.Add(new Reaction(reader)); Movement = (MovementType)reader.ReadEncodedInt(); break; } } } public BaseFactionGuard Guard{ get; } public MovementType Movement{ get; set; } public Mobile Follow{ get; set; } public Reaction GetReaction(Faction faction) { Reaction reaction; for (int i = 0; i < m_Reactions.Count; ++i) { reaction = m_Reactions[i]; if (reaction.Faction == faction) return reaction; } reaction = new Reaction(faction, faction == null || faction == Guard.Faction ? ReactionType.Ignore : ReactionType.Attack); m_Reactions.Add(reaction); return reaction; } public void SetReaction(Faction faction, ReactionType type) { Reaction reaction = GetReaction(faction); reaction.Type = type; } public void Serialize(GenericWriter writer) { writer.WriteEncodedInt(1); // version writer.Write(Follow); writer.WriteEncodedInt(m_Reactions.Count); for (int i = 0; i < m_Reactions.Count; ++i) m_Reactions[i].Serialize(writer); writer.WriteEncodedInt((int)Movement); } } }