diff --git a/engines/xeen/combat.cpp b/engines/xeen/combat.cpp index 71ad6303a8d2..397370f41fc2 100644 --- a/engines/xeen/combat.cpp +++ b/engines/xeen/combat.cpp @@ -2099,7 +2099,8 @@ void Combat::reset() { clearShooting(); setupCombatParty(); - _combatMode = COMBATMODE_STARTUP; + _combatMode = COMBATMODE_1; + _monster2Attack = -1; } } // End of namespace Xeen diff --git a/engines/xeen/interface.cpp b/engines/xeen/interface.cpp index 88b33c416448..1a7900274cde 100644 --- a/engines/xeen/interface.cpp +++ b/engines/xeen/interface.cpp @@ -1519,7 +1519,7 @@ void Interface::doCombat() { } while (!_vm->shouldExit() && events.timeElapsed() < 1 && !_buttonValue); } while (!_vm->shouldExit() && !_buttonValue); if (_vm->shouldExit()) - return; + goto exit; switch (_buttonValue) { case Common::KEYCODE_TAB: @@ -1701,7 +1701,7 @@ void Interface::doCombat() { } } } - +exit: w.close(); events.clearEvents(); @@ -1721,18 +1721,20 @@ void Interface::doCombat() { mainIconsPrint(); combat._monster2Attack = -1; - if (upDoorText) { - map.cellFlagLookup(party._mazePosition); - if (map._currentIsEvent) - scripts.checkEvents(); - } + if (!g_vm->isLoadPending()) { + if (upDoorText) { + map.cellFlagLookup(party._mazePosition); + if (map._currentIsEvent) + scripts.checkEvents(); + } - if (reloadMap) { - sound.playFX(51); - map._loadCcNum = _vm->getGameID() != GType_WorldOfXeen ? 1 : 0; - map.load(_vm->getGameID() == GType_WorldOfXeen ? 28 : 29); - party._mazeDirection = _vm->getGameID() == GType_WorldOfXeen ? - DIR_EAST : DIR_SOUTH; + if (reloadMap) { + sound.playFX(51); + map._loadCcNum = _vm->getGameID() != GType_WorldOfXeen ? 1 : 0; + map.load(_vm->getGameID() == GType_WorldOfXeen ? 28 : 29); + party._mazeDirection = _vm->getGameID() == GType_WorldOfXeen ? + DIR_EAST : DIR_SOUTH; + } } combat._combatMode = COMBATMODE_1; diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp index 5f6243c04586..8300040c629a 100644 --- a/engines/xeen/xeen.cpp +++ b/engines/xeen/xeen.cpp @@ -189,7 +189,7 @@ Common::Error XeenEngine::loadGameState(int slot) { } bool XeenEngine::canLoadGameStateCurrently() { - return _mode != MODE_COMBAT && _mode != MODE_STARTUP; + return _mode != MODE_STARTUP; } bool XeenEngine::canSaveGameStateCurrently() { @@ -256,7 +256,7 @@ void XeenEngine::play() { void XeenEngine::gameLoop() { // Main game loop - while (!shouldExit()) { + while (isLoadPending() || !shouldExit()) { if (isLoadPending()) { // Load any pending savegame int saveSlot = _loadSaveSlot; @@ -268,7 +268,7 @@ void XeenEngine::gameLoop() { _map->cellFlagLookup(_party->_mazePosition); if (_map->_currentIsEvent) { _gameMode = (GameMode)_scripts->checkEvents(); - if (shouldExit() || _gameMode) + if (shouldExit()) return; } _party->giveTreasure(); diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h index 774e97bea5b0..2cd42fdb0a25 100644 --- a/engines/xeen/xeen.h +++ b/engines/xeen/xeen.h @@ -219,9 +219,9 @@ class XeenEngine : public Engine { void GUIError(const char *msg, ...) GCC_PRINTF(2, 3); /** - * Returns true if the game should be exited (and likely return to game menu) + * Returns true if the game should be exited (either quitting, exiting to the main menu, or loading a savegame) */ - bool shouldExit() const { return _gameMode != GMODE_NONE || shouldQuit(); } + bool shouldExit() const { return _gameMode != GMODE_NONE || isLoadPending() || shouldQuit(); } /** * Returns true if a savegame load is pending