From 975339d07aeb193564221adff31b55a913d92a1e Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 23 Apr 2023 12:54:14 +0200 Subject: Separated Turret from AI, shuffled their units --- sim/src/weapons.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 sim/src/weapons.cpp (limited to 'sim/src/weapons.cpp') diff --git a/sim/src/weapons.cpp b/sim/src/weapons.cpp new file mode 100644 index 0000000..bd130dc --- /dev/null +++ b/sim/src/weapons.cpp @@ -0,0 +1,81 @@ +#include + +#include + +#include +#include +#include +#include +#include + + +namespace kurator +{ +namespace sim +{ + + +static bool consume(float& dt, double& target); +static bool reload_(float& dt, Turret& turret); + + +void +Turret::shoot_at(State& ctx, const entt::entity& target, const double distance) +{ + float remaining_dt = ctx.clock.dt; + while (reload_(remaining_dt, *this)) { + auto& target_points = ctx.registry.get(target); + const auto& movement = ctx.registry.get(target); + auto damage = type.effective_damage(distance, movement.speed.magnitude()); + if (damage > 0.0) { + damage = target_points.deal(damage); + ctx.dispatcher.trigger(Hit{damage, owner, target}); + } + delay = type.rate_of_fire; + if (--rounds < 1) + reload = type.reload; + } +} + + +void +update_turrets(State& ctx) +{ + auto turrets = ctx.registry.view(); + for (auto&& [entity, turret] : turrets.each()) { + if (!ctx.registry.valid(turret.owner)) { + ctx.registry.destroy(entity); + continue; + } + float remaining_dt = ctx.clock.dt; + while (remaining_dt > 0.0) { + if (reload_(remaining_dt, turret)) + break; + } + } +} + + +bool +consume(float& dt, double& target) +{ + if (target <= 0.0) + return true; + const auto _dt = dt; + dt -= target; + target -= _dt; + return target <= 0.0; +} + + +bool +reload_(float& dt, Turret& turret) // at this point move it to the class? +{ + if (turret.rounds < 1 && consume(dt, turret.reload)) + turret.rounds = turret.type.rounds; + return turret.rounds > 0 && consume(dt, turret.delay); +} + + +} // namespace sim +} // namespace kurator -- cgit v1.1