summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2018-04-20 13:08:58 +0200
committerPaweł Redman <pawel.redman@gmail.com>2018-04-20 13:08:58 +0200
commite8b487b0d2c1dc622256b89642ac291632f101fc (patch)
tree02df8baf050da52e22d9eb8ab55b45b0e242d87c /src/game
parentf4fe2c7f10a8d2e253de27f1a540ca68184d5d29 (diff)
More improvements to shooting.
Diffstat (limited to 'src/game')
-rw-r--r--src/game/assets.cpp4
-rw-r--r--src/game/effects.cpp12
-rw-r--r--src/game/game.hpp14
-rw-r--r--src/game/unit_soldier.cpp57
4 files changed, 53 insertions, 34 deletions
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<entity_t*>(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<unit_t*>(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<entity_t*>(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)