diff options
author | Paweł Redman <pawel.redman@gmail.com> | 2018-04-21 14:56:23 +0200 |
---|---|---|
committer | Paweł Redman <pawel.redman@gmail.com> | 2018-04-21 14:56:23 +0200 |
commit | f6b478403e73c9d85f32d6ab6014bb45f82dd503 (patch) | |
tree | 2430a46c570f5b6d87dfa2dee60210e570c8ed7e /src/game/game.cpp | |
parent | 8d740f470fb5ed5f63a3d59d3867189626e285b9 (diff) |
Redo how explosions deal damage.
Diffstat (limited to 'src/game/game.cpp')
-rw-r--r-- | src/game/game.cpp | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/game/game.cpp b/src/game/game.cpp index 72aabf2..361fa83 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -431,33 +431,37 @@ void state_t::compute_ambience(render::state_t *render) void state_t::explosion(v2f_t x) { fx_explosion_t *explosion; + const float r = 5.0f; + rectf_t rect; - explosion = new fx_explosion_t(this, x); - explosion->place(&world); + rect[0] = x - v2f_t(r, r); + rect[1] = x + v2f_t(r, r); - for (size_t i = 0; i < 60; i++) { - v2f_t end; + for (world::entity_t *ent : world.get_entities(rect, -1)) { + v2f_t center; + float dist, damage; world::trace_t trace; - fx_tracer_t *tracer; - entity_t *ent; - int damage; + entity_t *g_ent; - end = x + prng.unit_vec2() * 6.0f; - trace = world.ray_v_all(x, end, CF_SURFACE|CF_SOLID|CF_BODY|CF_BODY_SMALL|CF_DECOS, nullptr); + center = ent->cmodel.bounds.center(); - tracer = new fx_tracer_t(this, x, trace.end); - tracer->place(&world); - - if (!trace.hit) + dist = (center - x).len(); + if (dist > r) continue; - if (!trace.ent) + trace = world.ray_v_all(x, center, CF_SOLID, ent); + if (trace.frac < 1.0f) continue; - ent = dynamic_cast<entity_t*>(trace.ent); - damage = pow(1 - trace.frac, 2.0f) * 20.0f; - ent->damage(damage, nullptr); + damage = clamp(40.0f / dist, 0.0f, 1000.0f); + g_ent = dynamic_cast<entity_t*>(ent); + g_ent->damage((int)damage, nullptr); } + + explosion = new fx_explosion_t(this, x); + explosion->place(&world); + + hivemind_alert(x, 20.0f, false, v2f_t(0, 0)); } } //namespace game |