summaryrefslogtreecommitdiff
path: root/sim/src/weapons.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sim/src/weapons.cpp')
-rw-r--r--sim/src/weapons.cpp81
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