aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorjohndoe1232011-09-12 19:09:01 +0000
committerWillem Jan Palenstijn2013-05-08 20:39:36 +0200
commit9b151cefc352a8f42c005a7406d4b694aa4a221c (patch)
treeed6cc8bc45faaceee2ae8995522ade7185e6343c /engines
parentb16f34c376d16ca98fa7ef18e9781a30b159c918 (diff)
downloadscummvm-rg350-9b151cefc352a8f42c005a7406d4b694aa4a221c.tar.gz
scummvm-rg350-9b151cefc352a8f42c005a7406d4b694aa4a221c.tar.bz2
scummvm-rg350-9b151cefc352a8f42c005a7406d4b694aa4a221c.zip
NEVERHOOD: Implement HallOfRecordsScene (and all HoR scenes) and Scene2247
- Load SceneInfo140 from neverhood.dat - Some renaming
Diffstat (limited to 'engines')
-rw-r--r--engines/neverhood/gamemodule.cpp2
-rw-r--r--engines/neverhood/gamevars.cpp2
-rw-r--r--engines/neverhood/klayman.cpp204
-rw-r--r--engines/neverhood/klayman.h18
-rw-r--r--engines/neverhood/module2200.cpp1169
-rw-r--r--engines/neverhood/module2200.h76
-rw-r--r--engines/neverhood/scene.cpp1
-rw-r--r--engines/neverhood/staticdata.cpp21
-rw-r--r--engines/neverhood/staticdata.h11
9 files changed, 1335 insertions, 169 deletions
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d9237b9f60..31330f97f5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
createModule2000(-1);
#endif
#if 1
- _vm->gameState().sceneNum = 41;
+ _vm->gameState().sceneNum = 46;
createModule2200(-1);
#endif
}
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index e0cae80105..3e4e60438a 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -102,7 +102,7 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
}
int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
- debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
+ //debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
if (subVarIndex == -1) {
subVarIndex = addSubVar(varIndex, subNameHash, 0);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index a20f91b383..e0359fc28f 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -150,7 +150,7 @@ uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, E
}
void Klayman::sub41FD90() {
- // TODO _soundResource1.stop(0);
+ _soundResource1.stop();
}
void Klayman::sub41FDA0() {
@@ -195,7 +195,7 @@ void Klayman::sub41FE00() {
}
void Klayman::sub41FE50() {
- // TODO _soundResource1.stop(0);
+ _soundResource1.stop();
}
uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -485,7 +485,6 @@ bool Klayman::sub41CF10(AnimationCb callback) {
}
void Klayman::sub41C7B0() {
- //debug("Klayman::sub41C7B0()");
if (_callback1Cb) {
AnimationCb cb = _callback1Cb;
_callback1Cb = NULL;
@@ -515,7 +514,6 @@ void Klayman::sub41C790() {
}
void Klayman::sub41FC80() {
- //ok
if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
_status2 = 1;
_flagE5 = true;
@@ -555,7 +553,6 @@ void Klayman::update41D0F0() {
}
uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41D360(%04X)", messageNum);
Sprite::handleMessage(messageNum, param, sender);
uint32 messageResult = xHandleMessage(messageNum, param);
switch (messageNum) {
@@ -603,7 +600,6 @@ void Klayman::sub41FF00() {
}
uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41D480(%04X)", messageNum);
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x3002:
@@ -614,7 +610,6 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
}
void Klayman::sub41FCF0() {
- //ok
_status2 = 1;
_flagE5 = true;
setFileHash(0x5420E254, 0, -1);
@@ -624,7 +619,6 @@ void Klayman::sub41FCF0() {
}
uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41F140(%04X)", messageNum);
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -640,7 +634,6 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
void Klayman::sub41C930(int16 x, bool flag) {
- //debug("Klayman::sub41C930(%d, %d)", x, flag);
int16 xdiff = ABS(x - _x);
if (x == _x) {
_x4 = x;
@@ -690,8 +683,6 @@ void Klayman::sub4211B0() {
}
uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
- //debug("Klayman::handleMessage41E920(%04X)", messageNum);
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -720,7 +711,6 @@ bool Klayman::sub41CEB0(AnimationCb callback3) {
}
void Klayman::spriteUpdate41F250() {
- //debug("Klayman::spriteUpdate41F250()");
int16 xdiff = _x4 - _x;
@@ -752,7 +742,6 @@ void Klayman::spriteUpdate41F250() {
}
void Klayman::spriteUpdate41F5F0() {
- //debug("Klayman::spriteUpdate41F5F0()");
int16 xdiff = _x4 - _x;
@@ -817,7 +806,6 @@ void Klayman::sub41FBB0() {
}
uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41DD80(%04X)", messageNum);
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -848,7 +836,6 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, E
}
void Klayman::sub41CD70(int16 x) {
- //debug("Klayman::sub41CD70(%d)", x);
if (x > _x) {
if (ABS(x - _x) <= 105) {
sub41CAC0(x);
@@ -884,7 +871,6 @@ void Klayman::sub41FB30() {
}
uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41EC70(%04X)", messageNum);
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -924,7 +910,6 @@ void Klayman::spriteUpdate41F300() {
}
uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41EB70(%04X)", messageNum);
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -1063,7 +1048,6 @@ void Klayman::sub41FF80() {
}
uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41D4C0(%04X)", messageNum);
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -1101,7 +1085,6 @@ void Klayman::sub420120() {
}
uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41DAD0(%04X)", messageNum);
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -1182,7 +1165,6 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
}
void Klayman::sub41CAC0(int16 x) {
- //debug("Klayman::sub41CAC0(%d)", x);
int16 xdiff = ABS(x - _x);
if (x == _x) {
_x4 = x;
@@ -1272,7 +1254,6 @@ void Klayman::spriteUpdate41F780() {
}
uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41DF10(%04X)", messageNum);
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -1318,7 +1299,6 @@ void Klayman::sub4208F0() {
}
uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("Klayman::handleMessage41EEF0(%04X)", messageNum);
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2039,7 +2019,6 @@ KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
}
uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
- //debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
switch (messageNum) {
case 0x4001:
case 0x4800:
@@ -2125,7 +2104,6 @@ void KmScene1001::sub44FA50() {
}
uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
- //debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2160,8 +2138,6 @@ void KmScene1002::xUpdate() {
}
uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
- //ok
- //debug("KmScene1002::xHandleMessage(%04X)", messageNum);
switch (messageNum) {
case 0x2001:
setCallback2(AnimationCallback(&KmScene1002::sub449E90));
@@ -2263,7 +2239,6 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
}
void KmScene1002::update4497D0() {
- //debug("KmScene1002::update4497D0()");
Klayman::update();
if (_counter1 != 0 && (--_counter1 == 0)) {
_surface->setVisible(true);
@@ -2272,7 +2247,6 @@ void KmScene1002::update4497D0() {
}
uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2299,7 +2273,6 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &para
}
uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
switch (messageNum) {
case 0x4811:
_soundResource1.play(0x5252A0E4);
@@ -2323,7 +2296,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &para
}
uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2376,7 +2348,6 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &para
}
uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2395,7 +2366,6 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &para
}
uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
uint32 messageResult = handleMessage41D480(messageNum, param, sender);
switch (messageNum) {
case 0x1008:
@@ -2420,7 +2390,6 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &para
}
uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender) {
- //ok
uint32 messageResult = handleMessage41D360(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
@@ -2433,10 +2402,8 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &para
}
void KmScene1002::spriteUpdate449DC0() {
- //debug("KmScene1002::spriteUpdate449DC0()");
AnimatedSprite::updateDeltaXY();
HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
- //debug("$$$ hitRect->type = %04X", hitRect->type);
if (hitRect->type == 0x5001) {
_y = hitRect->rect.y1;
processDelta();
@@ -2446,7 +2413,6 @@ void KmScene1002::spriteUpdate449DC0() {
}
void KmScene1002::sub449E20() {
- //debug("KmScene1002::sub449E20()");
if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) {
_status2 = 2;
_flagE5 = false;
@@ -2460,7 +2426,6 @@ void KmScene1002::sub449E20() {
}
void KmScene1002::sub449E90() {
- //debug("KmScene1002::sub449E90()");
_soundResource1.play(0x56548280);
_status2 = 0;
_flagE5 = false;
@@ -2472,8 +2437,6 @@ void KmScene1002::sub449E90() {
}
void KmScene1002::sub449EF0() {
- //ok
- //debug("KmScene1002::sub449EF0()");
_counter1 = 1;
_status2 = 0;
_flagE5 = false;
@@ -2491,8 +2454,6 @@ void KmScene1002::sub449EF0() {
}
void KmScene1002::sub449F70() {
- //ok
- //debug("KmScene1002::sub449F70()");
_parentScene->sendMessage(0x1024, 1, this);
_soundResource1.play(0x41648271);
_status2 = 1;
@@ -2511,8 +2472,6 @@ void KmScene1002::sub449F70() {
}
void KmScene1002::sub44A050() {
- //ok
- //debug("KmScene1002::sub44A050()");
_counter1 = 1;
_status2 = 0;
_flagE5 = false;
@@ -2526,8 +2485,6 @@ void KmScene1002::sub44A050() {
}
void KmScene1002::sub44A0D0() {
- //ok
- //debug("KmScene1002::sub44A0D0()");
_counter1 = 1;
_status2 = 0;
_flagE5 = false;
@@ -2541,8 +2498,6 @@ void KmScene1002::sub44A0D0() {
}
void KmScene1002::sub44A150() {
- //ok
- //debug("KmScene1002::sub44A150()");
_parentScene->sendMessage(0x1024, 1, this);
_soundResource1.play(0x41648271);
_status2 = 1;
@@ -2561,15 +2516,11 @@ void KmScene1002::sub44A150() {
}
void KmScene1002::sub44A230() {
- //ok
- //debug("KmScene1002::sub44A230()");
setDoDeltaX(2);
sub41FC80();
}
void KmScene1002::sub44A250() {
- //ok
- //debug("KmScene1002::sub44A250()");
if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
_parentScene->sendMessage(0x1024, 3, this);
_status2 = 2;
@@ -2583,8 +2534,6 @@ void KmScene1002::sub44A250() {
}
void KmScene1002::sub44A2C0() {
- //ok
- //debug("KmScene1002::sub44A2C0()");
if (_attachedSprite) {
_x = ((Sprite*)_attachedSprite)->getX();
_attachedSprite->sendMessage(0x4807, 0, this);
@@ -2600,8 +2549,6 @@ void KmScene1002::sub44A2C0() {
}
void KmScene1002::sub44A330() {
- //ok
- //debug("KmScene1002::sub44A330()");
_status2 = 2;
_flagE5 = true;
setDoDeltaX(0);
@@ -2612,8 +2559,6 @@ void KmScene1002::sub44A330() {
}
void KmScene1002::sub44A370() {
- //ok
- //debug("KmScene1002::sub44A370()");
_status2 = 1;
_flagE5 = false;
setFileHash(0x35AA8059, 0, -1);
@@ -2624,13 +2569,10 @@ void KmScene1002::sub44A370() {
}
void KmScene1002::sub44A3C0() {
- //debug("KmScene1002::sub44A3C0()");
_parentScene->sendMessage(0x1024, 1, this);
}
void KmScene1002::sub44A3E0() {
- //ok
- //debug("KmScene1002::sub44A3E0()");
if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) {
_status2 = 2;
_flagE4 = false;
@@ -2645,8 +2587,6 @@ void KmScene1002::sub44A3E0() {
}
void KmScene1002::sub44A460() {
- //ok
- //debug("KmScene1002::sub44A460()");
_flagE4 = false;
_flagE5 = true;
setFileHash2(0x5C01A870, 0x01084280, 0);
@@ -4000,7 +3940,145 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
}
void KmScene2242::sub444D20() {
- int16 frameIndex = (int16)getGlobalVar(0x18288913) + 1;
+ int16 frameIndex = (int16)getGlobalVar(0x18288913);
+ if (frameIndex < 0 || frameIndex > 13)
+ frameIndex = 0;
+ _status2 = 0;
+ _flagE1 = true;
+ _flagE5 = true;
+ setFileHash(0x1A249001, frameIndex, -1);
+ SetUpdateHandler(&Klayman::update);
+ SetMessageHandler(&Klayman::handleMessage41EB70);
+ SetSpriteCallback(&Klayman::spriteUpdate41F300);
+ SetAnimationCallback3(&Klayman::sub41FA40);
+ setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
+KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+ : Klayman(vm, parentScene, x, y, 1000, 1000) {
+ // Empty
+}
+
+void KmHallOfRecords::xUpdate() {
+ setGlobalVar(0x18288913, _frameIndex);
+}
+
+uint32 KmHallOfRecords::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 0x4804:
+ if (param.asInteger() != 0) {
+ _x4 = param.asInteger();
+ setCallback2(AnimationCallback(&KmHallOfRecords::sub43B130));
+ } else {
+ setCallback2(AnimationCallback(&Klayman::sub41FC40));
+ }
+ break;
+ case 0x4817:
+ setDoDeltaX(param.asInteger());
+ sub41C7B0();
+ break;
+ case 0x481F:
+ if (param.asInteger() == 0) {
+ setCallback2(AnimationCallback(&Klayman::sub420870));
+ } else if (param.asInteger() == 1) {
+ setCallback2(AnimationCallback(&Klayman::sub4208B0));
+ } else if (param.asInteger() == 3) {
+ setCallback2(AnimationCallback(&Klayman::sub4208F0));
+ } else if (param.asInteger() == 4) {
+ setCallback2(AnimationCallback(&Klayman::sub420930));
+ } else {
+ setCallback2(AnimationCallback(&Klayman::sub420830));
+ }
+ break;
+ case 0x482D:
+ setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+ sub41C7B0();
+ break;
+ case 0x4837:
+ sub41CE70();
+ break;
+ }
+ return 0;
+}
+
+void KmHallOfRecords::sub43B130() {
+ int16 frameIndex = (int16)getGlobalVar(0x18288913);
+ if (frameIndex < 0 || frameIndex > 13)
+ frameIndex = 0;
+ _status2 = 0;
+ _flagE1 = true;
+ _flagE5 = true;
+ setFileHash(0x1A249001, frameIndex, -1);
+ SetUpdateHandler(&Klayman::update);
+ SetMessageHandler(&Klayman::handleMessage41EB70);
+ SetSpriteCallback(&Klayman::spriteUpdate41F300);
+ SetAnimationCallback3(&Klayman::sub41FA40);
+ setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
+KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+ : Klayman(vm, parentScene, x, y, 1000, 1000) {
+ // Empty
+}
+
+void KmScene2247::xUpdate() {
+ setGlobalVar(0x18288913, _frameIndex);
+}
+
+uint32 KmScene2247::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 0x4804:
+ if (param.asInteger() != 0) {
+ _x4 = param.asInteger();
+ setCallback2(AnimationCallback(&KmScene2247::sub453520));
+ } else {
+ setCallback2(AnimationCallback(&Klayman::sub41FC40));
+ }
+ break;
+ case 0x4817:
+ setDoDeltaX(param.asInteger());
+ sub41C7B0();
+ break;
+ case 0x481F:
+ if (param.asInteger() == 0) {
+ setCallback2(AnimationCallback(&Klayman::sub420870));
+ } else if (param.asInteger() == 1) {
+ setCallback2(AnimationCallback(&Klayman::sub4208B0));
+ } else if (param.asInteger() == 3) {
+ setCallback2(AnimationCallback(&Klayman::sub4208F0));
+ } else if (param.asInteger() == 4) {
+ setCallback2(AnimationCallback(&Klayman::sub420930));
+ } else {
+ setCallback2(AnimationCallback(&Klayman::sub420830));
+ }
+ break;
+ case 0x482D:
+ setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+ sub41C7B0();
+ break;
+ case 0x4837:
+ sub41CE70();
+ break;
+ }
+ return 0;
+}
+
+void KmScene2247::sub453520() {
+ int16 frameIndex = (int16)getGlobalVar(0x18288913);
if (frameIndex < 0 || frameIndex > 13)
frameIndex = 0;
_status2 = 0;
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a5abc0f520..12862e39ae 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -432,6 +432,24 @@ protected:
void sub444D20();
};
+class KmHallOfRecords : public Klayman {
+public:
+ KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+ void xUpdate();
+ uint32 xHandleMessage(int messageNum, const MessageParam &param);
+ void sub43B130();
+};
+
+class KmScene2247 : public Klayman {
+public:
+ KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+ void xUpdate();
+ uint32 xHandleMessage(int messageNum, const MessageParam &param);
+ void sub453520();
+};
+
} // End of namespace Neverhood
#endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 515e4bd0ad..fe6f36cc45 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -254,99 +254,195 @@ void Module2200::createScene2209(int which) {
}
void Module2200::createScene2210(int which) {
+ _vm->gameState().sceneNum = 9;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180);
+ SetUpdateHandler(&Module2200::updateScene2210);
}
void Module2200::createScene2211(int which) {
+ _vm->gameState().sceneNum = 10;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198);
+ SetUpdateHandler(&Module2200::updateScene2211);
}
void Module2200::createScene2212(int which) {
+ _vm->gameState().sceneNum = 11;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0);
+ SetUpdateHandler(&Module2200::updateScene2212);
}
void Module2200::createScene2213(int which) {
+ _vm->gameState().sceneNum = 12;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8);
+ SetUpdateHandler(&Module2200::updateScene2213);
}
-
+
void Module2200::createScene2214(int which) {
+ _vm->gameState().sceneNum = 13;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0);
+ SetUpdateHandler(&Module2200::updateScene2214);
}
void Module2200::createScene2215(int which) {
+ _vm->gameState().sceneNum = 14;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8);
+ SetUpdateHandler(&Module2200::updateScene2215);
}
void Module2200::createScene2216(int which) {
+ _vm->gameState().sceneNum = 15;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210);
+ SetUpdateHandler(&Module2200::updateScene2216);
}
void Module2200::createScene2217(int which) {
+ _vm->gameState().sceneNum = 16;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228);
+ SetUpdateHandler(&Module2200::updateScene2217);
}
void Module2200::createScene2218(int which) {
+ _vm->gameState().sceneNum = 17;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240);
+ SetUpdateHandler(&Module2200::updateScene2218);
}
void Module2200::createScene2219(int which) {
+ _vm->gameState().sceneNum = 18;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258);
+ SetUpdateHandler(&Module2200::updateScene2219);
}
void Module2200::createScene2220(int which) {
+ _vm->gameState().sceneNum = 19;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270);
+ SetUpdateHandler(&Module2200::updateScene2220);
}
void Module2200::createScene2221(int which) {
+ _vm->gameState().sceneNum = 20;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288);
+ SetUpdateHandler(&Module2200::updateScene2221);
}
void Module2200::createScene2222(int which) {
+ _vm->gameState().sceneNum = 21;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0);
+ SetUpdateHandler(&Module2200::updateScene2222);
}
void Module2200::createScene2223(int which) {
+ _vm->gameState().sceneNum = 22;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8);
+ SetUpdateHandler(&Module2200::updateScene2223);
}
void Module2200::createScene2224(int which) {
+ _vm->gameState().sceneNum = 23;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0);
+ SetUpdateHandler(&Module2200::updateScene2224);
}
void Module2200::createScene2225(int which) {
+ _vm->gameState().sceneNum = 24;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8);
+ SetUpdateHandler(&Module2200::updateScene2225);
}
void Module2200::createScene2226(int which) {
+ _vm->gameState().sceneNum = 25;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300);
+ SetUpdateHandler(&Module2200::updateScene2226);
}
void Module2200::createScene2227(int which) {
+ _vm->gameState().sceneNum = 26;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318);
+ SetUpdateHandler(&Module2200::updateScene2227);
}
void Module2200::createScene2228(int which) {
+ _vm->gameState().sceneNum = 27;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330);
+ SetUpdateHandler(&Module2200::updateScene2228);
}
void Module2200::createScene2229(int which) {
+ _vm->gameState().sceneNum = 28;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348);
+ SetUpdateHandler(&Module2200::updateScene2229);
}
void Module2200::createScene2230(int which) {
+ _vm->gameState().sceneNum = 29;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360);
+ SetUpdateHandler(&Module2200::updateScene2230);
}
void Module2200::createScene2231(int which) {
+ _vm->gameState().sceneNum = 30;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378);
+ SetUpdateHandler(&Module2200::updateScene2231);
}
void Module2200::createScene2232(int which) {
+ _vm->gameState().sceneNum = 31;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390);
+ SetUpdateHandler(&Module2200::updateScene2232);
}
void Module2200::createScene2233(int which) {
+ _vm->gameState().sceneNum = 32;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8);
+ SetUpdateHandler(&Module2200::updateScene2233);
}
void Module2200::createScene2234(int which) {
+ _vm->gameState().sceneNum = 33;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0);
+ SetUpdateHandler(&Module2200::updateScene2234);
}
void Module2200::createScene2235(int which) {
+ _vm->gameState().sceneNum = 34;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8);
+ SetUpdateHandler(&Module2200::updateScene2235);
}
void Module2200::createScene2236(int which) {
+ _vm->gameState().sceneNum = 35;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0);
+ SetUpdateHandler(&Module2200::updateScene2236);
}
void Module2200::createScene2237(int which) {
+ _vm->gameState().sceneNum = 36;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408);
+ SetUpdateHandler(&Module2200::updateScene2237);
}
void Module2200::createScene2238(int which) {
+ _vm->gameState().sceneNum = 37;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420);
+ SetUpdateHandler(&Module2200::updateScene2238);
}
void Module2200::createScene2239(int which) {
+ _vm->gameState().sceneNum = 38;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438);
+ SetUpdateHandler(&Module2200::updateScene2239);
}
void Module2200::createScene2240(int which) {
+ _vm->gameState().sceneNum = 39;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450);
+ SetUpdateHandler(&Module2200::updateScene2240);
}
void Module2200::createScene2241(int which) {
+ _vm->gameState().sceneNum = 40;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468);
+ SetUpdateHandler(&Module2200::updateScene2241);
}
void Module2200::createScene2242(int which) {
@@ -356,18 +452,33 @@ void Module2200::createScene2242(int which) {
}
void Module2200::createScene2243(int which) {
+ _vm->gameState().sceneNum = 42;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480);
+ SetUpdateHandler(&Module2200::updateScene2243);
}
void Module2200::createScene2244(int which) {
+ _vm->gameState().sceneNum = 43;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498);
+ SetUpdateHandler(&Module2200::updateScene2244);
}
void Module2200::createScene2245(int which) {
+ _vm->gameState().sceneNum = 44;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0);
+ SetUpdateHandler(&Module2200::updateScene2245);
}
void Module2200::createScene2246(int which) {
+ _vm->gameState().sceneNum = 45;
+ _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8);
+ SetUpdateHandler(&Module2200::updateScene2246);
}
void Module2200::createScene2247(int which) {
+ _vm->gameState().sceneNum = 46;
+ _childObject = new Scene2247(_vm, this, which);
+ SetUpdateHandler(&Module2200::updateScene2247);
}
void Module2200::createScene2248(int which) {
@@ -420,14 +531,12 @@ void Module2200::updateScene2203() {
_childObject = NULL;
if (_field20 == 1) {
createScene2205(0);
- _childObject->handleUpdate();
} else if (_field20 == 2) {
createScene2204(0);
- _childObject->handleUpdate();
} else {
createScene2201(1);
- _childObject->handleUpdate();
}
+ _childObject->handleUpdate();
}
}
@@ -449,14 +558,12 @@ void Module2200::updateScene2205() {
_childObject = NULL;
if (_field20 == 1) {
createScene2206(0);
- _childObject->handleUpdate();
} else if (_field20 == 2) {
createScene2205(2);
- _childObject->handleUpdate();
} else {
createScene2203(1);
- _childObject->handleUpdate();
}
+ _childObject->handleUpdate();
}
}
@@ -468,17 +575,14 @@ void Module2200::updateScene2206() {
_childObject = NULL;
if (_field20 == 1) {
createScene2247(0);
- _childObject->handleUpdate();
} else if (_field20 == 2) {
createScene2207(0);
- _childObject->handleUpdate();
} else if (_field20 == 3) {
createScene2209(0);
- _childObject->handleUpdate();
} else {
createScene2205(1);
- _childObject->handleUpdate();
}
+ _childObject->handleUpdate();
}
}
@@ -499,8 +603,123 @@ void Module2200::updateScene2208() {
_done = false;
delete _childObject;
_childObject = NULL;
- // TODO
- createScene2206(2);
+ // This is madness!
+ switch (_vm->gameState().which) {
+ case 4:
+ createScene2205(2);
+ break;
+ case 9:
+ createScene2210(2);
+ break;
+ case 10:
+ createScene2211(2);
+ break;
+ case 11:
+ createScene2212(2);
+ break;
+ case 12:
+ createScene2213(2);
+ break;
+ case 13:
+ createScene2214(2);
+ break;
+ case 14:
+ createScene2215(2);
+ break;
+ case 15:
+ createScene2216(2);
+ break;
+ case 16:
+ createScene2217(2);
+ break;
+ case 17:
+ createScene2218(2);
+ break;
+ case 18:
+ createScene2219(2);
+ break;
+ case 19:
+ createScene2220(2);
+ break;
+ case 20:
+ createScene2221(2);
+ break;
+ case 21:
+ createScene2222(2);
+ break;
+ case 22:
+ createScene2223(2);
+ break;
+ case 23:
+ createScene2224(2);
+ break;
+ case 24:
+ createScene2225(2);
+ break;
+ case 25:
+ createScene2226(2);
+ break;
+ case 26:
+ createScene2227(2);
+ break;
+ case 27:
+ createScene2228(2);
+ break;
+ case 28:
+ createScene2229(2);
+ break;
+ case 29:
+ createScene2230(2);
+ break;
+ case 30:
+ createScene2231(2);
+ break;
+ case 31:
+ createScene2232(2);
+ break;
+ case 32:
+ createScene2233(2);
+ break;
+ case 33:
+ createScene2234(2);
+ break;
+ case 34:
+ createScene2235(2);
+ break;
+ case 35:
+ createScene2236(2);
+ break;
+ case 36:
+ createScene2237(2);
+ break;
+ case 37:
+ createScene2238(2);
+ break;
+ case 38:
+ createScene2239(2);
+ break;
+ case 39:
+ createScene2240(2);
+ break;
+ case 40:
+ createScene2241(2);
+ break;
+ case 41:
+ createScene2242(2);
+ break;
+ case 42:
+ createScene2243(2);
+ break;
+ case 43:
+ createScene2244(2);
+ break;
+ case 44:
+ createScene2245(2);
+ break;
+ case 46:
+ createScene2247(2);
+ break;
+ }
_childObject->handleUpdate();
}
}
@@ -517,99 +736,547 @@ void Module2200::updateScene2209() {
}
void Module2200::updateScene2210() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2211(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2247(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2211() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2212(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2210(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2212() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2213(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2211(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2213() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2214(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2212(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2214() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2215(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2213(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2215() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2216(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2214(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2216() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2217(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2215(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2217() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2218(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2216(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2218() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2219(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2217(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2219() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2220(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2218(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2220() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2221(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2219(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2221() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2222(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2220(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2222() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2223(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2221(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2223() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2224(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2222(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2224() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2225(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2223(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2225() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2226(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2224(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2226() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2227(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2225(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2227() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2228(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2226(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2228() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2229(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2227(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2229() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2230(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2228(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2230() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2231(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2229(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2231() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2232(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2230(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2232() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2233(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2231(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2233() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2234(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2232(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2234() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2235(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2233(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2235() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2243(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2234(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2236() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2237(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2246(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2237() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2238(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2236(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2238() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2239(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2237(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2239() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2240(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2238(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2240() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2241(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2239(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2241() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2242(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2240(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2242() {
@@ -632,18 +1299,88 @@ void Module2200::updateScene2242() {
}
void Module2200::updateScene2243() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2244(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2235(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2244() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2245(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2243(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2245() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2246(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2244(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2246() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2236(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2245(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2247() {
+ _childObject->handleUpdate();
+ if (_done) {
+ _done = false;
+ delete _childObject;
+ _childObject = NULL;
+ if (_field20 == 1) {
+ createScene2210(0);
+ } else if (_field20 == 2) {
+ createScene2208(0);
+ } else {
+ createScene2206(1);
+ }
+ _childObject->handleUpdate();
+ }
}
void Module2200::updateScene2248() {
@@ -1245,7 +1982,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
case 0x2002:
_isTileMoving = false;
_doneMovingTileSprite = (Sprite*)sender;
- if (param.asInteger() >= 0 && param.asInteger() <= 2) {
+ if (param.asInteger() <= 2) {
_surfacePriority = 100;
} else if (param.asInteger() >= 3 && param.asInteger() <= 5) {
_surfacePriority = 300;
@@ -1318,7 +2055,7 @@ static const uint32 kAsScene2203DoorFileHashes[] = {
0x1A488110
};
-AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index)
+AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index)
: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene),
_index(index) {
@@ -2101,7 +2838,7 @@ void AsScene2207Elevator::moveToY(int16 y) {
}
if (_destPointIndex != _pointIndex) {
- if (_destPointIndex == 0 || _destPointIndex == _pointArray->size() - 1) {
+ if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) {
_destPointIndexDelta = 0;
} else if (_destPointIndex < _pointIndex) {
_destPointIndexDelta = -2;
@@ -2116,12 +2853,73 @@ void AsScene2207Elevator::moveToY(int16 y) {
}
-Class500::Class500(NeverhoodEngine *vm, Scene *parentScene)
+AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX)
+ : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+
+ SetUpdateHandler(&AnimatedSprite::update);
+ SetMessageHandler(&AsScene2207Lever::handleMessage);
+ createSurface(1010, 71, 73);
+ setDoDeltaX(doDeltaX);
+ setFileHash(0x80880090, 0, -1);
+ _newHashListIndex = 0;
+ _x = x;
+ _y = y;
+}
+
+uint32 AsScene2207Lever::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 0x3002:
+ removeCallbacks();
+ setFileHash1();
+ break;
+ case 0x4807:
+ stLeverUp();
+ break;
+ case 0x480F:
+ stLeverDown();
+ break;
+ case 0x482A:
+ _parentScene->sendMessage(0x1022, 990, this);
+ break;
+ case 0x482B:
+ _parentScene->sendMessage(0x1022, 1010, this);
+ break;
+ }
+ return messageResult;
+}
+
+void AsScene2207Lever::stLeverDown() {
+ setFileHash(0x80880090, 1, -1);
+ setCallback1(AnimationCallback(&AsScene2207Lever::stLeverDownEvent));
+ _soundResource.play(0x40581882);
+}
+
+void AsScene2207Lever::stLeverDownEvent() {
+ _parentScene->sendMessage(0x480F, 0, this);
+}
+
+void AsScene2207Lever::stLeverUp() {
+ setFileHash(0x80880090, 6, -1);
+ setCallback1(AnimationCallback(&AsScene2207Lever::stLeverUpEvent));
+ _playBackwards = true;
+ _soundResource.play(0x40581882);
+}
+
+void AsScene2207Lever::stLeverUpEvent() {
+ _parentScene->sendMessage(0x4807, 0, this);
+}
+
+AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
: AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm),
- _soundResource3(vm), _soundResource4(vm), _flag1(true) {
+ _soundResource3(vm), _soundResource4(vm), _idle(true) {
SetUpdateHandler(&AnimatedSprite::update);
- SetMessageHandler(&Class500::handleMessage);
+ SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage);
createSurface1(0xCCFD6090, 100);
_x = 309;
_y = 320;
@@ -2132,15 +2930,15 @@ Class500::Class500(NeverhoodEngine *vm, Scene *parentScene)
_soundResource4.load(0xD4226080);
}
-Class500::~Class500() {
+AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
// TODO Sound1ChList_sub_407AF0(0x80D00820);
}
-uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x100D:
- if (!_flag1) {
+ if (!_idle) {
if (param.asInteger() == 0x3423093) {
// TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true);
// TODO Sound1ChList_playLooping(0x12121943);
@@ -2162,10 +2960,10 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity
}
break;
case 0x2006:
- sub441D50();
+ stStartAnimation();
break;
case 0x2007:
- sub441D90();
+ stStopAnimation();
break;
case 0x3002:
removeCallbacks();
@@ -2174,36 +2972,36 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity
return messageResult;
}
-void Class500::sub441D50() {
- if (!_flag1) {
+void AsScene2207WallRobotAnimation::stStartAnimation() {
+ if (!_idle) {
SetAnimationCallback3(NULL);
} else {
setFileHash(0xCCFD6090, 0, -1);
- _flag1 = false;
+ _idle = false;
_surface->setVisible(true);
}
}
-void Class500::sub441D90() {
- SetAnimationCallback3(&Class500::sub441DA0);
+void AsScene2207WallRobotAnimation::stStopAnimation() {
+ SetAnimationCallback3(&AsScene2207WallRobotAnimation::cbStopAnimation);
}
-void Class500::sub441DA0() {
+void AsScene2207WallRobotAnimation::cbStopAnimation() {
setFileHash1();
_soundResource1.stop();
_soundResource2.stop();
_soundResource3.stop();
_soundResource4.stop();
// TODO Sound1ChList_deleteSoundByHash(0x12121943);
- _flag1 = true;
+ _idle = true;
_surface->setVisible(false);
}
-Class501::Class501(NeverhoodEngine *vm)
- : AnimatedSprite(vm, 1200), _flag1(true) {
+AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm)
+ : AnimatedSprite(vm, 1200), _idle(true) {
SetUpdateHandler(&AnimatedSprite::update);
- SetMessageHandler(&Class501::handleMessage);
+ SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage);
createSurface1(0x8CAA0099, 100);
_x = 309;
_y = 320;
@@ -2211,14 +3009,14 @@ Class501::Class501(NeverhoodEngine *vm)
_newHashListIndex = 0;
}
-uint32 Class501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x2006:
- sub441FA0();
+ stStartAnimation();
break;
case 0x2007:
- sub441FE0();
+ stStopAnimation();
break;
case 0x3002:
removeCallbacks();
@@ -2227,27 +3025,27 @@ uint32 Class501::handleMessage(int messageNum, const MessageParam &param, Entity
return messageResult;
}
-void Class501::sub441FA0() {
- if (!_flag1) {
+void AsScene2207WallCannonAnimation::stStartAnimation() {
+ if (!_idle) {
SetAnimationCallback3(NULL);
} else {
_surface->setVisible(true);
setFileHash(0x8CAA0099, 0, -1);
- _flag1 = false;
+ _idle = false;
}
}
-void Class501::sub441FE0() {
- SetAnimationCallback3(&Class501::sub441FF0);
+void AsScene2207WallCannonAnimation::stStopAnimation() {
+ SetAnimationCallback3(&AsScene2207WallCannonAnimation::cbStopAnimation);
}
-void Class501::sub441FF0() {
+void AsScene2207WallCannonAnimation::cbStopAnimation() {
setFileHash1();
_surface->setVisible(false);
- _flag1 = true;
+ _idle = true;
}
-Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index)
+SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index)
: StaticSprite(vm, fileHash, 100) {
_x = 330;
@@ -2257,13 +3055,13 @@ Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index)
Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
- _flag1(true), _elevatorSurfacePriority(0) {
-
- _vm->gameModule()->initScene3009Vars();
+ _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
//DEBUG
setGlobalVar(0x4D080E54, 1);
+ _vm->gameModule()->initScene3009Vars();
+
if (!getSubVar(0x40050052, 0x88460852))
setSubVar(0x40050052, 0x88460852, 1);
@@ -2293,21 +3091,21 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
_asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011));
_vm->_collisionMan->addSprite(_asTape);
-// _class487 = addSprite(new Class487(_vm, this, 527, 333, 0));
-// _vm->_collisionMan->addSprite(_class487);
+ _asLever = addSprite(new AsScene2207Lever(_vm, this, 527, 333, 0));
+ _vm->_collisionMan->addSprite(_asLever);
- _class500 = addSprite(new Class500(_vm, this));
- _class501 = addSprite(new Class501(_vm));
+ _asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this));
+ _asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm));
- _class500->getSurface()->setVisible(false);
- _class501->getSurface()->setVisible(false);
+ _asWallRobotAnimation->getSurface()->setVisible(false);
+ _asWallCannonAnimation->getSurface()->setVisible(false);
_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
-// _class487->getSurface()->getClipRect().x1 = 0;
-// _class487->getSurface()->getClipRect().y1 = 0;
-// _class487->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
-// _class487->getSurface()->getClipRect().y2 = 480;
+ _asLever->getSurface()->getClipRect().x1 = 0;
+ _asLever->getSurface()->getClipRect().y1 = 0;
+ _asLever->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
+ _asLever->getSurface()->getClipRect().y2 = 480;
_klayman->getSurface()->getClipRect().x1 = 0;
_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
@@ -2330,14 +3128,14 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200));
- addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
- addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
- addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
+ addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
+ addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
+ addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
_asTape = NULL;
- _class487 = NULL;
- _class500 = NULL;
- _class501 = NULL;
+ _asLever = NULL;
+ _asWallRobotAnimation = NULL;
+ _asWallCannonAnimation = NULL;
_ssButton = NULL;
_klayman->getSurface()->getClipRect().x1 = 0;
@@ -2371,7 +3169,7 @@ void Scene2207::update() {
_elevatorSurfacePriority = 0;
}
if (_klayman->getY() == 423) {
- _flag1 = _klayman->getX() > 459 && _klayman->getX() < 525;
+ _klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525;
}
}
@@ -2380,7 +3178,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
switch (messageNum) {
case 0x100D:
if (param.asInteger() == 0x0014F275) {
- if (_flag1) {
+ if (_klaymanAtElevator) {
_asElevator->sendMessage(0x2000, _mouseClickPos.y, this);
_klayman->sendEntityMessage(0x1014, _asElevator, this);
_klayman->sendMessage(0x2001, 0, this);
@@ -2388,7 +3186,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
messageList402220();
}
} else if (param.asInteger() == 0x34569073) {
- if (_flag1) {
+ if (_klaymanAtElevator) {
_messageListFlag1 = true;
_asElevator->sendMessage(0x2000, 0, this);
_klayman->sendEntityMessage(0x1014, _asElevator, this);
@@ -2397,7 +3195,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
messageList402220();
}
} else if (param.asInteger() == 0x4054C877) {
- if (_flag1) {
+ if (_klaymanAtElevator) {
_asElevator->sendMessage(0x2000, 480, this);
_klayman->sendEntityMessage(0x1014, _asElevator, this);
_klayman->sendMessage(0x2001, 0, this);
@@ -2425,8 +3223,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
_messageListFlag1 = false;
break;
case 0x4807:
- _class500->sendMessage(0x2007, 0, this);
- _class501->sendMessage(0x2007, 0, this);
+ _asWallRobotAnimation->sendMessage(0x2007, 0, this);
+ _asWallCannonAnimation->sendMessage(0x2007, 0, this);
break;
case 0x480B:
if (sender == _ssButton) {
@@ -2440,10 +3238,10 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
}
break;
case 0x480F:
- _class500->sendMessage(0x2006, 0, this);
- _class501->sendMessage(0x2006, 0, this);
- _class500->getSurface()->setVisible(true);
- _class501->getSurface()->setVisible(true);
+ _asWallRobotAnimation->sendMessage(0x2006, 0, this);
+ _asWallCannonAnimation->sendMessage(0x2006, 0, this);
+ _asWallRobotAnimation->getSurface()->setVisible(true);
+ _asWallCannonAnimation->getSurface()->setVisible(true);
break;
case 0x4826:
if (sender == _asTape) {
@@ -2451,7 +3249,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
_klayman->sendEntityMessage(0x1014, _asTape, this);
setMessageList(0x004B3958);
}
- } else if (_flag1) {
+ } else if (_klaymanAtElevator) {
SetMessageHandler(&Scene2207::handleMessage2);
_asElevator->sendMessage(0x2000, 347, this);
_klayman->sendEntityMessage(0x1014, _asElevator, this);
@@ -2471,7 +3269,7 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Enti
case 0x2004:
SetMessageHandler(&Scene2207::handleMessage);
_klayman->sendMessage(0x2005, 0, this);
-// _klayman->sendEntityMessage(0x1014, _class487, this);
+ _klayman->sendEntityMessage(0x1014, _asLever, this);
setMessageList(0x004B3920);
setRectList(0x004B3948);
break;
@@ -2653,7 +3451,7 @@ void Scene2208::drawRow(int16 rowIndex) {
sourceRect.width = 640;
sourceRect.height = 48;
_background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true);
- } else if (rowIndex >= _maxRowIndex - 5) {
+ } else if (rowIndex > _maxRowIndex - 5) {
sourceRect.x = 0;
sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48;
sourceRect.width = 640;
@@ -2666,7 +3464,7 @@ void Scene2208::drawRow(int16 rowIndex) {
sourceRect.width = 640;
sourceRect.height = 48;
_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true);
- if (rowIndex < _strings.size()) {
+ if (rowIndex < (int)_strings.size()) {
const char *text = _strings[rowIndex];
// TODO/CHECKME: Use temporary string up to '{' character (see above)
_fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text);
@@ -2764,7 +3562,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
switch (messageNum) {
case 0x100D:
if (param.asInteger() == 0x800C6694) {
- sub4448D0();
+ readClickedColumn();
}
break;
case 0x4826:
@@ -2777,7 +3575,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
return messageResult;
}
-void Scene2242::sub4448D0() {
+void Scene2242::readClickedColumn() {
int index;
if (_mouseClickPos.x < 108) {
setGlobalVar(0xC8C28808, 0x04290188);
@@ -2790,7 +3588,7 @@ void Scene2242::sub4448D0() {
setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2"));
index = 1;
}
- setGlobalVar(0x49C40058, (_mouseClickPos.x - 100) / 7);
+ setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) {
setMessageList2(kScene2242MessageListIds1[index]);
} else {
@@ -2798,4 +3596,213 @@ void Scene2242::sub4448D0() {
}
}
+static const int16 kHallOfRecordsKlaymanXPos[] = {
+ 68,
+ 157,
+ 246,
+ 335,
+ 424,
+ 513,
+ 602
+};
+
+static const uint32 kHallOfRecordsSceneMessageListIds2[] = {
+ 0x004B2978,
+ 0x004B2998,
+ 0x004B29B8,
+ 0x004B29D8,
+ 0x004B29F8,
+ 0x004B2A18,
+ 0x004B2A38
+};
+
+static const uint32 kHallOfRecordsSceneMessageListIds1[] = {
+ 0x004B2A58,
+ 0x004B2A80,
+ 0x004B2AA8,
+ 0x004B2AD0,
+ 0x004B2AF8,
+ 0x004B2B20,
+ 0x004B2B48
+};
+
+HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id)
+ : Scene(vm, parentModule, true) {
+
+ _sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id);
+
+ _surfaceFlag = true;
+ SetMessageHandler(&HallOfRecordsScene::handleMessage);
+ SetUpdateHandler(&Scene::update);
+
+ if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) {
+ setRectList(0x004B2BF8);
+ _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename2, 0, 0));
+ _palette = new Palette(_vm, _sceneInfo140->bgFilename2);
+ _palette->usePalette();
+ _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+ } else {
+ setRectList(0x004B2BB8);
+ _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename1, 0, 0));
+ _palette = new Palette(_vm, _sceneInfo140->bgFilename1);
+ _palette->usePalette();
+ _mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL));
+ }
+
+ if (which < 0) {
+ _klayman = new KmHallOfRecords(_vm, this, 200, 430);
+ setMessageList(0x004B2900);
+ } else if (which == 1) {
+ _klayman = new KmHallOfRecords(_vm, this, 640, 430);
+ setMessageList(0x004B2910);
+ } else if (which == 2) {
+ _klayman = new KmHallOfRecords(_vm, this, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
+ setMessageList(0x004B2B70);
+ if (getGlobalVar(0xC0418A02))
+ _klayman->setDoDeltaX(1);
+ } else {
+ _klayman = new KmHallOfRecords(_vm, this, 0, 430);
+ setMessageList(0x004B2908);
+ }
+ addSprite(_klayman);
+
+ _klayman->setSoundFlag(true);
+ _klayman->setKlaymanTable2();
+
+}
+
+HallOfRecordsScene::~HallOfRecordsScene() {
+ setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x100D:
+ if (param.asInteger() == 0x800C6694) {
+ readClickedColumn();
+ }
+ break;
+ }
+ return messageResult;
+}
+
+void HallOfRecordsScene::readClickedColumn() {
+ int16 index = (_mouseClickPos.x - 23) / 89;
+ if (index >= _sceneInfo140->count) {
+ setMessageList2(0x004B2920);
+ } else {
+ setGlobalVar(0x48A68852, _sceneInfo140->xPosIndex + index);
+ setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+ setGlobalVar(0xC8C28808, _sceneInfo140->txFilename);
+ if (index == 0 && _sceneInfo140->bgFilename3) {
+ setGlobalVar(0x4CE79018, _sceneInfo140->bgFilename3);
+ } else {
+ setGlobalVar(0x4CE79018, 0);
+ }
+ if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) {
+ setMessageList2(kHallOfRecordsSceneMessageListIds1[index]);
+ } else {
+ setMessageList2(kHallOfRecordsSceneMessageListIds2[index]);
+ }
+ }
+}
+
+static const int16 kScene2247XPositions[] = {
+ 513,
+ 602
+};
+
+static const uint32 kScene2247MessageListIds2[] = {
+ 0x004B54A0,
+ 0x004B54C0
+};
+
+static const uint32 kScene2247MessageListIds1[] = {
+ 0x004B54E0,
+ 0x004B5508
+};
+
+Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
+ : Scene(vm, parentModule, true) {
+
+ //DEBUG
+ setGlobalVar(0x4D080E54, 1);
+
+ _surfaceFlag = true;
+ SetMessageHandler(&Scene2247::handleMessage);
+ SetUpdateHandler(&Scene::update);
+
+ if (getGlobalVar(0x4D080E54)) {
+ setRectList(0x004B5588);
+ _background = addBackground(new DirtyBackground(_vm, 0x40339414, 0, 0));
+ _palette = new Palette(_vm, 0x40339414);
+ _palette->usePalette();
+ _mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL));
+ } else {
+ setRectList(0x004B55C8);
+ _background = addBackground(new DirtyBackground(_vm, 0x071963E5, 0, 0));
+ _palette = new Palette(_vm, 0x071963E5);
+ _palette->usePalette();
+ _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+ }
+
+ if (which < 0) {
+ _klayman = new KmScene2247(_vm, this, 200, 430);
+ setMessageList(0x004B5428);
+ } else if (which == 1) {
+ _klayman = new KmScene2247(_vm, this, 640, 430);
+ setMessageList(0x004B5438);
+ } else if (which == 2) {
+ _klayman = new KmScene2247(_vm, this, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
+ if (getGlobalVar(0xC0418A02))
+ _klayman->setDoDeltaX(1);
+ setMessageList(0x004B5530);
+ } else {
+ _klayman = new KmScene2247(_vm, this, 0, 430);
+ setMessageList(0x004B5430);
+ }
+ addSprite(_klayman);
+
+ _klayman->setSoundFlag(true);
+
+}
+
+Scene2247::~Scene2247() {
+ setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ // TODO: Debug stuff
+ case 0x100D:
+ if (param.asInteger() == 0x800C6694) {
+ readClickedColumn();
+ }
+ break;
+ }
+ return messageResult;
+}
+
+void Scene2247::readClickedColumn() {
+ int index;
+ if (_mouseClickPos.x < 553) {
+ setGlobalVar(0xC8C28808, 0x0008E486);
+ setGlobalVar(0x4CE79018, calcHash("bgFatherHeader"));
+ index = 0;
+ } else {
+ setGlobalVar(0xC8C28808, 0x03086004);
+ setGlobalVar(0x4CE79018, calcHash("bgQuaterHeader"));
+ index = 1;
+ }
+ setGlobalVar(0x48A68852, 0);
+ setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+ if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) {
+ setMessageList2(kScene2247MessageListIds1[index]);
+ } else {
+ setMessageList2(kScene2247MessageListIds2[index]);
+ }
+}
+
} // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index d06f30bf46..4dfd827460 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -259,12 +259,12 @@ protected:
class AsScene2203Door : public AnimatedSprite {
public:
- AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index);
+ AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index);
protected:
Scene *_parentScene;
SoundResource _soundResource;
Sprite *_otherDoor;
- int _index;
+ uint _index;
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
void openDoor();
void closeDoor();
@@ -371,36 +371,49 @@ protected:
void moveToY(int16 y);
};
-class Class500 : public AnimatedSprite {
+class AsScene2207Lever : public AnimatedSprite {
public:
- Class500(NeverhoodEngine *vm, Scene *parentScene);
- ~Class500();
+ AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX);
+protected:
+ Scene *_parentScene;
+ SoundResource _soundResource;
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void stLeverDown();
+ void stLeverDownEvent();
+ void stLeverUp();
+ void stLeverUpEvent();
+};
+
+class AsScene2207WallRobotAnimation : public AnimatedSprite {
+public:
+ AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene);
+ ~AsScene2207WallRobotAnimation();
protected:
SoundResource _soundResource1;
SoundResource _soundResource2;
SoundResource _soundResource3;
SoundResource _soundResource4;
- bool _flag1;
+ bool _idle;
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
- void sub441D50();
- void sub441D90();
- void sub441DA0();
+ void stStartAnimation();
+ void stStopAnimation();
+ void cbStopAnimation();
};
-class Class501 : public AnimatedSprite {
+class AsScene2207WallCannonAnimation : public AnimatedSprite {
public:
- Class501(NeverhoodEngine *vm);
+ AsScene2207WallCannonAnimation(NeverhoodEngine *vm);
protected:
- bool _flag1;
+ bool _idle;
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
- void sub441FA0();
- void sub441FE0();
- void sub441FF0();
+ void stStartAnimation();
+ void stStopAnimation();
+ void cbStopAnimation();
};
-class Class597 : public StaticSprite {
+class SsScene2207Symbol : public StaticSprite {
public:
- Class597(NeverhoodEngine *vm, uint32 fileHash, int index);
+ SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index);
};
class Scene2207 : public Scene {
@@ -414,12 +427,12 @@ protected:
Sprite *_ssMaskPart2;
Sprite *_ssMaskPart3;
Sprite *_asTape;
- Sprite *_class487;
- Sprite *_class500;
- Sprite *_class501;
+ Sprite *_asLever;
+ Sprite *_asWallRobotAnimation;
+ Sprite *_asWallCannonAnimation;
Sprite *_ssButton;
int _elevatorSurfacePriority;
- bool _flag1;
+ bool _klaymanAtElevator;
void update();
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
uint32 handleMessage2(int messageNum, const MessageParam &param, Entity *sender);
@@ -457,7 +470,26 @@ protected:
bool _isKlaymanInLight;
void update();
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
- void sub4448D0();
+ void readClickedColumn();
+};
+
+class HallOfRecordsScene : public Scene {
+public:
+ HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id);
+ ~HallOfRecordsScene();
+protected:
+ SceneInfo140 *_sceneInfo140;
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void readClickedColumn();
+};
+
+class Scene2247 : public Scene {
+public:
+ Scene2247(NeverhoodEngine *vm, Module *parentModule, int which);
+ ~Scene2247();
+protected:
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void readClickedColumn();
};
} // End of namespace Neverhood
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 2a01bc2869..8192216432 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -234,7 +234,6 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
// TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y);
break;
case 1: // mouse clicked
- debug("mouse clicked");
_mouseClicked = true;
_mouseClickPos = param.asPoint();
break;
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 42af4975ea..d897d7a342 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -125,6 +125,21 @@ void StaticData::load(const char *filename) {
_navigationLists[id] = navigationList;
}
+ // Load SceneInfo140 items
+ uint32 sceneInfo140ItemsCount = fd.readUint32LE();
+ debug("sceneInfo140ItemsCount: %d", sceneInfo140ItemsCount);
+ for (uint32 i = 0; i < sceneInfo140ItemsCount; i++) {
+ SceneInfo140 *sceneInfo140 = new SceneInfo140();
+ uint32 id = fd.readUint32LE();
+ sceneInfo140->bgFilename1 = fd.readUint32LE();
+ sceneInfo140->bgFilename2 = fd.readUint32LE();
+ sceneInfo140->txFilename = fd.readUint32LE();
+ sceneInfo140->bgFilename3 = fd.readUint32LE();
+ sceneInfo140->xPosIndex = fd.readByte();
+ sceneInfo140->count = fd.readByte();
+ _sceneInfo140Items[id] = sceneInfo140;
+ }
+
}
HitRectList *StaticData::getHitRectList(uint32 id) {
@@ -151,4 +166,10 @@ NavigationList *StaticData::getNavigationList(uint32 id) {
return _navigationLists[id];
}
+SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) {
+ if (!_sceneInfo140Items[id])
+ error("StaticData::getSceneInfo140Item() SceneInfo140 with id %08X not found", id);
+ return _sceneInfo140Items[id];
+}
+
} // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index c19c060487..2a0cc9072c 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -68,6 +68,15 @@ struct NavigationItem {
typedef Common::Array<NavigationItem> NavigationList;
+struct SceneInfo140 {
+ uint32 bgFilename1;
+ uint32 bgFilename2;
+ uint32 txFilename;
+ uint32 bgFilename3;
+ byte xPosIndex;
+ byte count;
+};
+
class StaticData {
public:
StaticData();
@@ -77,11 +86,13 @@ public:
RectList *getRectList(uint32 id);
MessageList *getMessageList(uint32 id);
NavigationList *getNavigationList(uint32 id);
+ SceneInfo140 *getSceneInfo140Item(uint32 id);
protected:
Common::HashMap<uint32, HitRectList*> _hitRectLists;
Common::HashMap<uint32, RectList*> _rectLists;
Common::HashMap<uint32, MessageList*> _messageLists;
Common::HashMap<uint32, NavigationList*> _navigationLists;
+ Common::HashMap<uint32, SceneInfo140*> _sceneInfo140Items;
};
} // End of namespace Neverhood