From f6b478403e73c9d85f32d6ab6014bb45f82dd503 Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Sat, 21 Apr 2018 14:56:23 +0200 Subject: Redo how explosions deal damage. --- src/game/game.cpp | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'src/game/game.cpp') 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(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(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 -- cgit