diff options
Diffstat (limited to 'engines/mads')
-rw-r--r-- | engines/mads/phantom/phantom_scenes.cpp | 2 | ||||
-rw-r--r-- | engines/mads/phantom/phantom_scenes3.cpp | 276 | ||||
-rw-r--r-- | engines/mads/phantom/phantom_scenes3.h | 12 |
3 files changed, 289 insertions, 1 deletions
diff --git a/engines/mads/phantom/phantom_scenes.cpp b/engines/mads/phantom/phantom_scenes.cpp index 9c95798ad1..d903547e43 100644 --- a/engines/mads/phantom/phantom_scenes.cpp +++ b/engines/mads/phantom/phantom_scenes.cpp @@ -109,7 +109,7 @@ SceneLogic *SceneFactory::createScene(MADSEngine *vm) { case 306: // chandelier #2 return new Scene306(vm); case 307: // catwalk #3 above stage - return new DummyScene(vm); // TODO + return new Scene307(vm); case 308: // hidden staircase behind balcony box return new DummyScene(vm); // TODO case 309: // lake and archway diff --git a/engines/mads/phantom/phantom_scenes3.cpp b/engines/mads/phantom/phantom_scenes3.cpp index 4193babe7b..184a0e4fef 100644 --- a/engines/mads/phantom/phantom_scenes3.cpp +++ b/engines/mads/phantom/phantom_scenes3.cpp @@ -1586,5 +1586,281 @@ void Scene306::preActions() { /*------------------------------------------------------------------------*/ +Scene307::Scene307(MADSEngine *vm) : Scene3xx(vm) { +} + +void Scene307::synchronize(Common::Serializer &s) { + Scene3xx::synchronize(s); +} + +void Scene307::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene307::enter() { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0), false); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0), false); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9", false); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9", false); + + if (_globals[kRightDoorIsOpen504]) + _scene->_hotspots.activate(NOUN_DOOR, true); + else + _scene->_hotspots.activate(NOUN_DOOR, false); + + if (_game._objects.isInRoom(OBJ_GREEN_FRAME) && (_game._difficulty == DIFFICULTY_EASY)) { + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } else + _scene->_hotspots.activate(NOUN_GREEN_FRAME, false); + + if (_scene->_priorSceneId == 308) { + _game._player._playerPos = Common::Point(18, 134); + _game._player._facing = FACING_SOUTHEAST; + _game._player._stepEnabled = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + if (!(_globals[kPlayerScoreFlags] & 16)) { + _globals[kPlayerScoreFlags] |= 16; + _globals[kPlayerScore] += 5; + } + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4); + _game._player.walk(Common::Point(41, 137), FACING_EAST); + _game._player.setWalkTrigger(60); + } else if ((_scene->_priorSceneId == 303) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) + _game._player.firstWalk(Common::Point(340, 137), FACING_WEST, Common::Point(304, 137), FACING_WEST, true); + + sceneEntrySound(); +} + +void Scene307::step() { + switch (_game._trigger) { + case 60: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _game._player._stepEnabled = true; + break; + + default: + break; + } +} + +void Scene307::actions() { + if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME) && (_game._objects.isInRoom(OBJ_GREEN_FRAME) || _game._trigger)) { + switch (_game._trigger) { + case (0): + if (_globals[kCurrentYear] == 1881) { + int count = 0; + if (_game._objects.isInInventory(OBJ_YELLOW_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_RED_FRAME)) + ++count; + if (_game._objects.isInInventory(OBJ_BLUE_FRAME)) + ++count; + + if (count < 3) + _globals[kPlayerScore] += 5; + } + + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 2, 5, 1); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[1], 0, 0, 2); + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _scene->_hotspots.activate(NOUN_GREEN_FRAME, false); + _game._objects.addToInventory(OBJ_GREEN_FRAME); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(2, 0, 1, _globals._sequenceIndexes[1]); + _game._player._visible = true; + _scene->_sequences.setTimingTrigger(20, 3); + break; + + case 3: + if (_globals[kCurrentYear] == 1881) + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 845, 0); + else + _vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0); + + _game._player._stepEnabled = true; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 2, 4, 70); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[4], 0, 0, 72); + break; + + case 70: + _vm->_sound->command(24); + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.setTrigger(_globals._sequenceIndexes[3], 0, 0, 71); + break; + + case 71: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); + _game.syncTimers(1, _globals._sequenceIndexes[3], 1, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setTimingTrigger(10, 73); + } + break; + + case 72: + _game._player._visible = true; + break; + + case 73: + _scene->_nextSceneId = 308; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(30710); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_COLUMN)) { + if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(30725); + else + _vm->_dialogs->show(30711); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CATWALK)) { + _vm->_dialogs->show(30712); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRID)) { + _vm->_dialogs->show(30713); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GIRDER)) { + _vm->_dialogs->show(30714); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_GRIDWORK)) { + _vm->_dialogs->show(30715); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_HEMP)) { + _vm->_dialogs->show(30716); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BACK_WALL)) { + _vm->_dialogs->show(30717); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DUCTWORK)) { + _vm->_dialogs->show(30718); + _action._inProgress = false; + return; + } + + if ((_action.isObject(NOUN_GREEN_FRAME)) && (_game._objects.isInRoom(OBJ_GREEN_FRAME))) { + if (_globals[kCurrentYear] == 1993) + _vm->_dialogs->show(30719); + else + _vm->_dialogs->show(30720); + + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ALCOVE)) { + _vm->_dialogs->show(30721); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAILING)) { + _vm->_dialogs->show(30722); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(30726); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_HEMP)) { + _vm->_dialogs->show(30723); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_PULL, NOUN_HEMP)) { + _vm->_dialogs->show(30141); + _action._inProgress = false; + } +} + +void Scene307::preActions() { + if (_action.isAction(VERB_EXIT_TO, NOUN_ALCOVE)) + _game._player._walkOffScreenSceneId = 303; + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) + _game._player.walk(Common::Point(28, 137), FACING_NORTHWEST); +} + +/*------------------------------------------------------------------------*/ + } // End of namespace Phantom } // End of namespace MADS diff --git a/engines/mads/phantom/phantom_scenes3.h b/engines/mads/phantom/phantom_scenes3.h index 4e0d2d068e..0c3da8e741 100644 --- a/engines/mads/phantom/phantom_scenes3.h +++ b/engines/mads/phantom/phantom_scenes3.h @@ -167,6 +167,18 @@ public: virtual void preActions(); virtual void actions(); }; + +class Scene307 : public Scene3xx { +public: + Scene307(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 |