diff options
Diffstat (limited to 'sim/src/weapons.cpp')
-rw-r--r-- | sim/src/weapons.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
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 <kurator/sim/weapons.h> + +#include <entt/entt.hpp> + +#include <kurator/sim/events.h> +#include <kurator/sim/FloatingMovement.h> +#include <kurator/sim/HitPoints.h> +#include <kurator/sim/State.h> +#include <kurator/universe/TurretType.h> + + +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<HitPoints>(target); + const auto& movement = ctx.registry.get<FloatingMovement>(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<Turret>(); + 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 |