aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/neverhood/gamemodule.cpp2
-rw-r--r--engines/neverhood/klayman.cpp53
-rw-r--r--engines/neverhood/klayman.h7
-rw-r--r--engines/neverhood/module1300.cpp113
-rw-r--r--engines/neverhood/module1300.h18
-rw-r--r--engines/neverhood/module1400.cpp7
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 &param) {
+ 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 &param);
+};
+
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 &param, 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 &param, 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 &param, 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 &param, 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 &param, 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 &param, 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));