equipment-test/modules/tabtargeting/equipment.h
2025-06-13 14:37:16 +02:00

105 lines
2.4 KiB
C++

#ifndef EQUIPMENT_H
#define EQUIPMENT_H
#include "core/io/resource.h"
#include "core/templates/vector.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<DamageStats> stats);
Ref<DamageStats> get_stats() const;
private:
Ref<DamageStats> 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> weapon);
Ref<Weapon> get_weapon() const;
void set_helmet(Ref<Armor> helmet);
Ref<Armor> get_helmet() const;
void set_chest(Ref<Armor> chest);
Ref<Armor> get_chest() const;
void set_legs(Ref<Armor> legs);
Ref<Armor> get_legs() const;
private:
Ref<Weapon> weapon{};
Ref<Armor> helmet{};
Ref<Armor> chest{};
Ref<Armor> legs{};
};
#endif // !EQUIPMENT_H