/// Who decides an entity's actions. The sim only schedules intents for `Npc`s; a /// `Player`'s intents come from outside (input) through `Sim::set_action`. #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum EntityKind { Player, Npc, } /// What a hunter goes after. #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum Prey { Player, Kind(u16), } /// The decision strategy `Sim::think` runs for an NPC. Data, not code: it can be /// swapped at runtime (a hit hen may start fleeing) and serializes with the entity. #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum Brain { /// Never schedules anything — the player, furniture. Idle, /// Occasionally a random king move. Wander, /// Step toward the nearest prey in sight, bumping into it on contact. Wanders /// when nothing is in sight. Hunt(Prey), } pub struct Entity { pub id: u32, pub kind: EntityKind, pub type_id: u16, // sprite index into the entity tileset; also the species pub brain: Brain, pub pos: (i16, i16), pub hp: u16, pub hp_max: u16, /// Damage dealt per bump. pub attack: u16, } impl Entity { pub fn new(id: u32, kind: EntityKind, type_id: u16, brain: Brain, pos: (i16, i16), hp: u16, attack: u16) -> Self { Self { id, kind, type_id, brain, pos, hp, hp_max: hp, attack, } } }