#ifndef EQUIPMENT_H #define EQUIPMENT_H #include "core/io/resource.h" #include "scene/main/node.h" class ActorBody; struct DamageEvent { DamageEvent(int damage, ActorBody *source); int compound_damage{1}; int get_initial_damage() const; ActorBody *get_source() const; private: int initial_damage{1}; ActorBody *source{nullptr}; }; class DamageModifier { public: virtual DamageEvent apply(DamageEvent event, ActorBody *target) = 0; }; class DamageStats : public Resource, public DamageModifier { GDCLASS(DamageStats, Resource); static void _bind_methods(); public: virtual DamageEvent apply(DamageEvent event, ActorBody *target) override; void set_damage_add(int val); int get_damage_add() const; void set_damage_mul(float val); float get_damage_mul() const; void set_defend_add(int val); int get_defend_add() const; void set_defend_mul(float val); float get_defend_mul() const; public: int damage_add{0}; float damage_mul{1.f}; int defend_add{0}; float defend_mul{1.f}; }; class EquipItem : public Resource, public DamageModifier { GDCLASS(EquipItem, Resource); static void _bind_methods(); public: virtual DamageEvent apply(DamageEvent event, ActorBody *target) override; void set_stats(Ref stats); Ref get_stats() const; private: Ref stats{}; }; class Weapon : public EquipItem { GDCLASS(Weapon, EquipItem); static void _bind_methods(); public: void set_base_damage(int amount); int get_base_damage() const; DamageEvent create_base_damage_event(ActorBody *source); private: int base_damage{1}; }; enum ArmorType { Helmet, Chest, Legs }; class Armor : public EquipItem { GDCLASS(Armor, EquipItem); static void _bind_methods(); public: void set_armor_type(int type); int get_armor_type() const; private: ArmorType type{}; }; class Equipment : public Node, public DamageModifier { GDCLASS(Equipment, Node); static void _bind_methods(); public: virtual DamageEvent apply(DamageEvent event, ActorBody *target) override; void set_weapon(Ref weapon); Ref get_weapon() const; void set_helmet(Ref helmet); Ref get_helmet() const; void set_chest(Ref chest); Ref get_chest() const; void set_legs(Ref legs); Ref get_legs() const; private: Ref weapon{}; Ref helmet{}; Ref chest{}; Ref legs{}; }; #endif // !EQUIPMENT_H