diff options
author | Aki <please@ignore.pl> | 2022-12-31 18:12:24 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-12-31 18:12:24 +0100 |
commit | 087803532fd7dfa04bc9a39fd2886f572002d0b1 (patch) | |
tree | 808d6e8734065eddff69793d395deed0c86773f7 /sim/src/TurretControl.cpp | |
parent | 56ecf8834768fa61c299c07094c8760209f5bb45 (diff) | |
download | kurator-087803532fd7dfa04bc9a39fd2886f572002d0b1.zip kurator-087803532fd7dfa04bc9a39fd2886f572002d0b1.tar.gz kurator-087803532fd7dfa04bc9a39fd2886f572002d0b1.tar.bz2 |
Extracted TurretControl to own unit
Diffstat (limited to 'sim/src/TurretControl.cpp')
-rw-r--r-- | sim/src/TurretControl.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sim/src/TurretControl.cpp b/sim/src/TurretControl.cpp new file mode 100644 index 0000000..b5527fc --- /dev/null +++ b/sim/src/TurretControl.cpp @@ -0,0 +1,55 @@ +#include <kurator/sim/TurretControl.h> + +#include <entt/entity/registry.hpp> +#include <entt/signal/dispatcher.hpp> + +#include <kurator/sim/components.h> +#include <kurator/sim/events.h> +#include <kurator/universe/TurretType.h> + + +namespace kurator +{ +namespace sim +{ + + +void +TurretControl::update(entt::registry& registry, entt::dispatcher& dispatcher, const float dt) +{ + auto view = registry.view<TurretControl, universe::TurretType>(); + for (auto&& [entity, control, def] : view.each()) { + if (!registry.valid(control.owner)) { + registry.destroy(entity); + continue; + } + const auto& [state, transform] = registry.get<AIState, Transform>(control.owner); // no checks + if (!registry.valid(state.target)) + continue; + if (control.reload > 0.0) + control.reload -= dt; + if (control.rounds < 1 && control.reload <= 0.0) + control.rounds = def.rounds; + if (control.delay > 0.0) + control.delay -= dt; + if (control.rounds > 0 && control.delay <= 0.0) { + auto& target_points = registry.get<HitPoints>(state.target); + const auto& target = registry.get<Transform>(state.target); + const auto distance = transform.position.distance(target.position); + if (distance > def.optimal_range * 2.5) + continue; + const auto damage = def.effective_damage(distance); + if (damage > 0.0) { + target_points.health -= damage; + dispatcher.trigger(Hit{damage, control.owner, state.target}); + } + control.delay = def.rate_of_fire; + if (--control.rounds < 1) + control.reload = def.reload; + } + } +} + + +} // namespace sim +} // namespace kurator |