From c43225b6faa3858b4b1a30441352bdf11d862511 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Sat, 20 Jun 2026 08:24:10 +0200 Subject: [PATCH] fix issue where beams were also disappearing while the game was paused --- src/balancing/ArenaView.cpp | 9 ++++----- src/balancing/ArenaView.h | 6 +++--- src/ui/GameWorldView.cpp | 9 ++++----- src/ui/GameWorldView.h | 6 +++--- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/balancing/ArenaView.cpp b/src/balancing/ArenaView.cpp index ea3e4cf..750c9a6 100644 --- a/src/balancing/ArenaView.cpp +++ b/src/balancing/ArenaView.cpp @@ -40,7 +40,6 @@ ArenaView::ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals, : QOpenGLWidget(parent) , m_sim(sim) , m_visuals(visuals) - , m_wallMs(0) , m_gameSpeedMultiplier(1.0) , m_prevNonZeroSpeed(1.0) , m_rng(std::random_device{}()) @@ -99,7 +98,6 @@ void ArenaView::togglePause() void ArenaView::onFrame() { const qint64 elapsed = m_frameTimer.restart(); - m_wallMs += elapsed; { const int ticks = m_tickDriver.advance( @@ -120,12 +118,14 @@ void ArenaView::onFrame() } } - // Expire old beams + // Expire old beams. Lifetime is measured in game ticks so beams stay + // visible while the simulation is paused or slowed (REQ-SHP-FIRING-BEAM). { + const Tick now = m_sim->currentTick(); std::vector live; for (const ActiveBeam& b : m_activeBeams) { - if (m_wallMs - b.emittedWallMs < kBeamLifetimeMs) + if (now - b.event.emittedAt < kBeamLifetimeTicks) { live.push_back(b); } @@ -165,7 +165,6 @@ void ArenaView::handleEvent(std::shared_ptr event) ActiveBeam beam; beam.event = *event; - beam.emittedWallMs = m_wallMs; beam.targetOffset = QVector2D(radius * std::cos(angle), radius * std::sin(angle)); m_activeBeams.push_back(beam); diff --git a/src/balancing/ArenaView.h b/src/balancing/ArenaView.h index 2a792e0..6f84c86 100644 --- a/src/balancing/ArenaView.h +++ b/src/balancing/ArenaView.h @@ -67,18 +67,18 @@ private: struct ActiveBeam { BeamFiredEvent event; - qint64 emittedWallMs; QVector2D targetOffset; }; - static constexpr qint64 kBeamLifetimeMs = 300; + // Beam lifetime in game ticks so beams freeze with the simulation when + // paused or slowed, instead of fading on wall-clock time (REQ-SHP-FIRING-BEAM). + static constexpr Tick kBeamLifetimeTicks = secondsToTicks(0.3); ArenaSimulation* m_sim; const VisualsConfig* m_visuals; TickDriver m_tickDriver; QElapsedTimer m_frameTimer; - qint64 m_wallMs; std::mt19937 m_rng; double m_gameSpeedMultiplier; double m_prevNonZeroSpeed; diff --git a/src/ui/GameWorldView.cpp b/src/ui/GameWorldView.cpp index 250cd42..689acab 100644 --- a/src/ui/GameWorldView.cpp +++ b/src/ui/GameWorldView.cpp @@ -102,7 +102,6 @@ GameWorldView::GameWorldView(Simulation* sim, const GameConfig* config, , m_sim(sim) , m_config(config) , m_visuals(visuals) - , m_wallMs(0) , m_gameSpeedMultiplier(1.0) , m_prevNonZeroSpeed(1.0) , m_scrollXTiles(0.0f) @@ -144,7 +143,6 @@ void GameWorldView::initializeGL() void GameWorldView::onFrame() { const qint64 elapsed = m_frameTimer.restart(); - m_wallMs += elapsed; // Advance simulation { @@ -166,12 +164,14 @@ void GameWorldView::onFrame() } } - // Expire old beams + // Expire old beams. Lifetime is measured in game ticks so beams stay + // visible while the simulation is paused or slowed (REQ-SHP-FIRING-BEAM). { + const Tick now = m_sim->currentTick(); std::vector live; for (const ActiveBeam& b : m_activeBeams) { - if (m_wallMs - b.emittedWallMs < kBeamLifetimeMs) + if (now - b.event.emittedAt < kBeamLifetimeTicks) { live.push_back(b); } @@ -1603,7 +1603,6 @@ void GameWorldView::handleEvent(std::shared_ptr event) ActiveBeam beam; beam.event = *event; - beam.emittedWallMs = m_wallMs; beam.targetOffset = QVector2D(radius * std::cos(angle), radius * std::sin(angle)); m_activeBeams.push_back(beam); diff --git a/src/ui/GameWorldView.h b/src/ui/GameWorldView.h index b05a891..ed7d4f9 100644 --- a/src/ui/GameWorldView.h +++ b/src/ui/GameWorldView.h @@ -141,11 +141,12 @@ private: struct ActiveBeam { BeamFiredEvent event; - qint64 emittedWallMs; QVector2D targetOffset; }; - static constexpr qint64 kBeamLifetimeMs = 300; + // Beam lifetime in game ticks so beams freeze with the simulation when + // paused or slowed, instead of fading on wall-clock time (REQ-SHP-FIRING-BEAM). + static constexpr Tick kBeamLifetimeTicks = secondsToTicks(0.3); static constexpr float kScrollSpeedTilesPerSec = 10.0f; Simulation* m_sim; @@ -154,7 +155,6 @@ private: TickDriver m_tickDriver; QElapsedTimer m_frameTimer; - qint64 m_wallMs; std::mt19937 m_rng; double m_gameSpeedMultiplier; double m_prevNonZeroSpeed;