diff --git a/src/ui/GameWorldView.cpp b/src/ui/GameWorldView.cpp index 2492e7c..b582733 100644 --- a/src/ui/GameWorldView.cpp +++ b/src/ui/GameWorldView.cpp @@ -898,15 +898,7 @@ void GameWorldView::keyPressEvent(QKeyEvent* event) } break; case Qt::Key_Escape: - if (m_builderType.has_value()) - { - exitBuilderMode(); - } - else if (m_demolishMode) - { - m_demolishMode = false; - m_demolishHoverId = kInvalidEntityId; - } + emit escapeMenuRequested(); break; case Qt::Key_Backspace: if (m_demolishMode) @@ -1114,6 +1106,11 @@ void GameWorldView::exitBuilderMode() emit builderModeExited(); } +double GameWorldView::gameSpeed() const +{ + return m_gameSpeedMultiplier; +} + void GameWorldView::setGameSpeed(double multiplier) { m_gameSpeedMultiplier = multiplier; diff --git a/src/ui/GameWorldView.h b/src/ui/GameWorldView.h index 1374c74..d4a8710 100644 --- a/src/ui/GameWorldView.h +++ b/src/ui/GameWorldView.h @@ -46,6 +46,10 @@ signals: void stateUpdated(Tick tick, int blocks, double speed); void gameOver(); void builderModeExited(); + void escapeMenuRequested(); + +public: + double gameSpeed() const; public slots: void enterBuilderMode(BuildingType type); diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 1a2fc63..ca8ba08 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -52,6 +52,9 @@ MainWindow::MainWindow(Simulation* sim, const GameConfig* config, connect(m_gameWorldView, SIGNAL(gameOver()), this, SLOT(onGameOver())); + connect(m_gameWorldView, SIGNAL(escapeMenuRequested()), + this, SLOT(onEscapeMenuRequested())); + // Signals: build grid → game world connect(m_buildButtonGrid, SIGNAL(buildingTypeSelected(BuildingType)), m_gameWorldView, SLOT(enterBuilderMode(BuildingType))); @@ -95,6 +98,35 @@ void MainWindow::onStateUpdated(Tick /*tick*/, int blocks, double /*speed*/) m_buildButtonGrid->updateAffordability(blocks); } +void MainWindow::onEscapeMenuRequested() +{ + const double prevSpeed = m_gameWorldView->gameSpeed(); + m_gameWorldView->setGameSpeed(0.0); + + QMessageBox box(this); + box.setWindowTitle("Paused"); + QPushButton* continueBtn = box.addButton("Continue", QMessageBox::AcceptRole); + QPushButton* restartBtn = box.addButton("Restart", QMessageBox::ResetRole); + QPushButton* quitBtn = box.addButton("Quit", QMessageBox::DestructiveRole); + box.setEscapeButton(continueBtn); + box.exec(); + + QAbstractButton* clicked = box.clickedButton(); + if (clicked == restartBtn) + { + m_sim->reset(); + m_gameWorldView->resetForNewGame(); + } + else if (clicked == quitBtn) + { + close(); + } + else + { + m_gameWorldView->setGameSpeed(prevSpeed); + } +} + void MainWindow::onGameOver() { const Tick tick = m_sim->currentTick(); diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 52f571c..563c7fe 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -27,6 +27,7 @@ protected: private slots: void onGameOver(); void onStateUpdated(Tick tick, int blocks, double speed); + void onEscapeMenuRequested(); private: void layoutPanels();