diff options
author | Paweł Redman <pawel.redman@gmail.com> | 2017-12-16 19:06:43 +0100 |
---|---|---|
committer | Paweł Redman <pawel.redman@gmail.com> | 2017-12-16 19:06:43 +0100 |
commit | 820e2e9d428c273e065cfe18b48c183a5cbedd75 (patch) | |
tree | e20a60780ecb4d7dbc53a641bdd86d3407c29577 /src/game/game.hpp | |
parent | c341559390ce52b47d056226fc102287dc41b304 (diff) |
Major refactor of game's entity code.
Diffstat (limited to 'src/game/game.hpp')
-rw-r--r-- | src/game/game.hpp | 80 |
1 files changed, 46 insertions, 34 deletions
diff --git a/src/game/game.hpp b/src/game/game.hpp index 4cc1077..b9a426b 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -55,21 +55,36 @@ namespace game { void load(void); } - class unit_t : public world::entity_t { - protected: - game::state_t *game; - world::world_t *world; + class entity_t : public world::entity_t { + public: + game::state_t *game = 0; + v2f_t x; + rectf_t size, render_size; + + entity_t(game::state_t *game, int type_); + ~entity_t(void) {}; + void destroy(void); - world::cmodel_t make_cmodel(v2f_t at); - void compute_bounds(); + void place(world::world_t *world); + void place(world::world_t *world, v2f_t x_); + bool always_awake = false; + bool awake = false; + double wake_time = -INFINITY; + void wake(void); + void sleep(void); + + virtual void on_think(void) = 0; + virtual void on_spawn(void) = 0; + virtual void on_wake(void) = 0; + }; + + class unit_t : public entity_t { + protected: double next_targetting = -INFINITY; double last_attack = -INFINITY; public: - v2f_t x; - rectf_t size, render_size; - world::cflags_t cflags; size_t selected = 0; typedef enum { @@ -82,8 +97,6 @@ namespace game { unit_t(game::state_t *game_, type_t type_); - virtual void think(void) = 0; - struct { bool moving = false; v2f_t dst; @@ -96,15 +109,9 @@ namespace game { float next_attempt; } move; - void place(world::world_t *world_, v2f_t x_); bool keep_moving(double speed); bool start_moving(v2f_t dst, world::cflags_t cflags); - bool awake = false; - double wake_time = -INFINITY; - virtual void wake(unit_t *by_whom) = 0; - virtual void sleep(void) = 0; - struct { size_t armor_class; roll_params_t hit_roll; @@ -116,13 +123,13 @@ namespace game { int health = 1, max_health = 1; void damage(int points, unit_t *attacker); void try_attack(unit_t *target); - virtual void die() = 0; + void die(unit_t *killer); + virtual void on_death() = 0; std::string say_text; double say_time = -INFINITY; void say(std::string str); - void render_to(render::state_t *render); }; @@ -133,34 +140,37 @@ namespace game { public: human_t(game::state_t *game_); + ~human_t(void) {}; void render_to(render::state_t *render); - void wake(unit_t *by_whom); - void sleep(void); - void think(void); - void die(void); + void on_think(void); + void on_spawn(void) {}; + void on_wake(void) {}; + void on_death(void); }; class alien_t : public unit_t { - double next_targetting = -INFINITY; - public: alien_t(game::state_t *game_); + ~alien_t(void) {}; void render_to(render::state_t *render); - void wake(unit_t *by_whom); - void sleep(void); - void think(void); - void die(void); + void on_think(void); + void on_spawn(void) {}; + void on_wake(void); + void on_death(void); }; - class effect_t : public world::entity_t { + class effect_t : public game::entity_t { public: - game::state_t *game; - double ttl = +INFINITY; + effect_t(game::state_t *game_); virtual ~effect_t() {}; + + void on_think(void); + void on_spawn(void) {}; + void on_wake(void) {}; }; class fx_tracer_t : public effect_t { @@ -168,7 +178,8 @@ namespace game { public: fx_tracer_t(game::state_t *game_, v2f_t x0_, v2f_t x1_); - ~fx_tracer_t(void) = default; + ~fx_tracer_t(void) {}; + void render_to(render::state_t *render); }; @@ -178,7 +189,8 @@ namespace game { public: fx_blood_t(game::state_t *game_, v2f_t x_, bool alien_); - ~fx_blood_t(void) = default; + ~fx_blood_t(void) {}; + void render_to(render::state_t *render); }; |