diff options
-rw-r--r-- | engines/neverhood/gamemodule.cpp | 2 | ||||
-rw-r--r-- | engines/neverhood/klayman.cpp | 53 | ||||
-rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
-rw-r--r-- | engines/neverhood/module1300.cpp | 113 | ||||
-rw-r--r-- | engines/neverhood/module1300.h | 18 | ||||
-rw-r--r-- | engines/neverhood/module1400.cpp | 7 |
6 files changed, 196 insertions, 4 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 8b984e211f..4c70ff203b 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -247,7 +247,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 3; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index d8b1dbee7d..57e1274dc2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2978,6 +2978,59 @@ void KmScene1303::sub4162B0() { SetMessageHandler(&KmScene1303::handleMessage4160A0); } +KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + +} + +uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 31a96f7cc7..77c4160794 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -335,6 +335,13 @@ protected: void sub4162B0(); }; +class KmScene1304 : public Klayman { +public: + KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index d893e8f483..c6dfd3886b 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1300.h" #include "neverhood/module1000.h" +#include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" @@ -163,6 +164,11 @@ void Module1300::createScene1303(int which) { } void Module1300::createScene1304(int which) { + _vm->gameState().sceneNum = 3; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1304(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1304); } void Module1300::createScene1305(int which) { @@ -259,6 +265,14 @@ void Module1300::updateScene1303() { } void Module1300::updateScene1304() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1316(0); + _childObject->handleUpdate(); + } } void Module1300::updateScene1305() { @@ -770,4 +784,103 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { + + if (getGlobalVar(0x31C63C51)) { + _surface->setVisible(false); + SetMessageHandler(NULL); + } else { + SetMessageHandler(&Class544::handleMessage); + } +} + +uint32 Class544::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setGlobalVar(0x31C63C51, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene1304::handleMessage); + setRectList(0x004B91A8); + + _background = addBackground(new DirtyBackground(_vm, 0x062C0214, 0, 0)); + _palette = new Palette(_vm, 0x062C0214); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL)); + + if (getGlobalVar(0xAC00C0D0)) { + _class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347)); + _vm->_collisionMan->addSprite(_class545); + } else { + _class545 = addSprite(new AnimatedSprite(_vm, 0x80106018, 100, 279, 48)); + // TODO _class545->setUpdateDeltaXY(); + } + + if (!getGlobalVar(0x31C63C51)) { + _class544 = addSprite(new Class544(_vm, this, 1100, 278, 347)); + _vm->_collisionMan->addSprite(_class544); + } else { + _class544 = NULL; + } + + _sprite1 = addSprite(new StaticSprite(_vm, 0x0562E621, 1100)); + addSprite(new StaticSprite(_vm, 0x012AE033, 1100)); + addSprite(new StaticSprite(_vm, 0x090AF033, 1100)); + + if (which < 0) { + _klayman = new KmScene1304(_vm, this, 217, 347); + setMessageList(0x004B90E8); + } else { + _klayman = new KmScene1304(_vm, this, 100, 347); + setMessageList(0x004B90F0); + } + addSprite(_klayman); + + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + +} + +uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x415634A4) { + if (getGlobalVar(0xAC00C0D0)) { + messageList402220(); + } else { + setMessageList(0x004B9158); + } + } + break; + case 0x4826: + if (sender == _class544) { + _klayman->sendEntityMessage(0x1014, _class544, this); + setMessageList(0x004B9130); + } else if (sender == _class545) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004B9140); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index edabe4f3a9..ca53147331 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -147,6 +147,24 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class544 : public AnimatedSprite { +public: + Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1304 : public Scene { +public: + Scene1304(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_class545; + Sprite *_class544; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 52e5ae73c2..7835520273 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1400.h" #include "neverhood/module1000.h" +#include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/gamemodule.h" @@ -1456,7 +1457,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _class401_1->getSurface()->setVisible(false); _class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995)); - + _class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995)); _asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011); @@ -1578,8 +1579,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL)); if (getGlobalVar(0x13382860) == 5) { - // TODO _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); - // TODO _vm->_collisionMan->addSprite(_class545); + _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); + _vm->_collisionMan->addSprite(_class545); } _sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100)); |