From 490d447ed19d481c9e15847c9bb43223b71c7847 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 22 Jan 2013 12:13:34 +0000 Subject: NEVERHOOD: Implement restart functionality (from both main menu and game logic) - Some minor cleanup --- engines/neverhood/gamemodule.cpp | 29 ++++++++------ engines/neverhood/gamemodule.h | 2 + engines/neverhood/gamevars.cpp | 5 +++ engines/neverhood/gamevars.h | 1 + engines/neverhood/menumodule.cpp | 82 ++++++++++++++++++---------------------- engines/neverhood/module1600.cpp | 8 +--- engines/neverhood/module1900.cpp | 20 +++++----- engines/neverhood/neverhood.cpp | 2 - 8 files changed, 74 insertions(+), 75 deletions(-) (limited to 'engines/neverhood') diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index cf56522fbd..fa8a6d5d29 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -75,7 +75,7 @@ enum { GameModule::GameModule(NeverhoodEngine *vm) : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), - _mainMenuRequested(false), _gameWasLoaded(false) { + _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); @@ -400,9 +400,9 @@ void GameModule::startup() { // <<gameState().which = 1; - _vm->gameState().sceneNum = 1; - createModule(1000, -1); + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 8; + createModule(1800, -1); #endif #if 0 _vm->gameState().sceneNum = 5; @@ -473,7 +473,17 @@ void GameModule::restoreGame() { createModuleByHash(getGlobalVar(V_MODULE_NAME)); } +void GameModule::requestRestartGame(bool requestMainMenu) { + _restartGameRequested = true; + _mainMenuRequested = requestMainMenu; +} + void GameModule::checkMainMenu() { + if (_restartGameRequested) { + _restartGameRequested = false; + _vm->_gameVars->clear(); + restoreGame(); + } if (_mainMenuRequested) openMainMenu(); } @@ -646,7 +656,8 @@ void GameModule::createModuleByHash(uint32 nameHash) { createModule(3000, -1); break; default: - error("GameModule::createModuleByHash() Unknown module name %08X", nameHash); + createModule(1000, 0); + break; } } @@ -673,9 +684,7 @@ void GameModule::updateModule() { case 1300: if (_moduleResult == 1) { // The game was successfully finished - // TODO Restart the game/show main menu - // TODO _gameState.clear(); - // TODO GameModule_handleKeyEscape + requestRestartGame(true); } else createModule(2900, 0); break; @@ -702,9 +711,7 @@ void GameModule::updateModule() { case 1800: if (_moduleResult == 1) { // Game over, Klaymen jumped into the hole - // TODO Restart the game/show main menu - // TODO _gameState.clear(); - // TODO GameModule_handleKeyEscape + requestRestartGame(true); } else if (_moduleResult == 2) createModule(2700, 0); else if (_moduleResult == 3) diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index ee6b000533..b212a1905c 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -34,6 +34,7 @@ public: virtual ~GameModule(); void startup(); void restoreGame(); + void requestRestartGame(bool requestMainMenu); void checkMainMenu(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); @@ -57,6 +58,7 @@ protected: Entity *_prevChildObject; int _prevModuleNum; bool _gameWasLoaded; + bool _restartGameRequested; bool _mainMenuRequested; bool _someFlag1; bool _field2C; diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 57d9547ac2..87f5fe6dd9 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -28,6 +28,11 @@ GameVars::GameVars() { addVar(0, 0); } +void GameVars::clear() { + _vars.clear(); + addVar(0, 0); +} + void GameVars::loadState(Common::InSaveFile *in) { uint varCount; _vars.clear(); diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 3672aa6e45..5337c13394 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -172,6 +172,7 @@ struct GameVar { class GameVars { public: GameVars(); + void clear(); void loadState(Common::InSaveFile *in); void saveState(Common::OutSaveFile *out); uint32 getGlobalVar(uint32 nameHash); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 71b216b940..b86fc7095a 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/menumodule.h" +#include "neverhood/gamemodule.h" namespace Neverhood { @@ -31,6 +32,18 @@ enum { SAVE_GAME_MENU = 3 }; +enum { + kMainMenuRestartGame = 0, + kMainMenuLoadGame = 1, + kMainMenuSaveGame = 2, + kMainMenuResumeGame = 3, + kMainMenuQuitGame = 4, + kMainMenuCredits = 5, + kMainMenuMakingOf = 6, + kMainMenuToggleMusic = 7, + kMainMenuDeleteGame = 8 +}; + static const uint32 kMakingOfSmackerFileHashList[] = { 0x21082409, 0x21082809, @@ -97,42 +110,34 @@ void MenuModule::updateScene() { case MAIN_MENU: // TODO switch (_moduleResult) { - case 0: - // 0048A2A5 - debug("RESTART GAME"); + case kMainMenuRestartGame: + _vm->_gameModule->requestRestartGame(false); + leaveModule(0); break; - case 1: - debug("LOAD GAME"); + case kMainMenuLoadGame: // TODO createLoadGameMenu(); break; - case 2: - debug("SAVE GAME"); + case kMainMenuSaveGame: createScene(SAVE_GAME_MENU, -1); break; - case 3: - debug("RESUME GAME"); + case kMainMenuResumeGame: leaveModule(0); break; - case 4: - debug("QUIT GAME"); + case kMainMenuQuitGame: leaveModule(0); _vm->quitGame(); break; - case 5: - debug("CREDITS"); + case kMainMenuCredits: createScene(CREDITS_SCENE, -1); break; - case 6: - debug("MAKING OF"); + case kMainMenuMakingOf: createScene(MAKING_OF, -1); break; - case 7: - debug("TOGGLE MUSIC"); + case kMainMenuToggleMusic: // TODO Toggle music 0048A367 createScene(MAIN_MENU, -1); break; - case 8: - debug("DELETE GAME"); + case kMainMenuDeleteGame: // TODO createDeleteGameMenu(); break; default: @@ -270,30 +275,14 @@ uint32 MainMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity } static const uint32 kCreditsSceneFileHashes[] = { - 0x6081128C, - 0x608112BC, - 0x608112DC, - 0x6081121C, - 0x6081139C, - 0x6081109C, - 0x6081169C, - 0x60811A9C, - 0x6081029C, - 0x0081128C, - 0x008112BC, - 0x008012BC, - 0x008112DC, - 0x0081121C, - 0x0081139C, - 0x0081109C, - 0x0081169C, - 0x00811A9C, - 0x0081029C, - 0x0081329C, - 0xC08112BC, - 0xC08112DC, - 0xC081121C, - 0xC081139C, + 0x6081128C, 0x608112BC, 0x608112DC, + 0x6081121C, 0x6081139C, 0x6081109C, + 0x6081169C, 0x60811A9C, 0x6081029C, + 0x0081128C, 0x008112BC, 0x008012BC, + 0x008112DC, 0x0081121C, 0x0081139C, + 0x0081109C, 0x0081169C, 0x00811A9C, + 0x0081029C, 0x0081329C, 0xC08112BC, + 0xC08112DC, 0xC081121C, 0xC081139C, 0 }; @@ -353,7 +342,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En case 0x0009: leaveScene(0); break; - case 0x000B://TODO Implement this message + case 0x000B: if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort) leaveScene(0); break; @@ -388,6 +377,7 @@ void WidgetScene::setCurrWidget(Widget *newWidget) { } void WidgetScene::handleEvent(int16 itemID, int eventType) { + // Empty } Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, @@ -403,7 +393,7 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene void Widget::onClick() { _parentScene->setCurrWidget(this); - // TODO _parentScene->onClick(_itemID, 0); + // TODO? _parentScene->onClick(_itemID, 0); } void Widget::setPosition(int16 x, int16 y) { @@ -490,7 +480,7 @@ void TextLabelWidget::clear() { void TextLabelWidget::onClick() { Widget::onClick(); - // TODO Click handler? + // TODO? Click handler } void TextLabelWidget::setString(const byte *string, int stringLen) { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index bb6874ee03..cc1aa2c3de 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -28,12 +28,8 @@ namespace Neverhood { static const uint32 kModule1600SoundList[] = { - 0x90805C50, - 0x90804450, - 0xB4005E60, - 0x91835066, - 0x90E14440, - 0 + 0x90805C50, 0x90804450, 0xB4005E60, + 0x91835066, 0x90E14440, 0 }; Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 31bf05b6ee..348306f39b 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -199,9 +199,9 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene } void AsScene1907Symbol::update() { - AnimatedSprite::updateAnim(); + updateAnim(); handleSpriteUpdate(); - AnimatedSprite::updatePosition(); + updatePosition(); if (_plugInFailed && _plugInTryCount == 0) _plugInFailed = false; } @@ -488,8 +488,8 @@ AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) } void AsScene1907WaterHint::update() { - AnimatedSprite::updateAnim(); - AnimatedSprite::updatePosition(); + updateAnim(); + updatePosition(); } uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -629,19 +629,19 @@ void Scene1907::plugInFailed() { } int Scene1907::getRandomPositionIndex() { - bool flag = false; + bool found = false; int index = 0; // Check if any position is free for (int i = 0; i < 9; i++) if (_positionFree[i]) - flag = true; - if (flag) { + found = true; + if (found) { // Get a random free position - flag = false; - while (!flag) { + found = false; + while (!found) { index = _vm->_rnd->getRandomNumber(9 - 1); if (_positionFree[index]) - flag = true; + found = true; } } return index; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index d4b09844be..bfba0b9b95 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -122,8 +122,6 @@ Common::Error NeverhoodEngine::run() { delete _gameVars; delete _staticData; - debug("Ok."); - return Common::kNoError; } -- cgit v1.2.3