diff --git a/src/game/agame/background.cpp b/src/game/agame/background.cpp index b59c984..28f9848 100644 --- a/src/game/agame/background.cpp +++ b/src/game/agame/background.cpp @@ -98,7 +98,11 @@ namespace Game::AGame { mTransform.y -= mTex->getHeight() * mTransform.adjustedScaleY() / 2.f; LOG("W: " << mW << " H: " << mH); - spawnLevel(1); + + // Only spawn level entities during normal gameplay, not during replay + if (GameManager::getCurrentGameState() != GameStateEnum::REPLAY) { + spawnLevel(1); + } } void Background::render(Game::Renderer::Renderer* renderer, Game::Renderer::RendererConfig config) { diff --git a/src/game/gamemanager.cpp b/src/game/gamemanager.cpp index 98c51f6..6e2357e 100644 --- a/src/game/gamemanager.cpp +++ b/src/game/gamemanager.cpp @@ -37,10 +37,10 @@ namespace Game { // Handle REPLAY state if (mCurrentGameState == GameStateEnum::REPLAY) { if (!playReplayFrame()) { - // No more frames - end replay + // No more frames - end replay and pause stopReplayMode(); - mCurrentGameState = GameStateEnum::STOPPED; - LOG("Replay finished"); + mCurrentGameState = GameStateEnum::PAUSED; + LOG("Replay finished - pausing"); } } else { auto entities = State::GameState::getInstance().getEntitiesSnapshot(); @@ -104,7 +104,7 @@ namespace Game { } bool GameManager::initReplayMode() { - // Read and parse replay.txt + // Read and parse replay.txt (supports both 5-column legacy and 6-column new format) std::ifstream replayFile("replay.txt"); if (!replayFile.is_open()) { WARN("Failed to open replay.txt for reading"); @@ -120,13 +120,22 @@ namespace Game { std::istringstream iss(line); ReplayFrame frame; - int isShip; + int isShip = 0; + // Try to parse 6 columns first (new format with form state) if (iss >> frame.x >> frame.y >> frame.rotation >> frame.scaleX >> frame.scaleY >> isShip) { frame.isShipMode = (isShip != 0); mReplayFrames.push_back(frame); } else { - WARN("Failed to parse replay line: " << line); + // Reset stream and try 5-column legacy format + iss.clear(); + iss.seekg(0); + if (iss >> frame.x >> frame.y >> frame.rotation >> frame.scaleX >> frame.scaleY) { + frame.isShipMode = false; // Default to ground mode for legacy replays + mReplayFrames.push_back(frame); + } else { + WARN("Failed to parse replay line: " << line); + } } } @@ -137,6 +146,7 @@ namespace Game { bool GameManager::playReplayFrame() { if (mReplayFrames.empty() || mCurrentReplayFrame >= mReplayFrames.size()) { + LOG("Replay complete: played " << mCurrentReplayFrame << " frames"); return false; // Replay finished } @@ -151,6 +161,11 @@ namespace Game { player->getTransform()->scaleX = frame.scaleX; player->getTransform()->scaleY = frame.scaleY; player->setShipMode(frame.isShipMode); + + // Log every 100 frames to track progress + if (mCurrentReplayFrame % 100 == 0) { + LOG("Playing replay frame " << mCurrentReplayFrame << "/" << mReplayFrames.size()); + } } mCurrentReplayFrame++; diff --git a/src/main.cpp b/src/main.cpp index 03e1afa..0c7c38a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -96,10 +96,20 @@ static void performStartGameTransition() { deactivateAndQueueRemoval("Title"); deactivateAndQueueRemoval("NameBox"); deactivateAndQueueRemoval("StartButton"); + deactivateAndQueueRemoval("ReplayButton"); } static void performReplayTransition() { - // Spawn minimal game entities for replay + // Clear all existing entities to start fresh + auto allEntities = State::GameState::getInstance().getEntitiesSnapshot(); + for (auto* entity : allEntities) { + if (entity && entity->getName() != "BG" && entity->getName() != "Player" && entity->getName() != "HUD") { + entity->setActive(false); + State::GameState::getInstance().queueEntityRemoval(entity->getName()); + } + } + + // Spawn minimal game entities for replay (only Background and Player, no HUD) State::GameState::getInstance().addEntity(std::make_unique("BG", std::make_shared("../resources/bgtest.png", gSDLRenderer), Object::DEFAULT_TRANSFORM)); auto* player = dynamic_cast( @@ -117,9 +127,6 @@ static void performReplayTransition() { player->setGroundTexture(std::make_shared("../resources/l3player.png", gSDLRenderer)); } - // HUD - State::GameState::getInstance().addEntity(std::make_unique("HUD", std::make_shared("../resources/roboto.ttf", gSDLRenderer, 60, "HUDFont"), Object::Transform{0.f, 0.f, 0.f, 1.f, 1.f}, 320.f, 40.f)); - // Initialize and start replay if (GameManager::initReplayMode()) { GameManager::setCurrentGameState(GameStateEnum::REPLAY);