diff options
-rw-r--r-- | engines/neverhood/gamemodule.cpp | 18 | ||||
-rw-r--r-- | engines/neverhood/klayman.cpp | 72 | ||||
-rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
-rw-r--r-- | engines/neverhood/module.mk | 1 | ||||
-rw-r--r-- | engines/neverhood/module2800.cpp | 201 | ||||
-rw-r--r-- | engines/neverhood/module2800.h | 59 |
6 files changed, 357 insertions, 1 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 72f15a6bed..781a9c305a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -39,6 +39,7 @@ #include "neverhood/module2300.h" #include "neverhood/module2600.h" #include "neverhood/module2700.h" +#include "neverhood/module2800.h" #include "neverhood/module3000.h" namespace Neverhood { @@ -275,7 +276,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(1000, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif @@ -301,6 +302,10 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule(2800, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -372,6 +377,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x42212411); _childObject = new Module2700(_vm, this, which); break; + case 2800: + setGlobalVar(0x91080831, 0x64210814); + _childObject = new Module2800(_vm, this, which); + break; case 3000: setGlobalVar(0x91080831, 0x81293110); _childObject = new Module3000(_vm, this, which); @@ -489,6 +498,13 @@ void GameModule::updateModule() { case 2700: createModule(1800, 2); break; + case 2800: + if (_moduleResult == 1) { + createModule(2900, 5); + } else { + createModule(1800, 0); + } + break; case 3000: if (_moduleResult == 1) { createModule(1900, 0); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index bdc53d65f6..6873e505fa 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4847,4 +4847,76 @@ void KmScene2247::sub453520() { FinalizeState(&Klayman::stStartWalkingDone); } +KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klayman::stTurnToUse); + break; + case 0x481E: + GotoState(&Klayman::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWalkToFrontNoStep); + } else { + GotoState(&Klayman::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnToFront); + } else { + GotoState(&Klayman::stTurnToBack); + } + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7b8b42ebae..355c6d6f15 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -542,6 +542,13 @@ protected: void sub453520(); }; +class KmScene2801 : public Klayman { +public: + KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index adf58b1225..780ee76ae1 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -27,6 +27,7 @@ MODULE_OBJS = \ module2300.o \ module2600.o \ module2700.o \ + module2800.o \ module3000.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp new file mode 100644 index 0000000000..3a86e29f36 --- /dev/null +++ b/engines/neverhood/module2800.cpp @@ -0,0 +1,201 @@ +/* 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/module2800.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" +#include "neverhood/module1200.h" +#include "neverhood/module1700.h" + +namespace Neverhood { + +Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _fileHash = 0; + // TODO music stuff + // TODO Music18hList_add(0x64210814, 0xD2FA4D14); + setGlobalVar(0x28D8C940, 1); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, which); + } else if (which == 2) { + createScene(4, 3); + } else if (which == 1) { + createScene(4, 1); + } else { + createScene(0, 0); + } + +} + +Module2800::~Module2800() { + // TODO music stuff + // TODO Sound1ChList_sub_407A50(0x64210814); + // TODO Module2800_sub471DF0(); +} + +void Module2800::createScene(int sceneNum, int which) { + debug("Module2800::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_stop(0xD2FA4D14, 0, 0); + _childObject = new Scene2801(_vm, this, which); + break; + // TODO ... + } + SetUpdateHandler(&Module2800::updateScene); + _childObject->handleUpdate(); +} + +void Module2800::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult != 2) { + // TODO music stuff + } + if (_moduleResult == 1) { + createScene(2, 0); + } else if (_moduleResult == 2) { + createScene(1, 0); + } else { + leaveModule(0); + } + break; + } + } else { + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Module2800_sub4731E0(true); + break; + } + } +} + +Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + // TODO _vm->gameModule()->initScene2801Vars(); + + _surfaceFlag = true; + SetMessageHandler(&Scene2801::handleMessage); + SetUpdateHandler(&Scene::update); + + if (getGlobalVar(0x4DE80AC0) == 0) { + insertStaticSprite(0x0001264C, 100); + } + + if (which < 0) { + insertKlayman<KmScene2801>(194, 430); + setMessageList(0x004B6BB8); + } else if (which == 1) { + insertKlayman<KmScene2801>(443, 398); + setMessageList(0x004B6BC0); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + insertKlayman<KmScene2801>(312, 432); + _klayman->setDoDeltaX(1); + setMessageList(0x004B6C10); + } else { + insertKlayman<KmScene2801>(194, 432); + setMessageList(0x004B6C10); + } + } else { + insertKlayman<KmScene2801>(0, 432); + setMessageList(0x004B6BB0); + } + + if (getGlobalVar(0x09880D40)) { + setRectList(0x004B6CE0); + setBackground(0x01400666); + setPalette(0x01400666); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x01400666, 0, 256, 0); + _sprite1 = insertStaticSprite(0x100CA0A8, 1100); + _sprite2 = insertStaticSprite(0x287C21A4, 1100); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x0066201C); + _asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } else if (getGlobalVar(0x08180ABC)) { + setRectList(0x004B6CD0); + setBackground(0x11E00684); + setPalette(0x11E00684); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x11E00684, 0, 256, 0); + _sprite2 = insertStaticSprite(0x061601C8, 1100); + _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x00680116); + _asTape = insertSprite<Class606>(this, 8, 1100, 302, 437, 0x01142428); + _vm->_collisionMan->addSprite(_asTape); + } else { + setRectList(0x004B6CF0); + setBackground(0x030006E6); + setPalette(0x030006E6); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x030006E6, 0, 256, 0); + _sprite2 = insertStaticSprite(0x273801CE, 1100); + _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x006E2038); + _asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } + + if (which == 1) { + _palette->addPalette(0xB103B604, 0, 65, 0); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + } else { + _palette->addPalette(_paletteHash, 0, 65, 0); + _palette->addBasePalette(_paletteHash, 0, 65, 0); + } + +} + +Scene2801::~Scene2801() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + // TODO: case 0x000D: + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B6C40); + } + break; + case 0x482A: + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + case 0x482B: + _palette->addBasePalette(_paletteHash, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h new file mode 100644 index 0000000000..cdfcdbe802 --- /dev/null +++ b/engines/neverhood/module2800.h @@ -0,0 +1,59 @@ +/* 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. + * + */ + +#ifndef NEVERHOOD_MODULE2800_H +#define NEVERHOOD_MODULE2800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2800 + +class Module2800 : public Module { +public: + Module2800(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2800(); +protected: + bool _flag; + uint32 _fileHash; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class Scene2801 : public Scene { +public: + Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2801(); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_asTape; + uint32 _paletteHash; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2800_H */ |