aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohndoe1232012-09-14 11:46:28 +0000
committerWillem Jan Palenstijn2013-05-08 20:43:41 +0200
commit93614a17a8377a0cf4216c0fe9fbbf83fc82791f (patch)
treeadbe052eb54864dc48b966ea2c3f6b392b98c748
parent7c2aa2a22556c84fa8ec1d5f6993dfc8c47fb0c3 (diff)
downloadscummvm-rg350-93614a17a8377a0cf4216c0fe9fbbf83fc82791f.tar.gz
scummvm-rg350-93614a17a8377a0cf4216c0fe9fbbf83fc82791f.tar.bz2
scummvm-rg350-93614a17a8377a0cf4216c0fe9fbbf83fc82791f.zip
NEVERHOOD: Implement Scene2406
-rw-r--r--engines/neverhood/gamemodule.cpp2
-rw-r--r--engines/neverhood/klayman.cpp91
-rw-r--r--engines/neverhood/klayman.h7
-rw-r--r--engines/neverhood/module2400.cpp125
-rw-r--r--engines/neverhood/module2400.h13
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 &param) {
+ 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 &param);
+};
+
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 &param, 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 &param, Entity *sender);
+};
+
} // End of namespace Neverhood
#endif /* NEVERHOOD_MODULE2400_H */