55#include < string_view>
66#include < variant>
77
8+ #include " persistent.hpp"
89#include " types/action_result.hpp"
910#include " types/entity_fwd.hpp"
1011#include " types/math.hpp"
1112#include " types/world_fwd.hpp"
1213
1314namespace cpprl {
1415
15- class AttackComponent {
16+ class AttackComponent : public Persistent {
1617 public:
1718 AttackComponent (int damage) : damage_(damage) {}
1819 int get_damage () { return damage_; }
20+ void load (TCODZip& zip);
21+ void save (TCODZip& zip);
1922
2023 private:
2124 int damage_;
2225};
2326
24- class DefenseComponent {
27+ class DefenseComponent : public Persistent {
2528 public:
2629 DefenseComponent (int defense, int maxHp)
27- : defense (defense), hp_(maxHp), max_hp_(maxHp) {}
30+ : defense_ (defense), hp_(maxHp), max_hp_(maxHp) {}
2831
2932 int get_hp () { return hp_; }
3033 int get_max_hp () { return max_hp_; }
31- int get_defense () { return defense ; }
34+ int get_defense () { return defense_ ; }
3235
3336 void take_damage (int damage) { hp_ -= damage; }
3437 int heal (int amount);
3538 bool is_dead () { return hp_ <= 0 ; }
3639 bool is_not_dead () { return !is_dead (); }
3740 void die (Entity& owner);
41+ void load (TCODZip& zip);
42+ void save (TCODZip& zip);
3843
3944 private:
40- int defense ;
45+ int defense_ ;
4146 int hp_;
4247 int max_hp_;
4348};
4449
45- class TransformComponent {
50+ class TransformComponent : public Persistent {
4651 public:
4752 TransformComponent (int x, int y) : position_({x, y}) {}
4853 Vector2D get_position () { return position_; }
4954 void move (Vector2D new_position) { position_ = new_position; }
55+ void load (TCODZip& zip);
56+ void save (TCODZip& zip);
5057
5158 private:
5259 Vector2D position_;
5360};
5461
55- class ASCIIComponent {
62+ class ASCIIComponent : public Persistent {
5663 public:
5764 ASCIIComponent (std::string_view symbol, tcod::ColorRGB colour, int layer)
5865 : symbol_(symbol), colour_(colour), layer_(layer) {}
5966
6067 std::string_view get_symbol () { return symbol_; }
6168 tcod::ColorRGB get_colour () { return colour_; }
6269 int get_layer () { return layer_; }
70+ void load (TCODZip& zip);
71+ void save (TCODZip& zip);
6372
6473 private:
65- std::string_view symbol_;
74+ std::string symbol_;
6675 tcod::ColorRGB colour_;
6776 int layer_;
6877};
6978
70- class Container {
79+ class Container : Persistent {
7180 private:
7281 size_t size_;
7382 std::vector<Entity*> inventory_;
@@ -78,22 +87,34 @@ class Container {
7887 void remove (Entity* actor);
7988 std::vector<Entity*> get_inventory () { return inventory_; }
8089 int get_size () { return size_; }
90+
91+ void load (TCODZip& zip);
92+ void save (TCODZip& zip);
8193};
8294
83- class ConsumableComponent {
95+ class ConsumableComponent : public Persistent {
8496 public:
8597 virtual ~ConsumableComponent () = default ;
8698 // TODO: should also be an action result
8799 ActionResult pick_up (Entity* owner, Entity* wearer);
88100 ActionResult drop (Entity* owner, Entity* wearer);
89101 virtual ActionResult use (Entity* owner, Entity* wearer, World& world);
102+ virtual void load (TCODZip& zip) = 0;
103+ virtual void save (TCODZip& zip) = 0;
104+ static ConsumableComponent* create (TCODZip& zip);
105+
106+ protected:
107+ enum ConsumableType { HEALER, LIGHTNING_BOLT, CONFUSER, FIREBALL };
90108};
91109
92110class HealingConsumable final : public ConsumableComponent {
93111 public:
94112 HealingConsumable (int amount);
95113 ActionResult use (Entity* owner, Entity* wearer, World& world);
96114
115+ void load (TCODZip& zip);
116+ void save (TCODZip& zip);
117+
97118 private:
98119 int amount_;
99120};
@@ -106,6 +127,9 @@ class LightningBolt final : public ConsumableComponent {
106127 LightningBolt (float range, float damage) : range_(range), damage_(damage) {}
107128 ~LightningBolt () = default ;
108129 ActionResult use (Entity* owner, Entity* wearer, World& world);
130+
131+ void load (TCODZip& zip);
132+ void save (TCODZip& zip);
109133};
110134
111135class FireSpell final : public ConsumableComponent {
@@ -118,6 +142,9 @@ class FireSpell final : public ConsumableComponent {
118142 ~FireSpell () = default ;
119143
120144 ActionResult use (Entity* owner, Entity* Wearer, World& world);
145+
146+ void load (TCODZip& zip);
147+ void save (TCODZip& zip);
121148};
122149
123150class ConfusionSpell final : public ConsumableComponent {
@@ -130,6 +157,9 @@ class ConfusionSpell final : public ConsumableComponent {
130157 ~ConfusionSpell () = default ;
131158
132159 ActionResult use (Entity* owner, Entity* wearer, World& world);
160+
161+ void load (TCODZip& zip);
162+ void save (TCODZip& zip);
133163};
134164
135165} // namespace cpprl
0 commit comments