From 9b151cefc352a8f42c005a7406d4b694aa4a221c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 12 Sep 2011 19:09:01 +0000 Subject: NEVERHOOD: Implement HallOfRecordsScene (and all HoR scenes) and Scene2247 - Load SceneInfo140 from neverhood.dat - Some renaming --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/gamevars.cpp | 2 +- engines/neverhood/klayman.cpp | 204 +++++-- engines/neverhood/klayman.h | 18 + engines/neverhood/module2200.cpp | 1169 +++++++++++++++++++++++++++++++++++--- engines/neverhood/module2200.h | 76 ++- engines/neverhood/scene.cpp | 1 - engines/neverhood/staticdata.cpp | 21 + engines/neverhood/staticdata.h | 11 + 9 files changed, 1335 insertions(+), 169 deletions(-) (limited to 'engines') 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m) { - //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 ¶m, 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 ¶m) { - //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 ¶m) { } 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 ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2299,7 +2273,6 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok switch (messageNum) { case 0x4811: _soundResource1.play(0x5252A0E4); @@ -2323,7 +2296,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2376,7 +2348,6 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2395,7 +2366,6 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: @@ -2420,7 +2390,6 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2433,10 +2402,8 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶ } 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 ¶m) { } 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 ¶m) { + 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 ¶m) { + 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 ¶m); + 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 ¶m); + 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 ¶m, 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 ¶m, 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 ¶m, Entity *sender) { +uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, 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 ¶m, 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 ¶m, 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 ¶m, Entity *sender) { +uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, 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 ¶m, Entity *sender); uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); @@ -457,7 +470,26 @@ protected: bool _isKlaymanInLight; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, 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 ¶m, Entity *sender); + void readClickedColumn(); +}; + +class Scene2247 : public Scene { +public: + Scene2247(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2247(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, 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 ¶m, 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 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 _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; Common::HashMap _navigationLists; + Common::HashMap _sceneInfo140Items; }; } // End of namespace Neverhood -- cgit v1.2.3