diff options
Diffstat (limited to 'engines/neverhood/modules/module2200.cpp')
-rw-r--r-- | engines/neverhood/modules/module2200.cpp | 958 |
1 files changed, 66 insertions, 892 deletions
diff --git a/engines/neverhood/modules/module2200.cpp b/engines/neverhood/modules/module2200.cpp index b8da0f64ff..eecddf904c 100644 --- a/engines/neverhood/modules/module2200.cpp +++ b/engines/neverhood/modules/module2200.cpp @@ -20,20 +20,21 @@ * */ -#include "neverhood/modules/module2200.h" -#include "neverhood/modules/module1000.h" -#include "neverhood/modules/module1200.h" -#include "neverhood/gamemodule.h" +#include "common/config-manager.h" + #include "neverhood/diskplayerscene.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1000_sprites.h" +#include "neverhood/modules/module1200_sprites.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/modules/module2200_sprites.h" namespace Neverhood { Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - - debug("Create Module2200(%d)", which); - _vm->_soundMan->addMusic(0x11391412, 0x601C908C); + _vm->_soundMan->addMusic(0x11391412, 0x601C908C); if (which < 0) createScene(_vm->gameState().sceneNum, -1); @@ -47,11 +48,24 @@ Module2200::~Module2200() { } void Module2200::createScene(int sceneNum, int which) { - debug("Module2200::createScene(%d, %d)", sceneNum, which); + if (sceneNum == 46 && ConfMan.getBool("skiphallofrecordsscenes")) { + // Skip the whole Hall of Records storyboard scenes, + // and teleport to the last scene + sceneNum = 41; + } + + if (sceneNum == 40 && ConfMan.getBool("skiphallofrecordsscenes")) { + // Skip the whole Hall of Records storyboard scenes, + // and teleport back to the first scene + sceneNum = 5; + } + + debug(1, "Module2200::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; + _vm->_soundMan->startMusic(0x601C908C, 0, 2); _childObject = new Scene2201(_vm, this, which); break; case 1: @@ -441,100 +455,11 @@ void Module2200::updateScene() { } #undef HallOfRecordsSceneLink - + void Module2200::createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId) { _childObject = new HallOfRecordsScene(_vm, this, which, hallOfRecordsInfoId); } -// Scene2201 - -AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - _x = 403; - _y = 259; - createSurface(100, 233, 96); - startAnimation(0x8600866, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); -} - -AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { - - _x = 408; - _y = 290; - createSurface(900, 63, 266); - SetUpdateHandler(&AsScene2201Door::update); - SetMessageHandler(&AsScene2201Door::handleMessage); - if (_isOpen) { - startAnimation(0xE2CB0412, -1, -1); - _countdown = 48; - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(0xE2CB0412, 0, -1); - _newStickFrameIndex = 0; - _ssDoorLight->setVisible(false); - } -} - -void AsScene2201Door::update() { - if (_countdown != 0 && _isOpen && (--_countdown == 0)) - stCloseDoor(); - AnimatedSprite::update(); -} - -uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x11001090) { - if (_isOpen) - _ssDoorLight->setVisible(true); - } else if (param.asInteger() == 0x11283090) { - if (!_isOpen) - _ssDoorLight->setVisible(false); - } - break; - case 0x2000: - if (_isOpen) - _countdown = 144; - messageResult = _isOpen ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - _countdown = 144; - if (!_isOpen) - stOpenDoor(); - break; - } - return messageResult; -} - -void AsScene2201Door::stOpenDoor() { - _isOpen = true; - startAnimation(0xE2CB0412, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - playSound(0, calcHash("fxDoorOpen33")); -} - -void AsScene2201Door::stCloseDoor() { - _isOpen = false; - startAnimation(0xE2CB0412, -1, -1); - _playBackwards = true; - _newStickFrameIndex = 0; - playSound(0, calcHash("fxDoorClose33")); -} - -SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex) - : StaticSprite(vm, 900) { - - createSurface(100, 16, 16); - loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0, - kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y); -} - Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _isSoundPlaying(false) { @@ -544,7 +469,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2201::handleMessage); SetUpdateHandler(&Scene2201::update); - + loadDataResource(0x04104242); loadHitRectList(); setBackground(0x40008208); @@ -552,9 +477,9 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertScreenMouse(0x0820C408); _asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011); - addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0); - + for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) if ((int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex) >= 0) insertSprite<SsScene2201PuzzleCube>(cubeIndex, (int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex)); @@ -563,10 +488,10 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[0].x2 = 640; _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; - + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) insertStaticSprite(0x00026027, 900); - + tempSprite = insertStaticSprite(0x030326A0, 1100); _clipRects[0].x1 = tempSprite->getDrawRect().x; insertStaticSprite(0x811DA061, 1100); @@ -603,7 +528,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B8120); _asDoor = insertSprite<AsScene2201Door>(_klaymen, _ssDoorLight, true); } - + insertSprite<AsScene2201CeilingFan>(); _vm->_soundMan->addSound(0x04106220, 0x81212040); @@ -662,214 +587,6 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -static const NPoint kSsScene2202PuzzleCubePoints[] = { - {196, 105}, {323, 102}, {445, 106}, - {192, 216}, {319, 220}, {446, 216}, - {188, 320}, {319, 319}, {443, 322} -}; - -static const uint32 kSsScene2202PuzzleCubeFileHashes1[] = { - 0xA500800C, 0x2182910C, 0x2323980C, - 0x23049084, 0x21008080, 0x2303900C, - 0x6120980C, 0x2504D808 -}; - -static const uint32 kSsScene2202PuzzleCubeFileHashes2[] = { - 0x0AAD8080, 0x0A290291, 0x0A2BA398, - 0x822B8490, 0x86298080, 0x0A2B8390, - 0x0A69A098, 0x0E2D84D8 -}; - -SsScene2202PuzzleCube::SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol) - : StaticSprite(vm, 900), _parentScene(parentScene), _cubeSymbol(cubeSymbol), _cubePosition(cubePosition), _isMoving(false) { - - int surfacePriority; - - SetUpdateHandler(&SsScene2202PuzzleCube::update); - SetMessageHandler(&SsScene2202PuzzleCube::handleMessage); - if (_cubePosition >= 0 && _cubePosition <= 2) - surfacePriority = 100; - else if (_cubePosition >= 3 && _cubePosition <= 5) - surfacePriority = 300; - else - surfacePriority = 500; - loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, - kSsScene2202PuzzleCubePoints[_cubePosition].x, kSsScene2202PuzzleCubePoints[_cubePosition].y); - loadSound(0, 0x40958621); - loadSound(1, 0x51108241); -} - -void SsScene2202PuzzleCube::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 SsScene2202PuzzleCube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) - sendMessage(_parentScene, 0x2000, _cubePosition); - messageResult = 1; - break; - case 0x2001: - _isMoving = true; - moveCube(param.asInteger()); - break; - } - return messageResult; -} - -void SsScene2202PuzzleCube::suMoveCubeX() { - - bool done = false; - - if (_counterDirection) { - if (_counter > 2) - _counter -= 2; - } else { - if (_counter < 20) - _counter += 2; - } - - for (int16 i = 0; i < _counter; i++) { - _x += _xIncr; - _errValue += _yDelta; - if (_errValue >= _xDelta) { - _errValue -= _xDelta; - _y += _yIncr; - } - if (_x == _newX && _y == _newY) { - done = true; - break; - } - if (_x == _xFlagPos) - _counterDirection = true; - } - - if (done) - stopMoving(); - - updateBounds(); - -} - -void SsScene2202PuzzleCube::suMoveCubeY() { - - bool done = false; - - if (_counterDirection) { - if (_counter > 2) - _counter -= 2; - } else { - if (_counter < 20) - _counter += 2; - } - - for (int16 i = 0; i < _counter; i++) { - _y += _yIncr; - _errValue += _xDelta; - if (_errValue >= _yDelta) { - _errValue -= _yDelta; - _x += _xIncr; - } - if (_x == _newX && _y == _newY) { - done = true; - break; - } - if (_x == _xFlagPos) - _counterDirection = true; - } - - if (done) - stopMoving(); - - updateBounds(); - -} - -void SsScene2202PuzzleCube::moveCube(int16 newCubePosition) { - - loadSprite(kSsScene2202PuzzleCubeFileHashes1[_cubeSymbol], kSLFCenteredDrawOffset); - - setSubVar(VA_CUBE_POSITIONS, _cubePosition, (uint32)-1); - setSubVar(VA_CUBE_POSITIONS, newCubePosition, (uint32)_cubeSymbol); - - _cubePosition = newCubePosition; - _errValue = 0; - _counterDirection = false; - _counter = 0; - _newX = kSsScene2202PuzzleCubePoints[newCubePosition].x; - _newY = kSsScene2202PuzzleCubePoints[newCubePosition].y; - - if (_x == _newX && _y == _newY) - return; - - if (_x <= _newX) { - if (_y <= _newY) { - _xDelta = _newX - _x; - _yDelta = _newY - _y; - _xIncr = 1; - _yIncr = 1; - } else { - _xDelta = _newX - _x; - _yDelta = _y - _newY; - _xIncr = 1; - _yIncr = -1; - } - } else { - if (_y <= _newY) { - _xDelta = _x - _newX; - _yDelta = _newY - _y; - _xIncr = -1; - _yIncr = 1; - } else { - _xDelta = _x - _newX; - _yDelta = _y - _newY; - _xIncr = -1; - _yIncr = -1; - } - } - - if (_xDelta > _yDelta) { - SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeX); - if (_xIncr > 0) { - if (_newX - _x >= 180) - _xFlagPos = _newX - 90; - else - _xFlagPos = _x + _newX / 2; - } else { - if (_x - _newX >= 180) - _xFlagPos = _x + 90; - else - _xFlagPos = _x / 2 + _newX; - } - playSound(0); - } else { - SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeY); - if (_yIncr > 0) { - if (_newY - _y >= 180) - _xFlagPos = _newY - 90; - else - _xFlagPos = _y + _newY / 2; - } else { - if (_y - _newY >= 180) - _xFlagPos = _y + 90; - else - _xFlagPos = _y / 2 + _newY; - } - playSound(1); - } - -} - -void SsScene2202PuzzleCube::stopMoving() { - loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset); - SetSpriteUpdate(NULL); - _isMoving = false; - sendMessage(_parentScene, 0x2002, _cubePosition); -} - Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _isSolved(false), _leaveScene(false), _isCubeMoving(false), _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { @@ -939,7 +656,7 @@ void Scene2202::update() { _isSolved = true; } } - + } uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -981,7 +698,7 @@ int16 Scene2202::getFreeCubePosition(int16 cubePosition) { } bool Scene2202::testIsSolved() { - return + return getSubVar(VA_CUBE_POSITIONS, 0) == 0 && getSubVar(VA_CUBE_POSITIONS, 2) == 2 && getSubVar(VA_CUBE_POSITIONS, 3) == 3 && @@ -991,100 +708,6 @@ bool Scene2202::testIsSolved() { getSubVar(VA_CUBE_POSITIONS, 8) == 7; } -static const uint32 kAsCommonKeyFileHashes[] = { - 0x2450D850, 0x0C9CE8D0, 0x2C58A152 -}; - -AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y) - : AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) { - - if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) { - SetMessageHandler(&AsCommonKey::handleMessage); - } else { - // If Klaymen already has the key or it's already inserted then don't show it - setVisible(false); - SetMessageHandler(NULL); - } -} - -uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setSubVar(VA_HAS_KEY, _keyIndex, 1); - setVisible(false); - SetMessageHandler(NULL); - } - return messageResult; -} - -static const uint32 kAsScene2203DoorFileHashes[] = { - 0x7868AE10, 0x1A488110 -}; - -AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _doorIndex(doorIndex) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2203Door::handleMessage); - _x = 320; - _y = 240; - createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); - if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1); - _newStickFrameIndex = 0; - } -} - -uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) - sendMessage(_parentScene, 0x2002, 0); - else - sendMessage(_parentScene, 0x2001, 0); - messageResult = 1; - break; - case 0x2000: - _otherDoor = (Sprite*)param.asEntity(); - break; - case 0x3002: - if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) - sendMessage(_parentScene, 0x4808, 0); - stopAnimation(); - break; - case 0x4808: - setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex); - sendMessage(_otherDoor, 0x4809, 0); - openDoor(); - break; - case 0x4809: - closeDoor(); - sendMessage(_parentScene, 0x2003, 0); - break; - } - return messageResult; -} - -void AsScene2203Door::openDoor() { - playSound(0, 0x341014C4); - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 1, -1); -} - -void AsScene2203Door::closeDoor() { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); - _playBackwards = true; - _newStickFrameIndex = 0; -} - Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { @@ -1146,7 +769,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _ssSmallRightDoor->setVisible(false); _klaymen->setClipRect(_leftDoorClipRect); } - + } Scene2203::~Scene2203() { @@ -1197,30 +820,12 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - SetMessageHandler(&SsScene2205DoorFrame::handleMessage); - createSurface(1100, 45, 206); - loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); -} - -uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); - break; - } - return messageResult; -} - Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { SetMessageHandler(&Scene2205::handleMessage); SetUpdateHandler(&Scene2205::update); - + setHitRects(0x004B0620); if (getGlobalVar(V_LIGHTS_ON)) { _isLightOn = true; @@ -1263,11 +868,11 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); _klaymen->setSoundFlag(true); - + loadDataResource(0x00144822); - + } - + void Scene2205::update() { Scene::update(); if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) { @@ -1325,142 +930,14 @@ static const int16 kScene2206XPositions[] = { 384, 480, 572 }; -static const uint32 kScene2206MessageIds1[] = { - 0x004B8998, 0x004B89B8, 0x004B89D8 -}; - -static const uint32 kScene2206MessageIds2[] = { - 0x004B89F8, 0x004B8A20, 0x004B8A48 -}; - -static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = { - -24, -28, -18, 6, 9, -8 -}; - -static const int16 kAsScene2206DoorSpikesXDeltasClose[] = { - -8, 7, 11, 26, 13, 14 -}; - -AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, fileHash, 200) { - - if (getGlobalVar(V_SPIKES_RETRACTED)) - _x -= 63; - SetUpdateHandler(&AsScene2206DoorSpikes::update); - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene2206DoorSpikes::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4808: - _deltaIndex = 0; - playSound(0, 0x032746E0); - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen); - break; - case 0x4809: - _deltaIndex = 0; - playSound(0, 0x002642C0); - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206DoorSpikes::suClose); - break; - } - return messageResult; -} - -void AsScene2206DoorSpikes::suOpen() { - if (_deltaIndex < 6) { - _x += kAsScene2206DoorSpikesXDeltasOpen[_deltaIndex]; - _deltaIndex++; - } else { - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); - } -} - -void AsScene2206DoorSpikes::suClose() { - if (_deltaIndex < 6) { - _x += kAsScene2206DoorSpikesXDeltasClose[_deltaIndex]; - _deltaIndex++; - } else { - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); - } -} - -AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, fileHash, 50) { - - SetUpdateHandler(&AsScene2206Platform::update); - SetMessageHandler(&AsScene2206Platform::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene2206Platform::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4803: - _yDelta = 0; - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206Platform::suMoveDown); - break; - } - return messageResult; -} - -void AsScene2206Platform::suMoveDown() { - _yDelta++; - _y += _yDelta; -} - -SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) - : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { - - if (getGlobalVar(V_HAS_TEST_TUBE)) { - setVisible(false); - SetMessageHandler(NULL); - } else - SetMessageHandler(&SsScene2206TestTube::handleMessage); - _collisionBoundsOffset = _drawOffset; - updateBounds(); -} - -uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setGlobalVar(V_HAS_TEST_TUBE, 1); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { uint32 fileHash; - + SetUpdateHandler(&Scene::update); SetMessageHandler(&Scene2206::handleMessage); - + if (getGlobalVar(V_LIGHTS_ON)) { fileHash = 0x41983216; _sprite1 = insertStaticSprite(0x2201266A, 100); @@ -1495,7 +972,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x0263D144, 0, 65, 0); addCollisionSprite(_ssTestTube); - + if (which < 0) { // Restoring game insertKlaymen<KmScene2206>(200, 430); @@ -1586,7 +1063,7 @@ void Scene2206::klaymenInFrontSpikes() { } void Scene2206::klaymenBehindSpikes() { - if (!getGlobalVar(V_LIGHTS_ON)) { + if (getGlobalVar(V_LIGHTS_ON)) { _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->startFadeToPalette(12); } @@ -1597,6 +1074,14 @@ void Scene2206::klaymenBehindSpikes() { _klaymen->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); } +static const uint32 kScene2206MessageIds1[] = { + 0x004B8998, 0x004B89B8, 0x004B89D8 +}; + +static const uint32 kScene2206MessageIds2[] = { + 0x004B89F8, 0x004B8A20, 0x004B8A48 +}; + void Scene2206::readClickedColumn() { setGlobalVar(V_CLICKED_COLUMN_INDEX, (_mouseClickPos.x - 354) / 96); if (getGlobalVar(V_CLICKED_COLUMN_INDEX) > 2) @@ -1617,317 +1102,6 @@ static const uint32 kScene2207FileHashes[] = { 0x3BB1E12E, 0x23B1E12E, 0x13B1E12E }; -AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { - - NPoint pt; - - _dataResource.load(0x00524846); - _pointArray = _dataResource.getPointArray(0x005B02B7); - pt = _dataResource.getPoint(0x403A82B1); - _x = pt.x; - _y = pt.y; - createSurface(1100, 129, 103); - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0); - _newStickFrameIndex = 0; - SetUpdateHandler(&AsScene2207Elevator::update); - SetMessageHandler(&AsScene2207Elevator::handleMessage); - SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); -} - -AsScene2207Elevator::~AsScene2207Elevator() { - _vm->_soundMan->deleteSoundGroup(0x02700413); -} - -void AsScene2207Elevator::update() { - - if (_destPointIndex + _destPointIndexDelta > _pointIndex) { - _pointIndex++; - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newStickFrameIndex = _pointIndex; - if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) - _destPointIndexDelta = 0; - else { - _vm->_soundMan->deleteSound(0xD3B02847); - playSound(0, 0x53B8284A); - } - } - } - - if (_destPointIndex + _destPointIndexDelta < _pointIndex) { - _pointIndex--; - if (_pointIndex == 0) - sendMessage(_parentScene, 0x2003, 0); - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newStickFrameIndex = _pointIndex; - if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) - _destPointIndexDelta = 0; - else { - _vm->_soundMan->deleteSound(0xD3B02847); - playSound(0, 0x53B8284A); - } - } - } - - if (_pointIndex > 20 && _surface->getPriority() != 900) - sendMessage(_parentScene, 0x2002, 900); - else if (_pointIndex < 20 && _surface->getPriority() != 1100) - sendMessage(_parentScene, 0x2002, 1100); - - AnimatedSprite::update(); - - if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) { - sendMessage(_parentScene, 0x2004, 0); - _isMoving = false; - } - -} - -void AsScene2207Elevator::suSetPosition() { - _x = (*_pointArray)[_pointIndex].x; - _y = (*_pointArray)[_pointIndex].y - 60; - updateBounds(); -} - -uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - moveToY(param.asInteger()); - break; - } - return messageResult; -} - -void AsScene2207Elevator::moveToY(int16 y) { - int16 minDistance = 480; - - if (!_pointArray || _pointArray->size() == 0) - return; - - for (uint i = 0; i < _pointArray->size(); i++) { - int16 distance = ABS(y - (*_pointArray)[i].y); - if (distance < minDistance) { - minDistance = distance; - _destPointIndex = i; - } - } - - if (_destPointIndex != _pointIndex) { - if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) - _destPointIndexDelta = 0; - else if (_destPointIndex < _pointIndex) - _destPointIndexDelta = -2; - else - _destPointIndexDelta = 2; - _vm->_soundMan->addSound(0x02700413, 0xD3B02847); - _vm->_soundMan->playSoundLooping(0xD3B02847); - } - - _isMoving = true; - -} - -AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - _x = x; - _y = y; - createSurface(1010, 71, 73); - setDoDeltaX(doDeltaX); - startAnimation(0x80880090, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207Lever::handleMessage); -} - -uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x3002: - gotoNextState(); - stopAnimation(); - break; - case 0x4807: - stLeverUp(); - break; - case 0x480F: - stLeverDown(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -void AsScene2207Lever::stLeverDown() { - startAnimation(0x80880090, 1, -1); - playSound(0, 0x40581882); - FinalizeState(&AsScene2207Lever::stLeverDownEvent); -} - -void AsScene2207Lever::stLeverDownEvent() { - sendMessage(_parentScene, 0x480F, 0); -} - -void AsScene2207Lever::stLeverUp() { - startAnimation(0x80880090, 6, -1); - _playBackwards = true; - playSound(0, 0x40581882); - FinalizeState(&AsScene2207Lever::stLeverUpEvent); -} - -void AsScene2207Lever::stLeverUpEvent() { - sendMessage(_parentScene, 0x4807, 0); -} - -AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1200), _idle(true) { - - _x = 309; - _y = 320; - createSurface1(0xCCFD6090, 100); - startAnimation(0xCCFD6090, 0, -1); - _newStickFrameIndex = 0; - loadSound(1, 0x40330872); - loadSound(2, 0x72A2914A); - loadSound(3, 0xD4226080); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); -} - -AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { - _vm->_soundMan->deleteSoundGroup(0x80D00820); -} - -uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (!_idle) { - if (param.asInteger() == 0x3423093) { - _vm->_soundMan->addSound(0x80D00820, 0x12121943); - _vm->_soundMan->playSoundLooping(0x12121943); - } else if (param.asInteger() == 0x834AB011) { - stopSound(0); - stopSound(1); - stopSound(2); - stopSound(3); - _vm->_soundMan->deleteSound(0x12121943); - } else if (param.asInteger() == 0x3A980501) - playSound(1); - else if (param.asInteger() == 0x2A2AD498) - playSound(2); - else if (param.asInteger() == 0xC4980008) - playSound(3); - else if (param.asInteger() == 0x06B84228) - playSound(0, 0xE0702146); - } - break; - case 0x2006: - stStartAnimation(); - break; - case 0x2007: - stStopAnimation(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2207WallRobotAnimation::stStartAnimation() { - if (!_idle) { - NextState(NULL); - } else { - startAnimation(0xCCFD6090, 0, -1); - _idle = false; - setVisible(true); - } -} - -void AsScene2207WallRobotAnimation::stStopAnimation() { - NextState(&AsScene2207WallRobotAnimation::cbStopAnimation); -} - -void AsScene2207WallRobotAnimation::cbStopAnimation() { - stopAnimation(); - stopSound(0); - stopSound(1); - stopSound(2); - stopSound(3); - _vm->_soundMan->deleteSound(0x12121943); - _idle = true; - setVisible(false); -} - -AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _idle(true) { - - _x = 309; - _y = 320; - createSurface1(0x8CAA0099, 100); - startAnimation(0x8CAA0099, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); -} - -uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2006: - stStartAnimation(); - break; - case 0x2007: - stStopAnimation(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2207WallCannonAnimation::stStartAnimation() { - if (!_idle) { - NextState(NULL); - } else { - setVisible(true); - startAnimation(0x8CAA0099, 0, -1); - _idle = false; - } -} - -void AsScene2207WallCannonAnimation::stStopAnimation() { - NextState(&AsScene2207WallCannonAnimation::cbStopAnimation); -} - -void AsScene2207WallCannonAnimation::cbStopAnimation() { - stopAnimation(); - setVisible(false); - _idle = true; -} - -SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index) - : StaticSprite(vm, fileHash, 100) { - - _x = 330; - _y = 246 + index * 50; - updatePosition(); -} - Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule), _klaymenAtElevator(true), _elevatorSurfacePriority(0) { @@ -1943,7 +1117,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) _klaymen->setRepl(64, 0); setMessageList(0x004B38E8); _asElevator = insertSprite<AsScene2207Elevator>(this); - + if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x88C00241); setPalette(0x88C00241); @@ -1952,7 +1126,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); _asTape = insertSprite<AsScene1201Tape>(this, 4, 1100, 277, 428, 0x9148A011); - addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _asLever = insertSprite<AsScene2207Lever>(this, 527, 333, 0); addCollisionSprite(_asLever); _asWallRobotAnimation = insertSprite<AsScene2207WallRobotAnimation>(this); @@ -2106,7 +1280,7 @@ static const uint32 kScene2208FileHashes1[] = { 0x041023CB, 0x041020CB, 0x041026CB, 0x04102ACB, 0x041032CB, 0x041002CB }; - + static const uint32 kScene2208FileHashes2[] = { 0x091206C9, 0x091406C9, 0x091806C9, 0x090006C9, 0x093006C9, 0x095006C9 @@ -2122,13 +1296,13 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); _textResource.load(getGlobalVar(V_COLUMN_TEXT_NAME)); - + textStart = _textResource.getString(getGlobalVar(V_CLICKED_COLUMN_INDEX), textEnd); while (textStart < textEnd) { _strings.push_back(textStart); textStart += strlen(textStart) + 1; } - + _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(V_COLUMN_TEXT_NAME) == calcHash("stLineagex") ? 1 : 0)); _background = new Background(_vm, 0); @@ -2141,20 +1315,20 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C); - _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); + _backgroundSurface = new BaseSurface(_vm, 0, 640, 480, "background"); spriteResource.load(0x08100289, true); _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192, "top background"); spriteResource.load(!getGlobalVar(V_COLUMN_BACK_NAME) ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] : getGlobalVar(V_COLUMN_BACK_NAME), true); _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192, "bottom background"); spriteResource.load(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6], true); _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - + SetUpdateHandler(&Scene2208::update); SetMessageHandler(&Scene2208::handleMessage); @@ -2165,7 +1339,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) if (_newRowIndex < 6) _newRowIndex = 0; _rowScrollY = 0; - _backgroundScrollY = 48 * _newRowIndex; + _backgroundScrollY = 48 * _newRowIndex; _currRowIndex = _newRowIndex; for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++) @@ -2185,7 +1359,7 @@ Scene2208::~Scene2208() { void Scene2208::update() { int16 mouseY = _vm->getMouseY(); - + if (mouseY < 48) { if (_currRowIndex > 0) _newRowIndex = _currRowIndex - 1; @@ -2235,7 +1409,7 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene2208::drawRow(int16 rowIndex) { - NDrawRect sourceRect; + NDrawRect sourceRect; int16 y = (rowIndex * 48) % 528; if (rowIndex < 4) { sourceRect.x = 0; @@ -2280,7 +1454,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); - + if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x11840E24); setPalette(0x11840E24); @@ -2297,7 +1471,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) } _asTape = insertSprite<AsScene1201Tape>(this, 10, 1100, 464, 435, 0x9148A011); - addCollisionSprite(_asTape); + addCollisionSprite(_asTape); if (which < 0) { // Restoring game @@ -2380,7 +1554,7 @@ void Scene2242::readClickedColumn() { } static const int16 kHallOfRecordsKlaymenXPos[] = { - 68, 157, 246, 335, + 68, 157, 246, 335, 424, 513, 602 }; @@ -2396,7 +1570,7 @@ static const uint32 kHallOfRecordsSceneMessageListIds1[] = { HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId) : Scene(vm, parentModule) { - + _hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId); SetMessageHandler(&HallOfRecordsScene::handleMessage); @@ -2487,7 +1661,7 @@ static const uint32 kScene2247MessageListIds1[] = { Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { - + SetMessageHandler(&Scene2247::handleMessage); SetUpdateHandler(&Scene::update); @@ -2524,7 +1698,7 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) } _klaymen->setSoundFlag(true); - + } Scene2247::~Scene2247() { |