From 99ec004137d286089ed0eea7dc58080d36019742 Mon Sep 17 00:00:00 2001 From: CMDR-Vulkarius <105551758+CMDR-Vulkarius@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:05:30 +0000 Subject: [PATCH] Create indexed TubeFiredN and sum TubeFired hardware variables for missile events --- src/components/missiletubes.h | 1 + src/hardware/hardwareController.cpp | 12 ++++++++++++ src/systems/missilesystem.cpp | 3 +++ 3 files changed, 16 insertions(+) diff --git a/src/components/missiletubes.h b/src/components/missiletubes.h index 7042b39657..7e923acdd6 100644 --- a/src/components/missiletubes.h +++ b/src/components/missiletubes.h @@ -31,6 +31,7 @@ class MissileTubes : public ShipSystem { State state = State::Empty; float delay = 0.0f; int fire_count = 0; + int fired = 0; bool canLoad(EMissileWeapons type) { return (type_allowed_mask & (1 << type)); diff --git a/src/hardware/hardwareController.cpp b/src/hardware/hardwareController.cpp index 012325f867..fd52903850 100644 --- a/src/hardware/hardwareController.cpp +++ b/src/hardware/hardwareController.cpp @@ -29,6 +29,8 @@ #include "hardwareMappingEffects.h" +#include + HardwareController::~HardwareController() { for(HardwareOutputDevice* device : devices) @@ -355,6 +357,14 @@ HardwareMappingEffect* HardwareController::createEffect(std::unordered_map float SUM(Container items, Function func) + { + return static_cast(std::transform_reduce(items.cbegin(), items.cend(), 0, std::plus{}, func)); + } +} + #define SHIP_VARIABLE(name, COMP, formula) if (variable_name == name) { if (auto c = ship.getComponent()) { value = (formula); return true; } return false; } #define SHIP_VARIABLE2(name, formula) if (variable_name == name) { if (c) { value = (formula); return true; } return false; } bool HardwareController::getVariableValue(string variable_name, float& value) @@ -410,7 +420,9 @@ bool HardwareController::getVariableValue(string variable_name, float& value) SHIP_VARIABLE("TubeLoading" + string(n), MissileTubes, c->mounts.size() > n && c->mounts[n].state == MissileTubes::MountPoint::State::Loading ? 1.0f : 0.0f); SHIP_VARIABLE("TubeUnloading" + string(n), MissileTubes, c->mounts.size() > n && c->mounts[n].state == MissileTubes::MountPoint::State::Unloading ? 1.0f : 0.0f); SHIP_VARIABLE("TubeFiring" + string(n), MissileTubes, c->mounts.size() > n && c->mounts[n].state == MissileTubes::MountPoint::State::Firing ? 1.0f : 0.0f); + SHIP_VARIABLE("TubeFired" + string(n), MissileTubes, c->mounts.size() > n ? static_cast(c->mounts[n].fired) : 0.0f); } + SHIP_VARIABLE("TubeFired", MissileTubes, SUM(c->mounts, [](const MissileTubes::MountPoint & tube){return tube.fired;})); for(int n=0; n(n)); diff --git a/src/systems/missilesystem.cpp b/src/systems/missilesystem.cpp index e7778ad554..8969f9eace 100644 --- a/src/systems/missilesystem.cpp +++ b/src/systems/missilesystem.cpp @@ -48,6 +48,7 @@ void MissileSystem::update(float delta) if (game_server) { spawnProjectile(entity, tube, 0, {}); + tube.fired += 1; tube.fire_count -= 1; if (tube.fire_count > 0) @@ -194,6 +195,7 @@ void MissileSystem::startLoad(sp::ecs::Entity source, MissileTubes::MountPoint& if (tubes->storage[type] <= 0) return; + tube.fired = 0; tube.state = MissileTubes::MountPoint::State::Loading; tube.delay = tube.load_time; tube.type_loaded = type; @@ -227,6 +229,7 @@ void MissileSystem::fire(sp::ecs::Entity source, MissileTubes::MountPoint& tube, tube.delay = 0.0; }else{ spawnProjectile(source, tube, target_angle, target); + tube.fired += 1; tube.state = MissileTubes::MountPoint::State::Empty; tube.type_loaded = MW_None; }