change repair_tool application and add beams for salvager and repair_tool
This commit is contained in:
@@ -60,7 +60,7 @@ ShipStats calculateShipStats(const GameConfig& config,
|
||||
// --- Pass 1: base capability stats per module instance -------------------
|
||||
struct WeaponInstance { float damage; float range_tiles; float rate_hz; };
|
||||
struct SalvageInstance { float range_tiles; float rate; };
|
||||
struct RepairInstance { float rate_hps; float range_tiles; };
|
||||
struct RepairInstance { float rate_hz; float amount_hp; float range_tiles; };
|
||||
|
||||
std::vector<WeaponInstance> weaponInstances;
|
||||
std::vector<SalvageInstance> salvageInstances;
|
||||
@@ -93,7 +93,8 @@ ShipStats calculateShipStats(const GameConfig& config,
|
||||
if (def->repairCapability)
|
||||
{
|
||||
RepairInstance ri;
|
||||
ri.rate_hps = static_cast<float>(def->repairCapability->repairRateFormula.evaluate(mx));
|
||||
ri.rate_hz = static_cast<float>(def->repairCapability->repairRateFormula.evaluate(mx));
|
||||
ri.amount_hp = static_cast<float>(def->repairCapability->repairAmountHpFormula.evaluate(mx));
|
||||
ri.range_tiles = static_cast<float>(def->repairCapability->repairRangeFormula.evaluate(mx) / tileSize);
|
||||
repairInstances.push_back(ri);
|
||||
}
|
||||
@@ -238,9 +239,9 @@ ShipStats calculateShipStats(const GameConfig& config,
|
||||
float maxRange = 0.0f;
|
||||
for (RepairInstance& ri : repairInstances)
|
||||
{
|
||||
applyMod(ri.rate_hps, "repair_rate", repairMods);
|
||||
applyMod(ri.rate_hz, "repair_rate", repairMods);
|
||||
applyMod(ri.range_tiles, "repair_range", repairMods);
|
||||
combinedRate += ri.rate_hps;
|
||||
combinedRate += ri.rate_hz * ri.amount_hp;
|
||||
if (ri.range_tiles > maxRange) { maxRange = ri.range_tiles; }
|
||||
}
|
||||
result.repair = ShipStats::RepairStats{combinedRate, maxRange};
|
||||
@@ -303,7 +304,10 @@ ShipStats buildShipStatsFromEntity(const EntityAdmin& admin, entt::entity shipEn
|
||||
{
|
||||
if (owner.owner != shipEntity) { return; }
|
||||
hasRepair = true;
|
||||
repairRate += r.ratePerTick * kTickRateHz;
|
||||
const float cyclesPerSec = (r.repairIntervalTicks > 0)
|
||||
? static_cast<float>(kTickRateHz) / static_cast<float>(r.repairIntervalTicks)
|
||||
: 0.0f;
|
||||
repairRate += cyclesPerSec * r.repairAmountHp;
|
||||
if (r.range_tiles > repairMaxRange) { repairMaxRange = r.range_tiles; }
|
||||
});
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ void Simulation::reset(unsigned int seed)
|
||||
m_playerStation2Entity = entt::null;
|
||||
m_currentEnemyStationEntities[0] = entt::null;
|
||||
m_currentEnemyStationEntities[1] = entt::null;
|
||||
m_weaponFiredEvents.clear();
|
||||
m_beamFiredEvents.clear();
|
||||
m_pendingSchematicChoices.clear();
|
||||
|
||||
m_admin.clear();
|
||||
@@ -248,12 +248,13 @@ void Simulation::tick()
|
||||
// movement intent + preferred module targets only — no world mutation).
|
||||
m_aiSystem->tick(m_admin, *m_buildingSystem, *m_scrapSystem);
|
||||
// Module systems perform the world mutation (collection/delivery, healing).
|
||||
m_salvagerSystem->tick(*m_scrapSystem, *m_buildingSystem);
|
||||
m_repairSystem->tick();
|
||||
// Each emits its tool beams and applies its own delayed (mid-beam) effects.
|
||||
m_salvagerSystem->tick(m_currentTick, *m_scrapSystem, *m_buildingSystem, m_beamFiredEvents);
|
||||
m_repairSystem->tick(m_currentTick, m_beamFiredEvents);
|
||||
|
||||
// Step 8: combat resolution
|
||||
m_combatSystem->tick(m_currentTick, m_admin,
|
||||
*m_buildingSystem, m_weaponFiredEvents);
|
||||
*m_buildingSystem, m_beamFiredEvents);
|
||||
|
||||
// Step 8b: deferred damage whose impact tick has arrived
|
||||
m_combatSystem->applyPendingDamage(m_currentTick, m_admin);
|
||||
@@ -828,10 +829,10 @@ bool Simulation::isItemUnlocked(const std::string& itemId) const
|
||||
// Drains
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
std::vector<WeaponFiredEvent> Simulation::drainWeaponFiredEvents()
|
||||
std::vector<BeamFiredEvent> Simulation::drainBeamFiredEvents()
|
||||
{
|
||||
std::vector<WeaponFiredEvent> result;
|
||||
result.swap(m_weaponFiredEvents);
|
||||
std::vector<BeamFiredEvent> result;
|
||||
result.swap(m_beamFiredEvents);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "BuildingType.h"
|
||||
#include "BuildingId.h"
|
||||
#include "EventHandler.h"
|
||||
#include "WeaponFiredEvent.h"
|
||||
#include "BeamFiredEvent.h"
|
||||
#include "GameConfig.h"
|
||||
#include "Rotation.h"
|
||||
#include "Tick.h"
|
||||
@@ -52,7 +52,7 @@ public:
|
||||
|
||||
// Returns all fire events accumulated since the last drain, clearing the
|
||||
// internal queue. Call once per rendered frame (REQ-SHP-FIRING-BEAM).
|
||||
std::vector<WeaponFiredEvent> drainWeaponFiredEvents();
|
||||
std::vector<BeamFiredEvent> drainBeamFiredEvents();
|
||||
|
||||
// Returns the pending schematic choices (empty if no drop is pending).
|
||||
const std::vector<SchematicChoiceOption>& getPendingSchematicChoices() const;
|
||||
@@ -192,6 +192,6 @@ private:
|
||||
std::unique_ptr<WaveSystem> m_waveSystem;
|
||||
std::unique_ptr<CombatSystem> m_combatSystem;
|
||||
|
||||
std::vector<WeaponFiredEvent> m_weaponFiredEvents;
|
||||
std::vector<BeamFiredEvent> m_beamFiredEvents;
|
||||
std::vector<SchematicChoiceOption> m_pendingSchematicChoices;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user