From f2e17d83fe312bdc97ebaee23f9f2b2b3a7c0968 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Fri, 30 Oct 2015 18:24:25 +0100 Subject: MADS: Phantom: Implement scene 404 --- engines/mads/phantom/phantom_scenes.cpp | 2 +- engines/mads/phantom/phantom_scenes4.cpp | 538 +++++++++++++++++++++++++++++-- engines/mads/phantom/phantom_scenes4.h | 22 ++ 3 files changed, 543 insertions(+), 19 deletions(-) diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp index 713dec04b3..7366da1592 100644 --- a/engines/mads/phantom/phantom_scenes.cpp +++ b/engines/mads/phantom/phantom_scenes.cpp @@ -124,7 +124,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) { case 403: // labyrinth room (big), 4 exits + 1 bricked door, left return new Scene403(vm); case 404: // labyrinth room, 3 exits - return new DummyScene(vm); // TODO + return new Scene404(vm); case 406: // labyrinth room, 2 exits return new DummyScene(vm); // TODO case 407: // catacomb room / lake diff --git a/engines/mads/phantom/phantom_scenes4.cpp b/engines/mads/phantom/phantom_scenes4.cpp index 667f629eaf..4edea7982e 100644 --- a/engines/mads/phantom/phantom_scenes4.cpp +++ b/engines/mads/phantom/phantom_scenes4.cpp @@ -601,10 +601,10 @@ void Scene403::enter() { _scene->_hotspots.activate(NOUN_PLANK, false); _scene->_hotspots.activate(NOUN_GATE, false); - _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false); - _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false); - _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false); - _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*RRD_9", false); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('f', 0), false); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 1), false); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 2), false); _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 3), false); if (_game.exitCatacombs(0) == -1) { @@ -614,7 +614,7 @@ void Scene403::enter() { } if (_game.exitCatacombs(3) == -1) { - _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false); _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); _scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false); } @@ -734,15 +734,15 @@ void Scene403::step() { void Scene403::actions() { if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) - && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { if (_frameInRoomFl) _vm->_dialogs->show(29); else { switch (_game._trigger) { case (0): - _game._player._stepEnabled = false; - _game._player._visible = false; - _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); _scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1); @@ -796,8 +796,8 @@ void Scene403::actions() { break; case 2: - _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); - _game._player._visible = true; + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); + _game._player._visible = true; _game._player._stepEnabled = true; break; @@ -814,9 +814,9 @@ void Scene403::actions() { if ((_takingFrameInRoomFl || _game._trigger)) { switch (_game._trigger) { case (0): - _game._player._stepEnabled = false; - _game._player._visible = false; - _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 5, 2); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 5); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); _scene->_sequences.setTrigger(_globals._sequenceIndexes[8], 2, 5, 1); @@ -852,8 +852,8 @@ void Scene403::actions() { break; case 2: - _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); - _game._player._visible = true; + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[8]); + _game._player._visible = true; _game._player._stepEnabled = true; break; @@ -1010,7 +1010,7 @@ void Scene403::preActions() { if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) _game.moveCatacombs(1); - _frameInRoomFl = false; + _frameInRoomFl = false; _takingFrameInRoomFl = false; if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { @@ -1038,7 +1038,7 @@ void Scene403::preActions() { } if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) - && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { if (_frameInRoomFl) _game._player._needToWalk = false; else { @@ -1050,5 +1050,507 @@ void Scene403::preActions() { /*------------------------------------------------------------------------*/ +Scene404::Scene404(MADSEngine *vm) : Scene4xx(vm) { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + _anim0ActvFl = false; + + _redFrameHotspotId = -1; + _greenFrameHostpotId = -1; + _blueFrameHotspotId = -1; + _yellowFrameHotspotId = -1; +} + +void Scene404::synchronize(Common::Serializer &s) { + Scene4xx::synchronize(s); + + s.syncAsByte(_frameInRoomFl); + s.syncAsByte(_takingFrameInRoomFl); + s.syncAsByte(_anim0ActvFl); + + s.syncAsSint16LE(_redFrameHotspotId); + s.syncAsSint16LE(_greenFrameHostpotId); + s.syncAsSint16LE(_blueFrameHotspotId); + s.syncAsSint16LE(_yellowFrameHotspotId); +} + +void Scene404::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) + _scene->_initialVariant = 1; + + _scene->addActiveVocab(NOUN_RED_FRAME); + _scene->addActiveVocab(NOUN_YELLOW_FRAME); + _scene->addActiveVocab(NOUN_BLUE_FRAME); + _scene->addActiveVocab(NOUN_GREEN_FRAME); +} + +void Scene404::enter() { + _game.initCatacombs(); + + _scene->_hotspots.activate(NOUN_RATS_NEST, false); + _scene->_hotspots.activate(NOUN_WEB, false); + _scene->_hotspots.activate(NOUN_BROKEN_POT, false); + _scene->_hotspots.activate(NOUN_BLOCK, false); + _scene->_hotspots.activate(NOUN_PUDDLE, false); + + _anim0ActvFl = false; + + _globals._spriteIndexes[9] = _scene->_sprites.addSprites("*RRD_9", false); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('f', 0), false); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('f', 1), false); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('f', 2), false); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('f', 3), false); + + + if (_game.exitCatacombs(0) == -1) { + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 1), false); + _scene->drawToBackground(_globals._spriteIndexes[1], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_NORTH, false); + } + + if (_game.exitCatacombs(3) == -1) { + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('c', 0), false); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_WEST, false); + } + + if (_game.exitCatacombs(1) == -1) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 2), false); + _scene->drawToBackground(_globals._spriteIndexes[2], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_ARCHWAY_TO_EAST, false); + } + + if (_game.exitCatacombs(2) == -1) + _scene->_hotspots.activate(NOUN_MORE_CATACOMBS, false); + + if (_globals[kCatacombsMisc] & MAZE_EVENT_RAT_NEST) { + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('c', 3), false); + _scene->drawToBackground(_globals._spriteIndexes[3], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_RATS_NEST, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_WEB) { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', 4), false); + _scene->drawToBackground(_globals._spriteIndexes[4], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_WEB, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_POT) { + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('c', 5), false); + _scene->drawToBackground(_globals._spriteIndexes[5], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_BROKEN_POT, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_BLOCK) { + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 7), false); + _scene->drawToBackground(_globals._spriteIndexes[7], 1, Common::Point(-32000, -32000), 0, 100); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_FALLEN_BLOCK) { + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 8), false); + _scene->drawToBackground(_globals._spriteIndexes[8], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_hotspots.activate(NOUN_BLOCK, true); + } + + if (_globals[kCatacombsMisc] & MAZE_EVENT_PUDDLE) { + _scene->_hotspots.activate(NOUN_PUDDLE, true); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 0); + _anim0ActvFl = true; + } + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + switch (_globals[kCatacombsFrom]) { + case 0: + _game._player._playerPos = Common::Point(156, 98); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(156, 117), FACING_SOUTH); + break; + + case 1: + _game._player._playerPos = Common::Point(319, 135); + _game._player._facing = FACING_WEST; + _game._player.walk(Common::Point(279, 135), FACING_WEST); + break; + + case 2: + _game._player._playerPos = Common::Point(175, 147); + _game._player._facing = FACING_NORTH; + break; + + case 3: + _game._player._playerPos = Common::Point(17, 131); + _game._player._facing = FACING_SOUTH; + _game._player.walk(Common::Point(60, 131), FACING_EAST); + break; + + default: + break; + } + } + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_globals[kPriestPistonPuke]) + _scene->_sequences.setTimingTrigger(120, 60); + + sceneEntrySound(); +} + +void Scene404::step() { + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 20) + _scene->setAnimFrame(_globals._animationIndexes[0], 0); + } + + if (_game._trigger == 60) { + _vm->_dialogs->show(30); + _globals[kPriestPistonPuke] = false; + } +} + +void Scene404::actions() { + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _vm->_dialogs->show(29); + else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _game._objects.setRoom(OBJ_RED_FRAME, NOWHERE); + _game._objects[OBJ_RED_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _redFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_RED_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_redFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _game._objects.setRoom(OBJ_GREEN_FRAME, NOWHERE); + _game._objects[OBJ_GREEN_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _greenFrameHostpotId = _scene->_dynamicHotspots.add(NOUN_GREEN_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_greenFrameHostpotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _game._objects.setRoom(OBJ_BLUE_FRAME, NOWHERE); + _game._objects[OBJ_BLUE_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _blueFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_BLUE_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_blueFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _game._objects.setRoom(OBJ_YELLOW_FRAME, NOWHERE); + _game._objects[OBJ_YELLOW_FRAME]._roomNumber = _globals[kCatacombsRoom] + 600; + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _yellowFrameHotspotId = _scene->_dynamicHotspots.add(NOUN_YELLOW_FRAME, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(pos.x - 5, pos.y - 5, pos.x + 5, pos.y + 1)); + _scene->_dynamicHotspots.setPosition(_yellowFrameHotspotId, Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + break; + + case 2: + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE)) { + if ((_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_GREEN_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME)) && (_takingFrameInRoomFl || _game._trigger)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[9], true); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 2, 5, 1); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[9], 0, 0, 2); + break; + + case 1: + if (_action.isObject(NOUN_RED_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[10]); + _scene->_dynamicHotspots.remove(_redFrameHotspotId); + _game._objects.addToInventory(OBJ_RED_FRAME); + } + + if (_action.isObject(NOUN_GREEN_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[11]); + _scene->_dynamicHotspots.remove(_greenFrameHostpotId); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + } + + if (_action.isObject(NOUN_BLUE_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[12]); + _scene->_dynamicHotspots.remove(_blueFrameHotspotId); + _game._objects.addToInventory(OBJ_BLUE_FRAME); + } + + if (_action.isObject(NOUN_YELLOW_FRAME)) { + _scene->deleteSequence(_globals._sequenceIndexes[13]); + _scene->_dynamicHotspots.remove(_yellowFrameHotspotId); + _game._objects.addToInventory(OBJ_YELLOW_FRAME); + } + + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[9]); + _game._player._visible = true; + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_NORTH)) { + _game.moveCatacombs(0); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + _game.moveCatacombs(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_EXIT_TO, NOUN_MORE_CATACOMBS)) { + _game.moveCatacombs(2); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_EAST)) { + _game.moveCatacombs(1); + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(40410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(40411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(40412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY)) { + _vm->_dialogs->show(40413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_EXPOSED_BRICK)) { + _vm->_dialogs->show(40414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MORE_CATACOMBS)) { + _vm->_dialogs->show(40415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PUDDLE)) { + _vm->_dialogs->show(40417); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RATS_NEST)) { + _vm->_dialogs->show(40418); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40421); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WEB)) { + _vm->_dialogs->show(40424); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RED_FRAME) && !_game._objects.isInInventory(OBJ_RED_FRAME)) { + _vm->_dialogs->showItem(OBJ_RED_FRAME, 802, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GREEN_FRAME) && !_game._objects.isInInventory(OBJ_GREEN_FRAME)) { + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLUE_FRAME) && !_game._objects.isInInventory(OBJ_BLUE_FRAME)) { + _vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_YELLOW_FRAME) && !_game._objects.isInInventory(OBJ_YELLOW_FRAME)) { + _vm->_dialogs->showItem(OBJ_YELLOW_FRAME, 804, 0); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BLOCK)) { + _vm->_dialogs->show(40430); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_RATS_NEST)) { + _vm->_dialogs->show(40419); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BROKEN_POT)) { + _vm->_dialogs->show(40422); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_BLOCK)) { + _vm->_dialogs->show(40431); + _action._inProgress = false; + return; + } +} + +void Scene404::preActions() { + _frameInRoomFl = false; + _takingFrameInRoomFl = false; + + if (_game._objects[OBJ_RED_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_RED_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_YELLOW_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_YELLOW_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_BLUE_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_game._objects[OBJ_GREEN_FRAME]._roomNumber == _globals[kCatacombsRoom] + 600) { + _frameInRoomFl = true; + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME)) + _takingFrameInRoomFl = true; + } + + if (_action.isAction(VERB_PUT) && _action.isTarget(NOUN_FLOOR) + && (_action.isObject(NOUN_RED_FRAME) || _action.isObject(NOUN_BLUE_FRAME) || _action.isObject(NOUN_YELLOW_FRAME) || _action.isObject(NOUN_GREEN_FRAME))) { + if (_frameInRoomFl) + _game._player._needToWalk = false; + else { + Common::Point pos = _scene->_sprites[_globals._spriteIndexes[10]]->getFramePos(0); + _game._player.walk(Common::Point(pos.x + 12, pos.y), FACING_NORTHWEST); + } + } +} + +/*------------------------------------------------------------------------*/ + } // End of namespace Phantom } // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes4.h b/engines/mads/phantom/phantom_scenes4.h index 0233a32a0a..be07183593 100644 --- a/engines/mads/phantom/phantom_scenes4.h +++ b/engines/mads/phantom/phantom_scenes4.h @@ -95,6 +95,28 @@ public: virtual void preActions(); virtual void actions(); }; + +class Scene404 : public Scene4xx { +private: + bool _frameInRoomFl; + bool _takingFrameInRoomFl; + bool _anim0ActvFl; + + int _redFrameHotspotId; + int _greenFrameHostpotId; + int _blueFrameHotspotId; + int _yellowFrameHotspotId; + +public: + Scene404(MADSEngine *vm); + virtual void synchronize(Common::Serializer &s); + + virtual void setup(); + virtual void enter(); + virtual void step(); + virtual void preActions(); + virtual void actions(); +}; } // End of namespace Phantom } // End of namespace MADS -- cgit v1.2.3