diff options
author | johndoe123 | 2012-10-19 13:55:37 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:47:32 +0200 |
commit | 2e32b32808304a172844d835934e7aae6b8cd76f (patch) | |
tree | e03ca2d39172207d970305631cc4bb5a6a1b0504 | |
parent | ef8f0215cfa6287c5d45fef54f040276d95de9b2 (diff) | |
download | scummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.tar.gz scummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.tar.bz2 scummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.zip |
NEVERHOOD: Start with the MenuModule
-rw-r--r-- | engines/neverhood/gamemodule.cpp | 65 | ||||
-rw-r--r-- | engines/neverhood/gamemodule.h | 8 | ||||
-rw-r--r-- | engines/neverhood/menumodule.cpp | 242 | ||||
-rw-r--r-- | engines/neverhood/menumodule.h | 71 | ||||
-rw-r--r-- | engines/neverhood/module.mk | 1 | ||||
-rw-r--r-- | engines/neverhood/neverhood.cpp | 10 | ||||
-rw-r--r-- | engines/neverhood/screen.cpp | 5 | ||||
-rw-r--r-- | engines/neverhood/screen.h | 1 |
8 files changed, 391 insertions, 12 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 80e6fbeaad..d87096df2d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -23,6 +23,7 @@ #include "neverhood/gamemodule.h" #include "neverhood/graphics.h" +#include "neverhood/menumodule.h" #include "neverhood/module1000.h" #include "neverhood/module1100.h" #include "neverhood/module1200.h" @@ -68,8 +69,13 @@ static const uint32 kRadioMusicFileHashes[] = { 0x03322020 }; +enum { + MENU_MODULE = 9999 +}; + GameModule::GameModule(NeverhoodEngine *vm) - : Module(vm, NULL), _moduleNum(-1) { + : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), + _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class // TODO @@ -117,6 +123,13 @@ void GameModule::handleMouseUp(int16 x, int16 y) { } } +void GameModule::handleEscapeKey() { + if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) + _mainMenuRequested = true; + else + sendMessage(_childObject, 0x000C, 0); +} + void GameModule::handleSpaceKey() { if (_childObject) { debug(2, "GameModule::handleSpaceKey()"); @@ -418,6 +431,11 @@ void GameModule::startup() { #endif } +void GameModule::checkMainMenu() { + if (_mainMenuRequested) + openMainMenu(); +} + void GameModule::createModule(int moduleNum, int which) { debug("GameModule::createModule(%d, %d)", moduleNum, which); _moduleNum = moduleNum; @@ -771,4 +789,49 @@ void GameModule::updateModule() { } } +void GameModule::openMainMenu() { + if (_childObject) { + sendMessage(_childObject, 0x101D, 0); + _childObject->draw(); + } else { + // If there's no module, create one so there's something to return to + createModule(1000, 0); + } + // TODO Save FPS, Smacker handle, screen offsets, collisition sprites + _mainMenuRequested = false; + createMenuModule(); +} + +void GameModule::createMenuModule() { + if (!_prevChildObject) { + _prevChildObject = _childObject; + _prevModuleNum = _moduleNum; + _childObject = new MenuModule(_vm, this, 0); + _childObject->handleUpdate(); + SetUpdateHandler(&GameModule::updateMenuModule); + } +} + +void GameModule::updateMenuModule() { + if (!updateChild()) { + // TODO Restore FPS? + _childObject = _prevChildObject; + // TODO Restore Smacker handle, screen offsets, collision sprites + sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed? + _prevChildObject = NULL; + _moduleNum = _prevModuleNum; + SetUpdateHandler(&GameModule::updateModule); + } else if (_gameWasLoaded) { + debug("_gameWasLoaded!"); + _gameWasLoaded = false; + delete _childObject; + delete _prevChildObject; + _childObject = NULL; + _prevChildObject = NULL; + _prevModuleNum = 0; + // TODO Create module from savegame values... + // TODO createModuleByHash(...); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 40834ce5cd..3f661388ca 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -33,9 +33,11 @@ public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); void startup(); + void checkMainMenu(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); void handleMouseUp(int16 x, int16 y); + void handleEscapeKey(); void handleSpaceKey(); void initKeySlotsPuzzle(); void initMemoryPuzzle(); @@ -47,6 +49,9 @@ public: uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; + int _prevModuleNum; + bool _gameWasLoaded; + bool _mainMenuRequested; bool _someFlag1; bool _field2C; uint32 _counter; @@ -55,6 +60,9 @@ protected: void createModule(int moduleNum, int which); void createModuleByHash(uint32 nameHash); void updateModule(); + void openMainMenu(); + void createMenuModule(); + void updateMenuModule(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp new file mode 100644 index 0000000000..372dac1d89 --- /dev/null +++ b/engines/neverhood/menumodule.cpp @@ -0,0 +1,242 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/menumodule.h" + +namespace Neverhood { + +enum { + MAIN_MENU = 0 +}; + +MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + SetMessageHandler(&MenuModule::handleMessage); + + // TODO Check if the background actually needs to be saved + _savedBackground = new Background(_vm, 0); + _savedBackground->createSurface(0, 640, 480); + // TODO Save current palette + // TODO Stop all sounds and music + + _savedPaletteData = _vm->_screen->getPaletteData(); + + createScene(MAIN_MENU, -1); +} + +MenuModule::~MenuModule() { + _vm->_screen->setPaletteData(_savedPaletteData); +} + +void MenuModule::createScene(int sceneNum, int which) { + _sceneNum = sceneNum; + switch (_sceneNum) { + case MAIN_MENU: + _childObject = new MainMenu(_vm, this); + break; + } + SetUpdateHandler(&MenuModule::updateScene); + _childObject->handleUpdate(); +} + +void MenuModule::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case MAIN_MENU: + // TODO + switch (_moduleResult) { + case 0: + // 0048A2A5 + debug("RESTART GAME"); + break; + case 1: + debug("LOAD GAME"); + // TODO createLoadGameMenu(); + break; + case 2: + debug("SAVE GAME"); + // TODO createSaveGameMenu(); + break; + case 3: + debug("RESUME GAME"); + leaveModule(0); + break; + case 4: + debug("QUIT GAME"); + leaveModule(0); + // TODO _gameState->quitGame = true; + break; + case 5: + debug("CREDITS"); + // TODO createCreditsScene(); + break; + case 6: + debug("MAKING OF"); + // TODO playMakingOf(); + break; + case 7: + debug("TOGGLE MUSIC"); + // TODO Toggle music 0048A367 + createScene(MAIN_MENU, -1); + break; + case 8: + debug("DELETE GAME"); + // TODO createDeleteGameMenu(); + break; + default: + createScene(MAIN_MENU, -1); + break; + } + break; + default: + break; + } + } +} + +uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + // TODO CHECKME Handles 0x101F, possibly just a debug/cache message which can be ignored? + return Module::handleMessage(messageNum, param, sender);; +} + +static const uint32 kMainMenuButtonFileHashes[] = { + 0x36C62120, + 0x56C62120, + 0x96C62120, + 0x16C62121, + 0x16C62122, + 0x16C62124, + 0x16C62128, + 0x16C62130, + 0x16C62100 +}; + +MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex) + : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { + + _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]); + createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + + // TODO Move to const array + switch (_buttonIndex) { + case 0: + _rect.set(52, 121, 110, 156); + break; + case 1: + _rect.set(52, 192, 109, 222); + break; + case 2: + _rect.set(60, 257, 119, 286); + break; + case 3: + _rect.set(67, 326, 120, 354); + break; + case 4: + _rect.set(70, 389, 128, 416); + break; + case 5: + _rect.set(523, 113, 580, 144); + break; + case 6: + _rect.set(525, 176, 577, 206); + break; + case 7: + _rect.set(527, 384, 580, 412); + break; + case 8: + _rect.set(522, 255, 580, 289); + break; + } + + setVisible(false); + _needRefresh = true; + + SetUpdateHandler(&MainMenuButton::update); + SetMessageHandler(&MainMenuButton::handleMessage); + +} + +void MainMenuButton::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + sendMessage(_parentScene, 0x2000, _buttonIndex); + } +} + +uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + setVisible(true); + _countdown = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule, true) { + + setBackground(0x08C0020C); + setPalette(0x08C0020C); + insertMouse433(0x00208084); + + insertStaticSprite(0x41137051, 100); + insertStaticSprite(0xC10B2015, 100); + + // TODO Only is music is disabled + _musicOnButton = insertStaticSprite(0x0C24C0EE, 100); + + for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) { + Sprite *mainMenuButton = insertSprite<MainMenuButton>(this, buttonIndex); + _vm->_collisionMan->addSprite(mainMenuButton); + } + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&MainMenu::handleMessage); + +} + +uint32 MainMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + leaveScene(param.asInteger()); + break; + } + return 0; +} + + +} // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h new file mode 100644 index 0000000000..c60698c1ef --- /dev/null +++ b/engines/neverhood/menumodule.h @@ -0,0 +1,71 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_MENUMODULE_H +#define NEVERHOOD_MENUMODULE_H + +#include "common/str.h" +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class MenuModule : public Module { +public: + MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~MenuModule(); +protected: + int _sceneNum; + Common::String _savegameName; + Background *_savedBackground; + byte *_savedPaletteData; + // TODO _savegameList (list of strings?) + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class MainMenuButton : public StaticSprite { +public: + MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex); +protected: + Scene *_parentScene; + int _countdown; + uint _buttonIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class MainMenu : public Scene { +public: + MainMenu(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_musicOnButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MENUMODULE_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 5cd41c87fe..224dfb579f 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -11,6 +11,7 @@ MODULE_OBJS = \ gamevars.o \ graphics.o \ klayman.o \ + menumodule.o \ module.o \ module1000.o \ module1100.o \ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 76c2bc09eb..631b0506b1 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -85,12 +85,6 @@ Common::Error NeverhoodEngine::run() { _res->addArchive("t.blb"); CursorMan.showMouse(true); - { - // DEBUG: Dummy cursor - byte buffer[2*2]; - memset(buffer, 255, 4); - CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0); - } #if 0 // TODO: This should probably be implemented as debug command later @@ -119,6 +113,9 @@ Common::Error NeverhoodEngine::run() { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; switch (_keyState) { + case Common::KEYCODE_ESCAPE: + _gameModule->handleEscapeKey(); + break; case Common::KEYCODE_SPACE: _gameModule->handleSpaceKey(); break; @@ -151,6 +148,7 @@ Common::Error NeverhoodEngine::run() { } if (_system->getMillis() >= nextFrameTime) { + _gameModule->checkMainMenu(); _gameModule->handleUpdate(); _gameModule->draw(); _screen->update(); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index a5f7b4dac7..a2437ba010 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -90,11 +90,6 @@ void Screen::update() { updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height)); } - /* - for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) - debug("## (%d, %d, %d, %d)", (*ri).left, (*ri).top, (*ri).right, (*ri).bottom); - */ - for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index bbf4f5fe73..69329fd59a 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -66,6 +66,7 @@ public: int getFps(); void setPaletteData(byte *paletteData); void unsetPaletteData(byte *paletteData); + byte *getPaletteData() { return _paletteData; } void testPalette(byte *paletteData); void updatePalette(); void clear(); |