From 5366ea735cc3cefef42eeadae1b08462938c2db8 Mon Sep 17 00:00:00 2001 From: Martin Gerhardy Date: Thu, 12 Nov 2020 21:18:21 +0100 Subject: [PATCH] TWINE: ensure menu background after giving up also the initial values for the advanced menu entries are correct now --- engines/twine/gamestate.cpp | 10 ++++-- engines/twine/gamestate.h | 3 +- engines/twine/menu.cpp | 65 +++++++++++++++++++++++-------------- engines/twine/scene.cpp | 4 +++ engines/twine/scene.h | 1 + 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/engines/twine/gamestate.cpp b/engines/twine/gamestate.cpp index 14cf4bdb968..c748364a2cc 100644 --- a/engines/twine/gamestate.cpp +++ b/engines/twine/gamestate.cpp @@ -64,7 +64,7 @@ void GameState::initEngineProjections() { _engine->_renderer->setLightVector(_engine->_scene->alphaLight, _engine->_scene->betaLight, 0); } -void GameState::initSceneVars() { +void GameState::initGameStateVars() { _engine->_extra->resetExtras(); for (int32 i = 0; i < OVERLAY_MAX_ENTRIES; i++) { @@ -116,7 +116,7 @@ void GameState::initEngineVars() { _engine->_scene->alphaLight = 896; _engine->_scene->betaLight = 950; initEngineProjections(); - initSceneVars(); + initGameStateVars(); initHeroVars(); _engine->_scene->newHeroX = 0x2000; @@ -485,4 +485,10 @@ void GameState::processGameoverAnimation() { _engine->lbaTime = tmpLbaTime; } +void GameState::giveUp() { + _engine->_sound->stopSamples(); + initGameStateVars(); + _engine->_scene->stopRunningGame(); +} + } // namespace TwinE diff --git a/engines/twine/gamestate.h b/engines/twine/gamestate.h index 9371f80777f..73431ab4bc3 100644 --- a/engines/twine/gamestate.h +++ b/engines/twine/gamestate.h @@ -86,7 +86,7 @@ class GameState { private: TwinEEngine *_engine; - void initSceneVars(); + void initGameStateVars(); void initHeroVars(); public: @@ -161,6 +161,7 @@ public: void processFoundItem(int32 item); + void giveUp(); bool loadGame(Common::SeekableReadStream *file); bool saveGame(Common::WriteStream *file); diff --git a/engines/twine/menu.cpp b/engines/twine/menu.cpp index 1e8d67be3b3..1b0c2cc03dc 100644 --- a/engines/twine/menu.cpp +++ b/engines/twine/menu.cpp @@ -324,6 +324,45 @@ void Menu::drawButtons(MenuSettings *menuSettings, bool hover) { } for (int16 i = 0; i < maxButton; ++i) { + if (menuSettings == &advOptionsMenuState) { + int16 id = menuSettings->getButtonState(i); + switch (id) { + case MenuButtonTypes::kAgressiveMode: + if (_engine->_actor->autoAgressive) { + menuSettings->setButtonTextId(i, TextId::kBehaviourAgressiveAuto); + } else { + menuSettings->setButtonTextId(i, TextId::kBehaviourAgressiveManual); + } + break; + case MenuButtonTypes::kPolygonDetails: + if (_engine->cfgfile.PolygonDetails == 0) { + menuSettings->setButtonTextId(i, TextId::kDetailsPolygonsLow); + } else if (_engine->cfgfile.PolygonDetails == 1) { + menuSettings->setButtonTextId(i, TextId::kDetailsPolygonsMiddle); + } else { + menuSettings->setButtonTextId(i, TextId::kDetailsPolygonsHigh); + } + break; + case MenuButtonTypes::kShadowSettings: + if (_engine->cfgfile.ShadowMode == 0) { + menuSettings->setButtonTextId(i, TextId::kShadowsDisabled); + } else if (_engine->cfgfile.ShadowMode == 1) { + menuSettings->setButtonTextId(i, TextId::kShadowsFigures); + } else { + menuSettings->setButtonTextId(i, TextId::kDetailsShadowHigh); + } + break; + case MenuButtonTypes::kSceneryZoom: + if (_engine->cfgfile.SceZoom) { + menuSettings->setButtonTextId(i, TextId::kScenaryZoomOn); + } else { + menuSettings->setButtonTextId(i, TextId::kNoScenaryZoom); + } + break; + default: + break; + } + } const int32 menuItemId = menuSettings->getButtonState(i); const char *text = menuSettings->getButtonText(_engine->_text, i); if (hover) { @@ -381,11 +420,6 @@ int32 Menu::processMenu(MenuSettings *menuSettings) { if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) { _engine->_actor->autoAgressive = !_engine->_actor->autoAgressive; } - if (_engine->_actor->autoAgressive) { - menuSettings->setActiveButtonTextId(TextId::kBehaviourAgressiveAuto); - } else { - menuSettings->setActiveButtonTextId(TextId::kBehaviourAgressiveManual); - } break; case MenuButtonTypes::kPolygonDetails: if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft)) { @@ -395,13 +429,6 @@ int32 Menu::processMenu(MenuSettings *menuSettings) { _engine->cfgfile.PolygonDetails++; _engine->cfgfile.PolygonDetails %= 3; } - if (_engine->cfgfile.PolygonDetails == 0) { - menuSettings->setActiveButtonTextId(TextId::kDetailsPolygonsLow); - } else if (_engine->cfgfile.PolygonDetails == 1) { - menuSettings->setActiveButtonTextId(TextId::kDetailsPolygonsMiddle); - } else { - menuSettings->setActiveButtonTextId(TextId::kDetailsPolygonsHigh); - } break; case MenuButtonTypes::kShadowSettings: if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft)) { @@ -411,23 +438,11 @@ int32 Menu::processMenu(MenuSettings *menuSettings) { _engine->cfgfile.ShadowMode++; _engine->cfgfile.ShadowMode %= 3; } - if (_engine->cfgfile.ShadowMode == 0) { - menuSettings->setActiveButtonTextId(TextId::kShadowsDisabled); - } else if (_engine->cfgfile.ShadowMode == 1) { - menuSettings->setActiveButtonTextId(TextId::kShadowsFigures); - } else { - menuSettings->setActiveButtonTextId(TextId::kDetailsShadowHigh); - } break; case MenuButtonTypes::kSceneryZoom: if (_engine->_input->toggleActionIfActive(TwinEActionType::UILeft) || _engine->_input->toggleActionIfActive(TwinEActionType::UIRight)) { _engine->cfgfile.SceZoom = !_engine->cfgfile.SceZoom; } - if (_engine->cfgfile.SceZoom) { - menuSettings->setActiveButtonTextId(TextId::kScenaryZoomOn); - } else { - menuSettings->setActiveButtonTextId(TextId::kNoScenaryZoom); - } break; default: break; @@ -692,7 +707,7 @@ int32 Menu::giveupMenu() { _engine->_sound->resumeSamples(); break; case TextId::kGiveUp: - _engine->_sound->stopSamples(); + _engine->_gameState->giveUp(); return 1; case TextId::kCreateSaveGame: _engine->_menuOptions->saveGameMenu(); diff --git a/engines/twine/scene.cpp b/engines/twine/scene.cpp index a9ae1a4df77..fffd89b7a60 100644 --- a/engines/twine/scene.cpp +++ b/engines/twine/scene.cpp @@ -536,4 +536,8 @@ void Scene::processActorZones(int32 actorIdx) { } } +void Scene::stopRunningGame() { + currentScene = nullptr; +} + } // namespace TwinE diff --git a/engines/twine/scene.h b/engines/twine/scene.h index 930de62bff1..0628a5bb864 100644 --- a/engines/twine/scene.h +++ b/engines/twine/scene.h @@ -346,6 +346,7 @@ public: void initSceneVars(); bool isGameRunning() const; + void stopRunningGame(); /** * Process actor zones