aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/neverhood/gamemodule.cpp2
-rw-r--r--engines/neverhood/klayman.cpp86
-rw-r--r--engines/neverhood/klayman.h7
-rw-r--r--engines/neverhood/module2400.cpp106
-rw-r--r--engines/neverhood/module2400.h17
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 &param) {
+ 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 &param);
+};
+
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 &param, 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 &param, Entity *sender);
+};
+
class Scene2406 : public Scene {
public:
Scene2406(NeverhoodEngine *vm, Module *parentModule, int which);