aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohndoe1232012-10-19 13:55:37 +0000
committerWillem Jan Palenstijn2013-05-08 20:47:32 +0200
commit2e32b32808304a172844d835934e7aae6b8cd76f (patch)
treee03ca2d39172207d970305631cc4bb5a6a1b0504
parentef8f0215cfa6287c5d45fef54f040276d95de9b2 (diff)
downloadscummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.tar.gz
scummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.tar.bz2
scummvm-rg350-2e32b32808304a172844d835934e7aae6b8cd76f.zip
NEVERHOOD: Start with the MenuModule
-rw-r--r--engines/neverhood/gamemodule.cpp65
-rw-r--r--engines/neverhood/gamemodule.h8
-rw-r--r--engines/neverhood/menumodule.cpp242
-rw-r--r--engines/neverhood/menumodule.h71
-rw-r--r--engines/neverhood/module.mk1
-rw-r--r--engines/neverhood/neverhood.cpp10
-rw-r--r--engines/neverhood/screen.cpp5
-rw-r--r--engines/neverhood/screen.h1
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 &param, 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 &param, 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 &param, 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 &param, 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 &param, Entity *sender);
+};
+
+class MainMenu : public Scene {
+public:
+ MainMenu(NeverhoodEngine *vm, Module *parentModule);
+protected:
+ Sprite *_musicOnButton;
+ uint32 handleMessage(int messageNum, const MessageParam &param, 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();