diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | src/common.hpp | 8 | ||||
-rw-r--r-- | src/game/effects.cpp | 37 | ||||
-rw-r--r-- | src/game/game.cpp | 15 | ||||
-rw-r--r-- | src/game/game.hpp | 23 | ||||
-rw-r--r-- | src/game/units.cpp | 5 | ||||
-rw-r--r-- | src/render.cpp | 2 |
7 files changed, 85 insertions, 6 deletions
@@ -10,6 +10,7 @@ PP_LD := $(PP_BOLD)$(shell tput setf 2)LD$(PP_RESET) PP_RM := $(PP_BOLD)$(shell tput setf 4)RM$(PP_RESET) SRC := src/game/assets.cpp \ + src/game/effects.cpp \ src/game/game.cpp \ src/game/interface.cpp \ src/game/units.cpp \ diff --git a/src/common.hpp b/src/common.hpp index 6ce6c11..c946b80 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -186,6 +186,7 @@ namespace game { bool load_assets(void); class unit_t; + class effect_t; class roll_params_t { public: @@ -202,8 +203,9 @@ namespace game { std::unordered_set<unit_t*> selected_units; std::unordered_set<unit_t*> awake_units; - procgen::prng_t dice_prng; + std::unordered_set<effect_t*> effects; + procgen::prng_t dice_prng; public: world::world_t world; interface::state_t *interface; @@ -218,6 +220,8 @@ namespace game { void command(v2f_t x); size_t roll(roll_params_t *P); + + void add_effect(effect_t *effect); }; } @@ -320,7 +324,7 @@ namespace render { void render_text(v2f_t x, float height, std::string str, text_align_t align, sf::Color color); void render_rect(rectf_t rect, sf::Color color); void render_hlrect(rectf_t rect, sf::Color color); - void render_arrow(v2f_t x0, v2f_t x1, sf::Color color); + void render_line(v2f_t x0, v2f_t x1, sf::Color color); void debug_path(std::list<v2f_t> *path); }; diff --git a/src/game/effects.cpp b/src/game/effects.cpp new file mode 100644 index 0000000..99c8be8 --- /dev/null +++ b/src/game/effects.cpp @@ -0,0 +1,37 @@ +#include "game.hpp" + +namespace game { + +effect_t::effect_t(state_t *game_) : world::entity_t(ET_EFFECT) +{ + game = game_; +} + +fx_tracer_t::fx_tracer_t(state_t *game_, v2f_t x0_, v2f_t x1_) : effect_t(game_) +{ + ttl = game->now + 0.07; + + x0 = x0_; + x1 = x1_; + + render_bounds[0] = x0; + render_bounds[1] = x1; + render_bounds = render_bounds.norm(); +} + +void fx_tracer_t::render_to(render::state_t *render) +{ + v2f_t x0l, x1l; + float t; + + t = 1.0f - (ttl - game->now) / 0.07f * 0.7f; + + x0l[0] = lerp(x0[0], x1[0], t); + x0l[1] = lerp(x0[1], x1[1], t); + x1l[0] = lerp(x0[0], x1[0], t + 0.3f); + x1l[1] = lerp(x0[1], x1[1], t + 0.3f); + + render->render_line(x0l, x1l, sf::Color::Yellow); +} + +} // namespace game diff --git a/src/game/game.cpp b/src/game/game.cpp index 96f76d3..1619de0 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -82,6 +82,12 @@ void state_t::command(v2f_t x) } } +void state_t::add_effect(effect_t *effect) +{ + effects.insert(effect); + effect->link(&world); +} + void state_t::tick(double now_, double dt_) { union { @@ -145,6 +151,15 @@ void state_t::tick(double now_, double dt_) i++; } } + + for (auto i = std::begin(effects); i != std::end(effects);) { + if (now > (*i)->ttl) { + (*i)->unlink(); + //delete *i; FIXME + i = effects.erase(i); + } else + i++; + } } roll_params_t::roll_params_t(size_t sides_) diff --git a/src/game/game.hpp b/src/game/game.hpp index a952576..0a1d0ca 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -2,7 +2,8 @@ namespace game { enum { - ET_UNIT + ET_UNIT, + ET_EFFECT }; enum { @@ -119,7 +120,7 @@ namespace game { v2f_t last_target_x; public: - human_t(game::state_t *game); + human_t(game::state_t *game_); void render_to(render::state_t *render); void wake(unit_t *by_whom); @@ -132,7 +133,7 @@ namespace game { double next_targetting = -INFINITY; public: - alien_t(game::state_t *game); + alien_t(game::state_t *game_); void render_to(render::state_t *render); void wake(unit_t *by_whom); @@ -140,4 +141,20 @@ namespace game { void think(void); void die(void); }; + + class effect_t : public world::entity_t { + public: + game::state_t *game; + + double ttl = +INFINITY; + effect_t(game::state_t *game_); + }; + + class fx_tracer_t : public effect_t { + v2f_t x0, x1; + + public: + fx_tracer_t(game::state_t *game_, v2f_t x0_, v2f_t x1_); + void render_to(render::state_t *render); + }; }; diff --git a/src/game/units.cpp b/src/game/units.cpp index 0f992f9..c50a3fb 100644 --- a/src/game/units.cpp +++ b/src/game/units.cpp @@ -297,8 +297,13 @@ void human_t::think(void) trace = world->trace(x, target->x, CF_SOLID); if (!trace.hit) { + fx_tracer_t *tracer; + last_attack = game->now; try_attack(target); + + tracer = new fx_tracer_t(game, x, target->x); + game->add_effect(tracer); } } diff --git a/src/render.cpp b/src/render.cpp index d852b24..a7c6ba6 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -234,7 +234,7 @@ void state_t::render_hlrect(rectf_t rect, sf::Color color) wot_rect.setOutlineColor(sf::Color::Transparent); } -void state_t::render_arrow(v2f_t x0, v2f_t x1, sf::Color color) +void state_t::render_line(v2f_t x0, v2f_t x1, sf::Color color) { sf::Vertex line[2] = { sf::Vertex(x0, color), |