diff options
-rw-r--r-- | engines/neverhood/gamemodule.cpp | 2 | ||||
-rw-r--r-- | engines/neverhood/klayman.cpp | 91 | ||||
-rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
-rw-r--r-- | engines/neverhood/module2400.cpp | 125 | ||||
-rw-r--r-- | engines/neverhood/module2400.h | 13 |
5 files changed, 237 insertions, 1 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index dcc0995440..23f6dbc0bd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -354,7 +354,7 @@ void GameModule::startup() { createModule(2500, -1); #endif #if 1 - _vm->gameState().sceneNum = 1; + _vm->gameState().sceneNum = 5; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 17124e58ad..cebf71529c 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5443,6 +5443,97 @@ void KmScene2402::sub415840() { SetSpriteUpdate(NULL); } +KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // TODO Cliprects +} + +uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klayman::stWalking); + } else { + GotoState(&Klayman::stPeekWall); + } + break; + case 0x4812: + if (param.asInteger() == 2) + GotoState(&Klayman::stPickUpNeedle); + else if (param.asInteger() == 1) + GotoState(&Klayman::sub41FFF0); + else + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481A: + GotoState(&Klayman::stInsertDisk); + 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() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7593bf1e3b..0f2077e2a6 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -603,6 +603,13 @@ protected: void sub415840(); }; +class KmScene2406 : public Klayman { +public: + KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2501 : public Klayman { public: KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 1c52d68db8..d161389fc2 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -53,6 +53,10 @@ void Module2400::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2402(_vm, this, which); break; + case 5: + // TODO Music18hList_play(0xB110382D, 0, 2, 1); + _childObject = new Scene2406(_vm, this, which); + break; } SetUpdateHandler(&Module2400::updateScene); _childObject->handleUpdate(); @@ -75,6 +79,16 @@ void Module2400::updateScene() { else createScene(0, 1); break; + case 5: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(4, 0); + else if (_moduleResult == 3) + createScene(8, -1); + else + createScene(1, 1); + break; } } } @@ -764,4 +778,115 @@ void Scene2402::playPipeSound(uint32 fileHash) { _soundToggle = !_soundToggle; } +Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) { + setGlobalVar(0x13382860, 2); + } + + _surfaceFlag = true; + SetMessageHandler(&Scene2406::handleMessage); + + setRectList(0x004B78C8); + insertMouse433(0xB03001A8); + + if (getGlobalVar(0x13382860) == 2) { + _class545 = insertSprite<Class545>(this, 2, 1100, 560, 409); + _vm->_collisionMan->addSprite(_class545); + } + + _asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + + tempSprite = insertStaticSprite(0x19625293, 1100); + _clipRects[0].x1 = 0; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = tempSprite->getDrawRect().x2(); + _clipRects[0].y2 = 480; + + if (getGlobalVar(0x18890C91)) { + setBackground(0x1A0B0304); + setPalette(0x1A0B0304); + _sprite1 = insertStaticSprite(0x32923922, 1100); + } else { + setBackground(0x0A038595); + setPalette(0x0A038595); + _sprite1 = insertStaticSprite(0x1712112A, 1100); + } + + tempSprite = insertStaticSprite(0x22300924, 1300); + + _clipRects[1].x1 = _sprite1->getDrawRect().x; + _clipRects[1].y1 = tempSprite->getDrawRect().y; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; + + if (which < 0) { + _flag1 = false; + insertKlayman<KmScene2406>(307, 404, _clipRects, 2); + setMessageList(0x004B76C8); + setRectList(0x004B78C8); + } else if (which == 1) { + _flag1 = true; + insertKlayman<KmScene2406>(253, -16, _clipRects, 2); + setMessageList(0x004B76D8); + setRectList(0x004B78D8); + } else if (which == 2) { + _flag1 = false; + insertKlayman<KmScene2406>(480, 404, _clipRects, 2); + setMessageList(0x004B77C0); + setRectList(0x004B78C8); + } else if (which == 3) { + _flag1 = false; + insertKlayman<KmScene2406>(387, 404, _clipRects, 2); + setMessageList(0x004B7810); + setRectList(0x004B78C8); + } else { + _flag1 = false; + insertKlayman<KmScene2406>(0, 404, _clipRects, 2); + setMessageList(0x004B76D0); + setRectList(0x004B78C8); + } + + tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman); + tempSprite->setClipRect(_clipRects[1]); + +} + +uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x41062804) { + if (getGlobalVar(0x18890C91)) { + setMessageList(0x004B7758); + } else { + setMessageList(0x004B7738); + } + } + break; + case 0x2000: + _flag1 = true; + setRectList(0x004B78D8); + break; + case 0x2001: + _flag1 = false; + setRectList(0x004B78C8); + break; + case 0x4826: + if (sender == _asTape && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B77C8); + } else if (sender == _class545 && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _class545); + setMessageList(0x004B77D8); + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 4367901672..9a593d8dc9 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -31,6 +31,7 @@ #include "neverhood/module1100.h" #include "neverhood/module1200.h" #include "neverhood/module2100.h" +#include "neverhood/module2200.h" namespace Neverhood { @@ -159,6 +160,18 @@ protected: void playPipeSound(uint32 fileHash); }; +class Scene2406 : public Scene { +public: + Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asTape; + Sprite *_class545; + NRect _clipRects[2]; + bool _flag1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2400_H */ |