From e8b487b0d2c1dc622256b89642ac291632f101fc Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Fri, 20 Apr 2018 13:08:58 +0200 Subject: More improvements to shooting. --- src/game/assets.cpp | 4 +++- src/game/effects.cpp | 12 ++++++---- src/game/game.hpp | 14 +++++++----- src/game/unit_soldier.cpp | 57 ++++++++++++++++++++++++++++------------------- 4 files changed, 53 insertions(+), 34 deletions(-) (limited to 'src/game') diff --git a/src/game/assets.cpp b/src/game/assets.cpp index 05b647a..0148e27 100644 --- a/src/game/assets.cpp +++ b/src/game/assets.cpp @@ -86,9 +86,11 @@ void load(void) fx.explosion.load("assets/fx/explosion_", 7); fx.explosion_sound.load("assets/fx/explosion.ogg"); - fx.explosion_sound.volume = 3.0f; + fx.explosion_sound.volume = 12.0f; fx.ricochet.load("assets/fx/ricochet_", 3); fx.ricochet_sound.load("assets/fx/ricochet.ogg"); + fx.water_splash.load("assets/fx/water_splash_", 3); + fx.water_splash_sound.load("assets/fx/water_splash.ogg"); deco.stone.load("assets/deco/stone_", 1); deco.stone_cracked.load("assets/deco/stone_cracked_", 1); diff --git a/src/game/effects.cpp b/src/game/effects.cpp index 501b296..daa2770 100644 --- a/src/game/effects.cpp +++ b/src/game/effects.cpp @@ -182,11 +182,12 @@ void fx_explosion_t::render_to(render::state_t *render) render->render(phase, &assets::fx.explosion, render_bounds, sf::Color::White); } -fx_ricochet_t::fx_ricochet_t(state_t *game_, v2f_t x_) : effect_t(game_) +fx_bullet_miss_t::fx_bullet_miss_t(state_t *game_, v2f_t x_, bool water_) : effect_t(game_) { ttl = game->now + 0.3; x = x_; + water = water_; render_bounds[0] = x - v2f_t(0.12f, 0.12f); render_bounds[1] = x + v2f_t(0.12f, 0.12f); @@ -197,13 +198,16 @@ fx_ricochet_t::fx_ricochet_t(state_t *game_, v2f_t x_) : effect_t(game_) ignore_waking = true; wake(); - assets::fx.ricochet_sound.play_3d(x); + if (water) + assets::fx.water_splash_sound.play_3d(x); + else + assets::fx.ricochet_sound.play_3d(x); } -void fx_ricochet_t::render_to(render::state_t *render) +void fx_bullet_miss_t::render_to(render::state_t *render) { double phase = (game->now - ttl) / 0.3f; - render->render(phase, &assets::fx.ricochet, render_bounds, sf::Color::White); + render->render(phase, (water ? &assets::fx.water_splash : &assets::fx.ricochet), render_bounds, sf::Color::White); } } // namespace game diff --git a/src/game/game.hpp b/src/game/game.hpp index 61ea146..1a28413 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -86,8 +86,8 @@ namespace game { } repl_assets_t; typedef struct { - render::animated_texture_t blood, flash, explosion, ricochet; - audio::sound_t explosion_sound, ricochet_sound; + render::animated_texture_t blood, flash, explosion, ricochet, water_splash; + audio::sound_t explosion_sound, ricochet_sound, water_splash_sound; } fx_assets_t; typedef struct { @@ -249,7 +249,8 @@ namespace game { bool rocket_fired = false; void check_area(void); - void shoot(v2f_t aim); + void shoot(v2f_t from, v2f_t at, int damage); + void fire_shotgun(v2f_t aim); void target_and_attack(void); unit_soldier_t(game::state_t *game_); @@ -390,12 +391,13 @@ namespace game { void render_to(render::state_t *render); }; - class fx_ricochet_t : public effect_t { + class fx_bullet_miss_t : public effect_t { v2f_t x; + bool water; public: - fx_ricochet_t(game::state_t *game_, v2f_t x_); - ~fx_ricochet_t(void) {}; + fx_bullet_miss_t(game::state_t *game_, v2f_t x_, bool water_); + ~fx_bullet_miss_t(void) {}; void render_to(render::state_t *render); }; diff --git a/src/game/unit_soldier.cpp b/src/game/unit_soldier.cpp index 4cf840d..2131493 100644 --- a/src/game/unit_soldier.cpp +++ b/src/game/unit_soldier.cpp @@ -78,17 +78,39 @@ static v2f_t spread_aim(v2f_t x, v2f_t aim, float cof, procgen::prng_t *prng) sin(dth) * tmp[0] + cos(dth) * tmp[1]); } -void unit_soldier_t::shoot(v2f_t aim) +void unit_soldier_t::shoot(v2f_t from, v2f_t at, int damage) { - v2f_t end; world::trace_t trace; - v2f_t muzzle_point; fx_tracer_t *tracer; + + trace = world->ray_v_all_p3d(from, at, CF_SOLID|CF_BODY|CF_BODY_SMALL, -1, this); + if (trace.hit && trace.ent) { + entity_t *ent = dynamic_cast(trace.ent); + ent->damage(damage, this); + } + + tracer = new fx_tracer_t(game, from, at); + tracer->place(&game->world); + + if (trace.hit && (!trace.ent || trace.ent->type == ET_UNIT)) { + fx_bullet_miss_t *bullet_miss; + bool water; + + water = (trace.tile && trace.tile->type == TILE_WATER); + bullet_miss = new fx_bullet_miss_t(game, trace.end, water); + bullet_miss->place(&game->world); + } +} + +void unit_soldier_t::fire_shotgun(v2f_t aim) +{ + v2f_t muzzle_point; + world::trace_t trace; fx_flash_t *flash; - end = spread_aim(x, aim, 0.1f, &game->prng); + muzzle_point = x + v2f_t(0, -0.7f); - trace = world->ray_v_all_p3d(x, end, CF_SOLID|CF_BODY|CF_BODY_SMALL, -1, this); + trace = world->ray_v_all_p3d(x, aim, CF_SOLID|CF_BODY|CF_BODY_SMALL, -1, this); if (!manual_firing && trace.hit && trace.ent && trace.ent->type == ET_UNIT) { unit_t *unit = dynamic_cast(trace.ent); @@ -98,31 +120,20 @@ void unit_soldier_t::shoot(v2f_t aim) return; } - muzzle_point = x + v2f_t(0, -1.0f); + for (size_t i = 0; i < 5; i++) { + v2f_t end; - tracer = new fx_tracer_t(game, muzzle_point, trace.end); - tracer->place(&game->world); + end = spread_aim(muzzle_point, aim, 0.1f, &game->prng); + shoot(muzzle_point, end, 1); + } flash = new fx_flash_t(game, muzzle_point, 5.0f, sf::Color(255, 170, 50, 80)); flash->place(&game->world); - last_attack = game->now; - assets::soldier.fire.play_3d(x); - - if (trace.hit && trace.ent) { - entity_t *ent = dynamic_cast(trace.ent); - ent->damage(3, this); - } - - if (!trace.hit || (trace.ent && trace.ent->type != ET_UNIT)) { - fx_ricochet_t *ricochet; - - ricochet = new fx_ricochet_t(game, trace.end); - ricochet->place(&game->world); - } } + void unit_soldier_t::target_and_attack(void) { unit_t *target; @@ -155,7 +166,7 @@ skip_targetting: if (last_attack + game->prng.next_float(1.4f, 1.6f) > game->now) return; - shoot(aim); + fire_shotgun(aim); } void unit_soldier_t::on_think(void) -- cgit