switch to using own event system

This commit is contained in:
2026-06-13 17:42:16 +02:00
parent ed17664ef1
commit 5317f35198
49 changed files with 611 additions and 300 deletions

View File

@@ -10,7 +10,7 @@
#include "ConfigLoader.h"
#include "EntityAdmin.h"
#include "FactionComponent.h"
#include "FireEvent.h"
#include "WeaponFiredEvent.h"
#include "HealthComponent.h"
#include "HqProxyComponent.h"
#include "ModuleOwnerComponent.h"
@@ -111,7 +111,7 @@ TEST_CASE("CombatSystem: ship fires when cooldown=0 and target in range", "[comb
const float hpBefore = f.admin.get<HealthComponent>(player).hp;
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
f.combat.applyPendingDamage(5, f.admin);
@@ -135,16 +135,16 @@ TEST_CASE("CombatSystem: cooldown prevents firing before it expires", "[combat]"
f.admin.get<WeaponComponent>(wc).cooldownTicks = 3.0f; // override to 3
}
auto enemyFiredIn = [&enemy](const std::vector<FireEvent>& evts)
auto enemyFiredIn = [&enemy](const std::vector<WeaponFiredEvent>& evts)
{
for (const FireEvent& evt : evts)
for (const WeaponFiredEvent& evt : evts)
{
if (evt.shooter == enemy) { return true; }
}
return false;
};
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
REQUIRE_FALSE(enemyFiredIn(events));
@@ -165,7 +165,7 @@ TEST_CASE("CombatSystem: no fire when target is out of range", "[combat]")
const entt::entity player = f.ships.spawn(combatDef->id, 1, QVector2D(500.0f, 0.0f), false);
f.wireEnemyTarget(enemy, player);
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
REQUIRE(events.empty());
}
@@ -204,9 +204,9 @@ TEST_CASE("CombatSystem: player station fires at enemy ship in range", "[combat]
sim.tick();
const std::vector<FireEvent> events = sim.drainFireEvents();
const std::vector<WeaponFiredEvent> events = sim.drainWeaponFiredEvents();
bool stationFired = false;
for (const FireEvent& evt : events)
for (const WeaponFiredEvent& evt : events)
{
if (evt.shooter == stationEntity) { stationFired = true; }
}
@@ -242,9 +242,9 @@ TEST_CASE("CombatSystem: enemy station fires at player ship in range", "[combat]
sim.tick();
const std::vector<FireEvent> events = sim.drainFireEvents();
const std::vector<WeaponFiredEvent> events = sim.drainWeaponFiredEvents();
bool stationFired = false;
for (const FireEvent& evt : events)
for (const WeaponFiredEvent& evt : events)
{
if (evt.shooter == stationEntity) { stationFired = true; }
}
@@ -280,9 +280,9 @@ TEST_CASE("CombatSystem: player ship fires at enemy station in range", "[combat]
sim.tick();
const std::vector<FireEvent> events = sim.drainFireEvents();
const std::vector<WeaponFiredEvent> events = sim.drainWeaponFiredEvents();
bool playerFiredAtStation = false;
for (const FireEvent& evt : events)
for (const WeaponFiredEvent& evt : events)
{
if (evt.shooter == playerShip && evt.target == stationEntity)
{
@@ -308,7 +308,7 @@ TEST_CASE("CombatSystem: damage not applied before impact tick", "[combat]")
const float hpBefore = f.admin.get<HealthComponent>(player).hp;
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
for (Tick t = 1; t < 5; ++t)
@@ -330,7 +330,7 @@ TEST_CASE("CombatSystem: damage applied exactly at impact tick", "[combat]")
const float hpBefore = f.admin.get<HealthComponent>(player).hp;
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
f.combat.applyPendingDamage(5, f.admin);
@@ -347,7 +347,7 @@ TEST_CASE("CombatSystem: damage silently dropped if target already dead", "[comb
const entt::entity player = f.ships.spawn(combatDef->id, 1, QVector2D(4.0f, 5.0f), false);
f.wireEnemyTarget(enemy, player);
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
f.ships.despawn(player);
@@ -370,7 +370,7 @@ TEST_CASE("CombatSystem: damage still applied if shooter already dead", "[combat
const float hpBefore = f.admin.get<HealthComponent>(player).hp;
std::vector<FireEvent> events;
std::vector<WeaponFiredEvent> events;
f.combat.tick(0, f.admin, f.buildings, events);
f.ships.despawn(enemy);

View File

@@ -43,22 +43,22 @@ TEST_CASE("Simulation::tick 10 times yields currentTick == 10", "[simulation]")
REQUIRE(sim.currentTick() == 10);
}
TEST_CASE("Simulation::drainFireEvents returns empty initially", "[simulation]")
TEST_CASE("Simulation::drainWeaponFiredEvents returns empty initially", "[simulation]")
{
Simulation sim(loadConfig());
REQUIRE(sim.drainFireEvents().empty());
REQUIRE(sim.drainWeaponFiredEvents().empty());
}
TEST_CASE("Simulation::drainFireEvents clears queue on drain", "[simulation]")
TEST_CASE("Simulation::drainWeaponFiredEvents clears queue on drain", "[simulation]")
{
Simulation sim(loadConfig());
// First drain: empty.
sim.drainFireEvents();
sim.drainWeaponFiredEvents();
// Second drain must also be empty (not a double-return).
REQUIRE(sim.drainFireEvents().empty());
REQUIRE(sim.drainWeaponFiredEvents().empty());
}
TEST_CASE("Simulation::hasSchematicChoicesPending returns false initially", "[simulation]")