diff options
-rw-r--r-- | engines/neverhood/gamemodule.cpp | 2 | ||||
-rw-r--r-- | engines/neverhood/klayman.cpp | 86 | ||||
-rw-r--r-- | engines/neverhood/klayman.h | 7 | ||||
-rw-r--r-- | engines/neverhood/module2400.cpp | 106 | ||||
-rw-r--r-- | engines/neverhood/module2400.h | 17 |
5 files changed, 217 insertions, 1 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 23f6dbc0bd..19bdc65fa1 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 = 5; + _vm->gameState().sceneNum = 2; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index cebf71529c..957b9ef6ca 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5443,6 +5443,92 @@ void KmScene2402::sub415840() { SetSpriteUpdate(NULL); } +KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2403::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 0x480D: + GotoState(&Klayman::sub420F60); + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4816: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); + } + 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 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 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { // TODO Cliprects diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 0f2077e2a6..b752b1ecdb 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -603,6 +603,13 @@ protected: void sub415840(); }; +class KmScene2403 : public Klayman { +public: + KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2406 : public Klayman { public: KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index d161389fc2..22ea30bb45 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 2: + // TODO Music18hList_play(0xB110382D, 0, 0, 1); + _childObject = new Scene2403(_vm, this, which); + break; case 5: // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2406(_vm, this, which); @@ -79,6 +83,14 @@ void Module2400::updateScene() { else createScene(0, 1); break; + case 2: + if (_moduleResult == 1) + createScene(9, -1); + else if (_moduleResult == 2) + createScene(6, -1); + else + createScene(5, 1); + break; case 5: if (_moduleResult == 1) createScene(2, 0); @@ -778,6 +790,100 @@ void Scene2402::playPipeSound(uint32 fileHash) { _soundToggle = !_soundToggle; } +Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm) { + + Sprite *tempSprite; + + _surfaceFlag = true; + SetMessageHandler(&Scene2403::handleMessage); + setBackground(0x0C05060C); + setPalette(0x0C05060C); + _palette->addPalette(0x414364B0, 0, 65, 0); + insertMouse433(0x506080C8); + _asTape = insertSprite<AsScene1201Tape>(this, 2, 1100, 480, 454, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + _asLightCord = insertSprite<AsScene2803LightCord>(this, 0xA1095A10, 0x836D3813, 368, 200); + _asLightCord->setClipRect(0, 25, 640, 480); + + if (which < 0) { + _flag1 = false; + insertKlayman<KmScene2403>(220, 449); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else if (which == 1) { + _flag1 = false; + insertKlayman<KmScene2403>(433, 449); + setMessageList(0x004B5D70); + setRectList(0x004B5E18); + } else if (which == 2) { + _flag1 = false; + insertKlayman<KmScene2403>(440, 449); + _klayman->setDoDeltaX(1); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else { + _flag1 = true; + insertKlayman<KmScene2403>(122, 599); + setMessageList(0x004B5CA0); + setRectList(0x004B5E28); + } + + _ssButton = insertSprite<SsCommonButtonSprite>(this, 0x3130B0EB, 100, 0); + _sprite1 = insertStaticSprite(0x20C24220, 1100); + _sprite2 = insertStaticSprite(0x03080900, 1300); + tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman); + tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); + + _soundResource2.load(calcHash("fxFogHornSoft")); + +} + +uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040424D0) { + sendEntityMessage(_klayman, 0x1014, _ssButton); + } else if (param.asInteger() == 0x180CE614) { + sendEntityMessage(_klayman, 0x1014, _asLightCord); + } + break; + case 0x2000: + _flag1 = true; + setRectList(0x004B5E28); + break; + case 0x2001: + _flag1 = false; + setRectList(0x004B5E18); + break; + case 0x480B: + if (sender == _ssButton) { + if (getSubVar(0x14800353, 0x304008D2)) { + setSubVar(0x14800353, 0x304008D2, 0); + _soundResource1.play(calcHash("fx3LocksDisable")); + } else { + setSubVar(0x14800353, 0x304008D2, 1); + _soundResource2.play(); + } + } + break; + case 0x480F: + if (sender == _asLightCord) { + leaveScene(2); + } + break; + case 0x4826: + if (sender == _asTape && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B5D98); + } + break; + } + return messageResult; +} + Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 9a593d8dc9..16c1d64625 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -32,6 +32,7 @@ #include "neverhood/module1200.h" #include "neverhood/module2100.h" #include "neverhood/module2200.h" +#include "neverhood/module2800.h" namespace Neverhood { @@ -160,6 +161,22 @@ protected: void playPipeSound(uint32 fileHash); }; +class Scene2403 : public Scene { +public: + Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_ssButton; + Sprite *_asTape; + Sprite *_class545; + Sprite *_asLightCord; + bool _flag1; + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2406 : public Scene { public: Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); |