class TargetSelector { public: enum SelectorType { CLOSEST_MONSTER, SELECTED_MONSTER, WEARER_RANGE, SELECTED_RANGE }; TargetSelector(SelectorType type, float range); void selectTargets(Actor *wearer, TCODList& list); protected: SelectorType type; float range; }; class Effect { public: virtual bool applyTo(Actor *actor) = 0; }; class Pickable : public Persistent { public: bool pick(Actor *owner, Actor *wearer); void drop(Actor *owner, Actor *wearer); virtual bool use(Actor *owner, Actor *wearer); static Pickable *create(TCODZip &zip); protected: enum PickableType { HEALER, LIGHTNING_BOLT, CONFUSER, FIREBALL }; }; /* Sub-Pickables */ class Healer : public Pickable { public: float amount; // how much? Healer(float amount); bool use(Actor *owner, Actor *wearer); void load(TCODZip &zip); void save(TCODZip &zip); }; /* Aggro Spells */ class LightningBolt: public Pickable { public: float range, damage; LightningBolt(float range, float damage); bool use(Actor *owner, Actor *wearer); void load(TCODZip &zip); void save(TCODZip &zip); }; class Fireball : public LightningBolt { public: Fireball(float range, float damage); bool use(Actor *owner, Actor *wearer); void save(TCODZip &zip); }; class Confuser : public Pickable { public: int nbTurns; float range; Confuser(int nbTurns, float range); bool use(Actor *owner, Actor *wearer); void load(TCODZip &zip); void save(TCODZip &zip); }; /* Effects */ class HealthEffect : public Effect { public: float amount; const char *message; HealthEffect(float amount, const char *message); bool applyTo(Actor *actor); };