104 lines
2.4 KiB
C++
104 lines
2.4 KiB
C++
#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<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
|