diff options
Diffstat (limited to 'engines/mads/phantom/phantom_scenes5.cpp')
-rw-r--r-- | engines/mads/phantom/phantom_scenes5.cpp | 4308 |
1 files changed, 4308 insertions, 0 deletions
diff --git a/engines/mads/phantom/phantom_scenes5.cpp b/engines/mads/phantom/phantom_scenes5.cpp new file mode 100644 index 0000000000..12d064becb --- /dev/null +++ b/engines/mads/phantom/phantom_scenes5.cpp @@ -0,0 +1,4308 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/scummsys.h" +#include "mads/mads.h" +#include "mads/conversations.h" +#include "mads/scene.h" +#include "mads/phantom/phantom_scenes.h" +#include "mads/phantom/phantom_scenes5.h" + +namespace MADS { + +namespace Phantom { + +void Scene5xx::setAAName() { + _game._aaName = Resources::formatAAName(1); + _vm->_palette->setEntry(254, 43, 47, 51); +} + +void Scene5xx::sceneEntrySound() { + if (!_vm->_musicFlag) + return; + + if ((_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) && (_globals[kFightStatus] == 0) && (_scene->_currentSceneId == 504)) + _vm->_sound->command(33); + else if (_scene->_currentSceneId == 505) + _vm->_sound->command((_vm->_gameConv->restoreRunning() == 20) ? 39 : 16); + else + _vm->_sound->command(16); +} + +void Scene5xx::setPlayerSpritesPrefix() { + _vm->_sound->command(5); + + Common::String oldName = _game._player._spritesPrefix; + if (!_game._player._forcePrefix) + _game._player._spritesPrefix = "RAL"; + if (oldName != _game._player._spritesPrefix) + _game._player._spritesChanged = true; + + _game._player._scalingVelocity = true; +} + +/*------------------------------------------------------------------------*/ + +Scene501::Scene501(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _skipFl = false; +} + +void Scene501::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skipFl); +} + +void Scene501::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHRISTINE); + _scene->addActiveVocab(VERB_LOOK_AT); + _scene->addActiveVocab(VERB_WALK_TO); +} + +void Scene501::enter() { + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activate(NOUN_BOAT, false); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _skipFl = false; + } + + _vm->_gameConv->load(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_9", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_8", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RDRR_6"); + + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93)); + _scene->_hotspots.activate(NOUN_BOAT, true); + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + } + + if (_scene->_priorSceneId == 506) { + _game._player._playerPos = Common::Point(305, 112); + _game._player._facing = FACING_WEST; + _game._player._stepEnabled = false; + + if (_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(113, 93)); + _scene->_hotspots.activate(NOUN_BOAT, true); + _game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST); + _game._player.setWalkTrigger(80); + _game._player.setWalkTrigger(55); + } else { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 100); + _globals[kChristineIsInBoat] = true; + _scene->_hotspots.activate(NOUN_BOAT, true); + _game._player.walk(Common::Point(260, 112), FACING_SOUTHWEST); + _game._player.setWalkTrigger(80); + } + + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + } else if ((_scene->_priorSceneId == 401) || (_scene->_priorSceneId == 408) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player.firstWalk(Common::Point(-20, 109), FACING_EAST, Common::Point(24, 109), FACING_EAST, true); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + } + + sceneEntrySound(); +} + +void Scene501::step() { + switch (_game._trigger) { + case 55: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 56); + break; + + case 56: + _vm->_sound->command(25); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); + if (!_globals[kChrisWillTakeSeat]) + _game._player._stepEnabled = true; + + _globals[kChrisWillTakeSeat] = false; + break; + + default: + break; + } + + + switch (_game._trigger) { + case 60: + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _vm->_sound->command(25); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _game._player._stepEnabled = true; + break; + + case 80: { + _game._player.walk(Common::Point(255, 118), FACING_NORTHWEST); + _scene->setAnimFrame(_globals._animationIndexes[0], 2); + int idx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 1); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 2); + _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 3); + } + break; + + case 90: + _globals[kPlayerScore] += 5; + _scene->_nextSceneId = 310; + break; + + case 100: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 9, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + break; + + default: + break; + } + + if (_anim0ActvFl) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 103) + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true, Common::Point(125, 94)); + + if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 28) && !_skipFl) { + _skipFl = true; + _scene->_sequences.addTimer(1, 55); + } + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 124) { + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, false, Common::Point(125, 94)); + _scene->_hotspots.activateAtPos(NOUN_CHRISTINE, true , Common::Point(113, 93)); + } + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 125) + _scene->setAnimFrame(_globals._animationIndexes[0], 124); + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 1) + _scene->setAnimFrame(_globals._animationIndexes[0], 0); + + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 84) + _game._player._stepEnabled = true; + } +} + +void Scene501::actions() { + if (_vm->_gameConv->activeConvId() == 26) { + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && (_globals[kChristineIsInBoat])) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(3); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) { + if (_game._objects.isInInventory(OBJ_OAR)) + _anim0ActvFl = false; + else + _vm->_dialogs->show(50123); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(74); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50122); + _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)) { + if (_scene->_customDest.x < 287) { + if (!_globals[kChristineIsInBoat]) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(74); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50120); + _game._player._stepEnabled = true; + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + break; + + case 66: + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _game._player.walk(Common::Point(305, 112), FACING_EAST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + _vm->_gameConv->stop(); + _scene->_nextSceneId = 506; + break; + } + } + } else { + if (!_globals[kChristineIsInBoat]) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: { + int idx = _globals._sequenceIndexes[1]; + _scene->deleteSequence(_globals._sequenceIndexes[1]); + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_SEQ, idx); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + } + break; + + case 66: + _game._player.walk(Common::Point(319, 116), FACING_NORTHWEST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 8, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 69); + _vm->_sound->command(25); + break; + + case 69: + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 5); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_nextSceneId = 502; + break; + } + } else { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); + break; + + case 1: { + int idx = _globals._sequenceIndexes[3]; + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 4); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addTimer(15, 2); + _vm->_sound->command(73); + } + break; + + case 2: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[3], false); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); + break; + + case 3: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[3]); + _game._player._visible = true; + _vm->_dialogs->show(50120); + _game._player._stepEnabled = true; + break; + + default: + break; + } + } + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50110); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50111); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50112); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50113); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LAKE)) { + _vm->_dialogs->show(50114); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_BOAT)) { + _vm->_dialogs->show(50126); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TORCH)) { + _vm->_dialogs->show(50117); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ARCHWAY_TO_WEST)) { + _vm->_dialogs->show(50118); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + if (_scene->_customDest.x < 287) { + if (_game._visitedScenes.exists(506)) + _vm->_dialogs->show(50127); + else + _vm->_dialogs->show(50119); + } else { + if (_game._visitedScenes.exists(506)) + _vm->_dialogs->show(50128); + else + _vm->_dialogs->show(50119); + } + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN)) { + _vm->_dialogs->show(50121); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show(50124); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_TORCH)) { + _vm->_dialogs->show(50125); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50129); + _action._inProgress = false; + } +} + +void Scene501::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST)) { + if (_globals[kLanternStatus] == 0) { + _game._player._needToWalk = false; + _vm->_dialogs->show(30918); + _game._player.cancelCommand(); + } else if (!_globals[kChristineIsInBoat]) + _game.enterCatacombs(0); + } + + if ((_action.isObject(NOUN_DOOR)) && (_action.isAction(VERB_LOCK) || _action.isAction(VERB_UNLOCK) || _action.isAction(VERB_OPEN))) { + if (_scene->_customDest.x < 287) + _game._player.walk(Common::Point(266, 112), FACING_EAST); + else + _game._player.walk(Common::Point(287, 118), FACING_EAST); + } + + if ((_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) && _game._visitedScenes.exists(506) && _scene->_customDest.x < 287) { + switch (_game._trigger) { + case 0: + _game._player._readyToWalk = false; + _game._player._needToWalk = false; + _game._player._stepEnabled = false; + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + _scene->_sequences.addTimer(6, 1); + break; + + case 1: + if (_vm->_gameConv->activeConvId() >= 0) + _scene->_sequences.addTimer(6, 1); + else { + _game._player._stepEnabled = true; + _action._inProgress = true; + _game._player._needToWalk = true; + _game._player._readyToWalk = true; + } + break; + + default: + break; + } + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_ARCHWAY_TO_WEST) && _globals[kLanternStatus] && _globals[kRightDoorIsOpen504]) + _game._player.walk(Common::Point(24, 110), FACING_WEST); +} + +/*------------------------------------------------------------------------*/ + +Scene502::Scene502(MADSEngine *vm) : Scene5xx(vm) { + _fire1ActiveFl = false; + _fire2ActiveFl = false; + _fire3ActiveFl = false; + _fire4ActiveFl = false; + _panelTurningFl = false; + _trapDoorHotspotEnabled = false; + _acceleratedFireActivationFl = false; + + for (int i = 0; i < 16; i++) { + _puzzlePictures[i] = -1; + _puzzleSprites[i] = -1; + _puzzleSequences[i] = -1; + } + + _panelPushedNum = -1; + _messageLevel = -1; + _cycleStage = -1; + + _nextPos = Common::Point(-1, -1); + + _lastFrameTime = 0; + _timer = 0; + _deathTimer = 0; + + _cyclePointer = nullptr; +} + +Scene502::~Scene502() { + if (_cyclePointer) + delete(_cyclePointer); +} + +void Scene502::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_fire1ActiveFl); + s.syncAsByte(_fire2ActiveFl); + s.syncAsByte(_fire3ActiveFl); + s.syncAsByte(_fire4ActiveFl); + s.syncAsByte(_panelTurningFl); + s.syncAsByte(_trapDoorHotspotEnabled); + s.syncAsByte(_acceleratedFireActivationFl); + + for (int i = 0; i < 16; i++) { + s.syncAsSint16LE(_puzzlePictures[i]); + s.syncAsSint16LE(_puzzleSprites[i]); + s.syncAsSint16LE(_puzzleSequences[i]); + } + + s.syncAsSint16LE(_panelPushedNum); + s.syncAsSint16LE(_messageLevel); + s.syncAsSint16LE(_cycleStage); + + s.syncAsSint16LE(_nextPos.x); + s.syncAsSint16LE(_nextPos.y); + + s.syncAsUint32LE(_lastFrameTime); + s.syncAsUint32LE(_timer); + s.syncAsUint32LE(_deathTimer); + + warning("more syncing required"); +} + +void Scene502::setup() { + setPlayerSpritesPrefix(); + setAAName(); +} + +void Scene502::enter() { + loadCyclingInfo(); + _scene->loadSpeech(7); + + _panelPushedNum = -1; + _panelTurningFl = false; + _fire1ActiveFl = false; + _fire2ActiveFl = false; + _fire3ActiveFl = false; + _fire4ActiveFl = false; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _lastFrameTime = _scene->_frameStartTime; + _cycleStage = 0; + _timer = 0; + _deathTimer = 0; + _messageLevel = 1; + _acceleratedFireActivationFl = true; + _trapDoorHotspotEnabled = false; + } + + _scene->_hotspots.activate(NOUN_ROPE, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, false, Common::Point(225, 28)); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 4)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('a', 2)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 3)); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('j', 0)); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('k', 0)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('l', 0)); + _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('m', 0)); + _globals._spriteIndexes[16] = _scene->_sprites.addSprites(formAnimName('h', 0)); + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } else + _scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100); + + if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + if (!_game._visitedScenes._sceneRevisited) { + if (_game._objects.isInInventory(OBJ_ROPE)) + _globals[kCableHookWasSeparate] = true; + else + _globals[kCableHookWasSeparate] = false; + } else if (_globals[kCableHookWasSeparate]) { + _game._objects.addToInventory(OBJ_ROPE); + _game._objects.addToInventory(OBJ_CABLE_HOOK); + _game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE); + } else { + _game._objects.setRoom(OBJ_ROPE, NOWHERE); + _game._objects.setRoom(OBJ_CABLE_HOOK, NOWHERE); + _game._objects.addToInventory(OBJ_ROPE_WITH_HOOK); + } + + _game._player._playerPos = Common::Point(43, 154); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(87, 153), FACING_EAST); + _game._player.setWalkTrigger(77); + } + + room_502_initialize_panels(); + + if (_trapDoorHotspotEnabled) { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _scene->_hotspots.activate(NOUN_TRAP_DOOR, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28)); + if (!_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) && !_game._objects.isInInventory(OBJ_CABLE_HOOK)) { + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 12); + _scene->_hotspots.activate(NOUN_ROPE, true); + } + } else { + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); + } + + sceneEntrySound(); +} + +void Scene502::step() { + if (_acceleratedFireActivationFl) { + int32 diff = _scene->_frameStartTime - _lastFrameTime; + if ((diff >= 0) && (diff <= 4)) { + _timer += diff; + _deathTimer += diff; + } else { + _timer += 1; + _deathTimer += 1; + } + _lastFrameTime = _scene->_frameStartTime; + + if (_timer >= 300) { + _timer = 0; + if (_cycleStage < 8) + ++_cycleStage; + } + } + + if ((_deathTimer >= 7200) && !_panelTurningFl) { + _vm->_dialogs->show(50215); + _game._player.walk(Common::Point(160, 148), FACING_NORTH); + _game._player.setWalkTrigger(71); + _game._player._stepEnabled = false; + _panelTurningFl = true; + _deathTimer = 0; + } + + if ((_deathTimer > 900) && (_messageLevel == 1) && !_panelTurningFl) { + _messageLevel = 2; + _vm->_dialogs->show(50212); + } + + if ((_deathTimer > 3600) && (_messageLevel == 2) && !_panelTurningFl) { + _messageLevel = 3; + _vm->_dialogs->show(50213); + } + + if ((_deathTimer > 5400) && (_messageLevel == 3) && !_panelTurningFl) { + _messageLevel = 4; + _vm->_dialogs->show(50214); + } + + switch (_game._trigger) { + case 71: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 44, 73); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 51, 74); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 32, 75); + break; + + case 72: + _globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_userInterface.noInventoryAnim(); + // CHECKME: Not sure about the next function call + _scene->_userInterface.refresh(); + _scene->_sequences.addTimer(120, 76); + break; + + case 73: + _vm->_sound->command(1); + _vm->_sound->command(67); + break; + + case 74: + _vm->_sound->command(27); + break; + + case 75: + _scene->playSpeech(7); + break; + + case 76: + _scene->_reloadSceneFlag = true; + break; + + case 77: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 78); + break; + + case 78: + _vm->_dialogs->show(50211); + _scene->drawToBackground(_globals._spriteIndexes[5], -2, Common::Point(-32000, -32000), 0, 100); + _game._player._stepEnabled = true; + break; + + default: + break; + } + + if (!_trapDoorHotspotEnabled) + animateFireBursts(); + + setPaletteCycle(); +} + +void Scene502::actions() { + if (_game._trigger >= 110) { + handlePanelAnimation(); + _action._inProgress = false; + return; + } + + switch (_game._trigger) { + case 80: + _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 6); + _scene->_hotspots.activateAtPos(NOUN_ROPE, true, Common::Point(225, 28)); + _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); + _scene->_hotspots.activate(NOUN_TRAP_DOOR, false); + _scene->_hotspots.activateAtPos(NOUN_TRAP_DOOR, true, Common::Point(225, 28)); + if (!_panelTurningFl) + _vm->_dialogs->show(50216); + + _action._inProgress = false; + return; + + case 90: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 14, 18); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 18, 110); + _action._inProgress = false; + return; + + case 91: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 95: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 7, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 8, 13); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 13, 110); + _action._inProgress = false; + return; + + case 96: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 100: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 5, 7); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 101); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 7, 110); + _action._inProgress = false; + return; + + case 101: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + case 102: + _panelTurningFl = false; + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + + case 105: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 8, 2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[10], true); + _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 4); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 106); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 110); + _action._inProgress = false; + return; + + case 106: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[10]); + _game._player._visible = true; + _scene->_sequences.addTimer(5, 102); + _action._inProgress = false; + return; + + default: + break; + } + + if (_action.isAction(VERB_PUSH, NOUN_PANEL)) { + if (_panelTurningFl) { + _action._inProgress = false; + return; + } + + Common::Point walkToPos; + getPanelInfo(&walkToPos, &_panelPushedNum, _scene->_customDest, &_nextPos); + _panelTurningFl = true; + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->_sequences.addTimer(1, 90); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->_sequences.addTimer(1, 95); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->_sequences.addTimer(1, 100); + break; + + default: + _scene->_sequences.addTimer(1, 105); + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR)) { + if (_trapDoorHotspotEnabled) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _panelTurningFl = true; + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 13); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 82); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 10, 83); + _game._objects.setRoom(OBJ_ROPE_WITH_HOOK, NOWHERE); + break; + + case 82: + _game._player._stepEnabled = true; + _game._player._visible = true; + _panelTurningFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); + _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); + _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 13); + _scene->_hotspots.activate(NOUN_ROPE, true); + break; + + case 83: + _vm->_sound->command(69); + break; + + default: + break; + } + } else + _vm->_dialogs->show(50229); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR) + && (_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK) || _game._objects.isInInventory(OBJ_CABLE_HOOK))) { + _vm->_dialogs->show(50228); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_ROPE, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50226); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_THROW, NOUN_CABLE_HOOK, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50227); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR)) { + switch (_game._trigger) { + case 0: + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _panelTurningFl = true; + _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 10); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 82); + break; + + case 82: + _scene->_nextSceneId = 504; + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50210); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50217); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50220 : 50225); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50219); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(50221); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PANELS)) { + _vm->_dialogs->show(50222); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PANEL)) { + _vm->_dialogs->show(50223); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50224); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) + && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _vm->_dialogs->show(50233); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50230 : 50228); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(_trapDoorHotspotEnabled ? 50228 : 50231); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_ROPE) && !_game._objects.isInInventory(OBJ_ROPE) + && !_game._objects.isInInventory(OBJ_CABLE_HOOK) && !_game._objects.isInInventory(OBJ_ROPE_WITH_HOOK)) { + _vm->_dialogs->show(50234); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LASSO, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50232); + _action._inProgress = false; + return; + } +} + +void Scene502::preActions() { + int panel; + + if (_action.isAction(VERB_PUSH, NOUN_PANEL)) { + Common::Point walkToPos; + Common::Point tmpPos; + getPanelInfo(&walkToPos, &panel, _scene->_customDest, &tmpPos); + _game._player.walk(walkToPos, FACING_NORTH); + } + + if (_trapDoorHotspotEnabled && (_action.isAction(VERB_CLIMB, NOUN_ROPE) || _action.isAction(VERB_CLIMB_THROUGH, NOUN_TRAP_DOOR))) + _game._player.walk(Common::Point(211, 149), FACING_NORTH); + + if (_trapDoorHotspotEnabled && (_action.isAction(VERB_THROW, NOUN_ROPE_WITH_HOOK, NOUN_TRAP_DOOR) || _action.isAction(VERB_GRAPPLE, NOUN_TRAP_DOOR))) + _game._player.walk(Common::Point(200, 149), FACING_NORTH); +} + +void Scene502::room_502_initialize_panels() { + for (int i = 0, curPuzzleSprite = 2, count = 1; i < 16; i++) { + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) + _puzzlePictures[i] = _vm->getRandomNumber(1, 4); + + curPuzzleSprite += (_puzzlePictures[i] * 3) - 3; + _puzzleSprites[i] = curPuzzleSprite; + + int sprIdx; + + switch (i) { + case 0: + case 1: + case 2: + case 3: + sprIdx = _globals._spriteIndexes[11]; + break; + + case 4: + case 5: + case 6: + case 7: + sprIdx = _globals._spriteIndexes[12]; + break; + + case 8: + case 9: + case 10: + case 11: + sprIdx = _globals._spriteIndexes[13]; + break; + + default: + sprIdx = _globals._spriteIndexes[14]; + break; + } + + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(sprIdx, false, curPuzzleSprite); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _puzzleSequences[i] = _globals._sequenceIndexes[15]; + + ++count; + if (count >= 5) + count = 1; + + switch (count) { + case 1: + curPuzzleSprite = 2; + break; + + case 2: + curPuzzleSprite = 14; + break; + + case 3: + curPuzzleSprite = 26; + break; + + case 4: + curPuzzleSprite = 38; + break; + } + } +} + +void Scene502::loadCyclingInfo() { + warning("TODO: loadCyclingInfo"); +} + +void Scene502::animateFireBursts() { + int rndTrigger; + + if (_acceleratedFireActivationFl) + rndTrigger = _vm->getRandomNumber(1, 50); + else + rndTrigger = _vm->getRandomNumber(1, 400); + + if (rndTrigger == 1) { + rndTrigger = _vm->getRandomNumber(1, 4); + + switch (rndTrigger) { + case 1: + if (!_fire1ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 60); + _fire1ActiveFl = true; + } + break; + + case 2: + if (!_fire2ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 63); + _fire2ActiveFl = true; + } + break; + + case 3: + if (!_fire3ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 66); + _fire3ActiveFl = true; + } + break; + + case 4: + if (!_fire4ActiveFl) { + _scene->_sequences.addTimer(_vm->getRandomNumber(300, 600), 69); + _fire4ActiveFl = true; + } + break; + } + } + + switch (_game._trigger) { + case 60: + if ((_game._player._playerPos.x < 198) || (_game._player._playerPos.y > 150)) { + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + } + break; + + case 61: + _fire1ActiveFl = false; + break; + + case 63: + if ((_game._player._playerPos.x > 127) || (_game._player._playerPos.y < 150)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 64); + } + break; + + case 64: + _fire2ActiveFl = false; + break; + + case 66: + if (_game._player._playerPos.x < 198) { + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + } + break; + + case 67: + _fire3ActiveFl = false; + break; + + case 69: + if ((_game._player._playerPos.x > 110) || (_game._player._playerPos.y > 150)) { + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 10); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 70); + } + break; + + case 70: + _fire4ActiveFl = false; + break; + + default: + break; + } +} + +void Scene502::setPaletteCycle() { + warning("TODO: setPaletteCycle"); +} + +void Scene502::getPanelInfo(Common::Point *walkToPos, int *panel, Common::Point mousePos, Common::Point *interimPos) { + walkToPos->y = 148; + + if ((mousePos.x < 120) || (mousePos.y < 75) || (mousePos.y > 137)) + return; + + if (mousePos.x <= 139) { + interimPos->x = 129; + if (mousePos.y <= 90) { + *panel = 0; + interimPos->y = 90; + walkToPos->x = 107; + } else if (mousePos.y <= 106) { + *panel = 4; + interimPos->y = 106; + walkToPos->x = 107; + } else if (mousePos.y <= 122) { + *panel = 8; + interimPos->y = 122; + walkToPos->x = 107; + } else { + *panel = 12; + interimPos->y = 138; + walkToPos->x = 107; + } + } else if (mousePos.x <= 159) { + interimPos->x = 149; + if (mousePos.y <= 90) { + *panel = 1; + interimPos->y = 90; + walkToPos->x = 127; + } else if (mousePos.y <= 106) { + *panel = 5; + interimPos->y = 106; + walkToPos->x = 127; + } else if (mousePos.y <= 122) { + *panel = 9; + interimPos->y = 122; + walkToPos->x = 127; + } else { + *panel = 13; + interimPos->y = 138; + walkToPos->x = 127; + } + } else if (mousePos.x <= 179) { + interimPos->x = 169; + if (mousePos.y <= 90) { + *panel = 2; + interimPos->y = 90; + walkToPos->x = 147; + } else if (mousePos.y <= 106) { + *panel = 6; + interimPos->y = 106; + walkToPos->x = 147; + } else if (mousePos.y <= 122) { + *panel = 10; + interimPos->y = 122; + walkToPos->x = 147; + } else { + *panel = 14; + interimPos->y = 138; + walkToPos->x = 147; + } + } else if (mousePos.x <= 199) { + interimPos->x = 189; + if (mousePos.y <= 90) { + *panel = 3; + interimPos->y = 90; + walkToPos->x = 167; + } else if (mousePos.y <= 106) { + *panel = 7; + interimPos->y = 106; + walkToPos->x = 167; + } else if (mousePos.y <= 122) { + *panel = 11; + interimPos->y = 122; + walkToPos->x = 167; + } else { + *panel = 15; + interimPos->y = 138; + walkToPos->x = 167; + } + } +} + +void Scene502::handlePanelAnimation() { + switch (_game._trigger) { + case 110: + _vm->_sound->command(65); + _scene->deleteSequence(_puzzleSequences[_panelPushedNum]); + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _scene->_sequences.addTimer(5, 111); + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _scene->_sequences.addTimer(5, 111); + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _scene->_sequences.addTimer(5, 111); + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, _puzzleSprites[_panelPushedNum] - 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _scene->_sequences.addTimer(5, 111); + break; + } + break; + + case 111: + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[11]); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->deleteSequence(_globals._sequenceIndexes[12]); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->deleteSequence(_globals._sequenceIndexes[13]); + break; + + default: + _scene->deleteSequence(_globals._sequenceIndexes[14]); + break; + } + + _globals._sequenceIndexes[16] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[16], false, 5, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[16], 14); + _scene->_sequences.setPosition(_globals._sequenceIndexes[16], _nextPos); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[16], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[16], SEQUENCE_TRIGGER_EXPIRE, 0, 112); + break; + + case 112: { + int idx = _globals._sequenceIndexes[16]; + int newSprId = _puzzleSprites[_panelPushedNum] + 4; + + switch (_panelPushedNum) { + case 0: + case 4: + case 8: + case 12: + if (newSprId > 12) + newSprId = 3; + break; + + case 1: + case 5: + case 9: + case 13: + if (newSprId > 24) + newSprId = 15; + break; + + case 2: + case 6: + case 10: + case 14: + if (newSprId > 36) + newSprId = 27; + break; + + default: + if (newSprId > 48) + newSprId = 39; + break; + } + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[11], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[13], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_SEQ, idx); + _scene->_sequences.addTimer(5, 113); + break; + } + } + break; + + case 113: { + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _scene->deleteSequence(_globals._sequenceIndexes[11]); + break; + + case 4: + case 5: + case 6: + case 7: + _scene->deleteSequence(_globals._sequenceIndexes[12]); + break; + + case 8: + case 9: + case 10: + case 11: + _scene->deleteSequence(_globals._sequenceIndexes[13]); + break; + + default: + _scene->deleteSequence(_globals._sequenceIndexes[14]); + break; + } + + int newSprId = _puzzleSprites[_panelPushedNum] + 3; + + switch (_panelPushedNum) { + case 0: + case 4: + case 8: + case 12: + if (newSprId > 12) + newSprId = 2; + break; + + case 1: + case 5: + case 9: + case 13: + if (newSprId > 24) + newSprId = 14; + break; + + case 2: + case 6: + case 10: + case 14: + if (newSprId > 36) + newSprId = 26; + break; + + default: + if (newSprId > 48) + newSprId = 38; + break; + } + _puzzleSprites[_panelPushedNum] = newSprId; + ++_puzzlePictures[_panelPushedNum]; + if (_puzzlePictures[_panelPushedNum] >= 5) + _puzzlePictures[_panelPushedNum] = 1; + + switch (_panelPushedNum) { + case 0: + case 1: + case 2: + case 3: + _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[11]; + break; + + case 4: + case 5: + case 6: + case 7: + _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[12]; + break; + + case 8: + case 9: + case 10: + case 11: + _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[13]; + break; + + default: + _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, newSprId); + _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 14); + _puzzleSequences[_panelPushedNum] = _globals._sequenceIndexes[14]; + break; + } + + int puzzleSolvedFl = true; + for (int i = 0; i < 16; i++) { + if (_puzzlePictures[i] != 1) + puzzleSolvedFl = false; + } + + if (puzzleSolvedFl && !_trapDoorHotspotEnabled) { + _trapDoorHotspotEnabled = true; + _scene->deleteSequence(_globals._sequenceIndexes[6]); + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 80); + } + } + break; + + default: + break; + } +} + +/*------------------------------------------------------------------------*/ + +Scene504::Scene504(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _playingMusicFl = false; + _chairDialogDoneFl = false; + _fireBreathFl = false; + + _songNum = -1; + _input3Count = -1; + _playCount = -1; + _listenStatus = -1; + _listenFrame = -1; + _chairStatus = -1; + _chairFrame = -1; + _playStatus = -1; + _playFrame = -1; + _phantomStatus = -1; + _phantomFrame = -1; + _christineTalkCount = -1; + _deathCounter = -1; +} + +void Scene504::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_anim3ActvFl); + s.syncAsByte(_anim4ActvFl); + s.syncAsByte(_anim5ActvFl); + s.syncAsByte(_playingMusicFl); + s.syncAsByte(_chairDialogDoneFl); + s.syncAsByte(_fireBreathFl); + + s.syncAsSint16LE(_songNum); + s.syncAsSint16LE(_input3Count); + s.syncAsSint16LE(_playCount); + s.syncAsSint16LE(_listenStatus); + s.syncAsSint16LE(_listenFrame); + s.syncAsSint16LE(_chairStatus); + s.syncAsSint16LE(_chairFrame); + s.syncAsSint16LE(_playStatus); + s.syncAsSint16LE(_playFrame); + s.syncAsSint16LE(_phantomStatus); + s.syncAsSint16LE(_phantomFrame); + s.syncAsSint16LE(_christineTalkCount); + s.syncAsSint16LE(_deathCounter); +} + +void Scene504::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_PHANTOM); + _scene->addActiveVocab(NOUN_CHRISTINE); +} + +void Scene504::enter() { + _vm->_disableFastwalk = true; + + _input3Count = 0; + _deathCounter = 0; + _anim2ActvFl = false; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _playCount = 0; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim3ActvFl = false; + _anim4ActvFl = false; + _anim5ActvFl = false; + _playingMusicFl = false; + _fireBreathFl = false; + _chairDialogDoneFl = false; + _songNum = 0; + _phantomStatus = 0; + } + + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + + if (!_globals[kRightDoorIsOpen504]) { + _vm->_gameConv->load(19); + _vm->_gameConv->load(27); + } else + _vm->_gameConv->load(21); + + _vm->_gameConv->load(26); + + _globals._spriteIndexes[14] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('x', 8)); + + if (!_game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _scene->_hotspots.activate(NOUN_MUSIC_SCORE, false); + } + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + if (_globals[kFightStatus] == 0) + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + + if ((_scene->_priorSceneId == 505) || ((_scene->_priorSceneId == 504) && _globals[kRightDoorIsOpen504])) { + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2)) { + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('x', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0)); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE); + + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13); + + _phantomStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim3ActvFl = true; + } else { + if (_globals[kFightStatus]) + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + + if (_globals[kCoffinStatus] != 2) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + } + + _game._player._playerPos = Common::Point(317, 115); + _game._player._facing = FACING_SOUTHWEST; + _game._player.walk(Common::Point(279, 121), FACING_SOUTHWEST); + + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + if (!_game._visitedScenes.exists(506) && (_globals[kCoffinStatus] == 2)) { + _scene->changeVariant(1); + + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _phantomStatus = 5; + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->setAnimFrame(_globals._animationIndexes[3], 79); + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } + } + } else if (_scene->_priorSceneId == 506) { + _game._player._playerPos = Common::Point(0, 109); + _game._player._facing = FACING_SOUTHEAST; + _game._player.walk(Common::Point(39, 118), FACING_SOUTHEAST); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } else if (_scene->_priorSceneId == 504) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _game._player._playerPos = Common::Point(147, 131); + _game._player._facing = FACING_EAST; + } else if ((_scene->_priorSceneId == 502) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('t', 1), 60); + _game._player._stepEnabled = false; + _game._player._visible = false; + _game._player._playerPos = Common::Point(147, 131); + _game._player._facing = FACING_EAST; + } + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (!_globals[kRightDoorIsOpen504]) { + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + } + + if (_vm->_gameConv->restoreRunning() == 19) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67); + _anim0ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _game._player._playerPos = Common::Point(286, 120); + _game._player._facing = FACING_EAST; + _listenStatus = 0; + _scene->setAnimFrame(_globals._animationIndexes[0], 8); + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + } else if (_vm->_gameConv->restoreRunning() == 27) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100); + + _scene->setAnimFrame(_globals._animationIndexes[1], 22); + _game._player._stepEnabled = false; + _game._player._visible = false; + _playingMusicFl = false; + _anim1ActvFl = true; + _playStatus = 0; + _vm->_gameConv->run(27); + } else if ((_globals[kFightStatus] <= 1) && (_globals[kCoffinStatus] == 2)) { + if ((_phantomStatus == 1) || (_phantomStatus == 2)) { + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 5)); + _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('a', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 6), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 7), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_PHANTOM, VERB_LOOK_AT, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(-2, -2), FACING_NONE); + + if (_phantomStatus == 1) + _scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(109, 112)); + else if (_phantomStatus == 2) { + _scene->setAnimFrame(_globals._animationIndexes[3], _vm->getRandomNumber(148, 150)); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } + + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 8); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 13); + + _game._player._visible = false; + _anim3ActvFl = true; + + if (_vm->_gameConv->restoreRunning() == 21) { + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + } + } else if (_phantomStatus == 4) { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130); + _scene->setAnimFrame(_globals._animationIndexes[3], 159); + + _game._player._playerPos = Common::Point(130, 135); + _game._player._facing = FACING_NORTHEAST; + _game._player._visible = true; + _anim4ActvFl = true; + + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + } + } else if (_globals[kFightStatus] == 2) { + if (!_game._visitedScenes.exists(506)) { + _scene->changeVariant(1); + + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACERAL", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEXDFR",PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*FACEPHN", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _phantomStatus = 5; + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->setAnimFrame(_globals._animationIndexes[3], 79); + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } else { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + } + } else { + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + if (!_globals[kHeListened]) + _scene->_sequences.addTimer(30, 62); + } + } + + sceneEntrySound(); +} + +void Scene504::step() { + if (_anim0ActvFl) + handleListenAnimation(); + + if (_anim1ActvFl) + handleOrganAnimation(); + + if (_anim2ActvFl) + handleChairAnimation(); + + if (_anim3ActvFl) + handlePhantomAnimation1(); + + if (_anim4ActvFl) + handlePhantomAnimation2(); + + if (_anim5ActvFl) + handlePhantomAnimation3(); + + if (_game._trigger == 120) { + _game._player._stepEnabled = false; + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(1); + _globals[kFightStatus] = 1; + } + + if (_game._trigger == 60) { + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100); + _scene->_sequences.addTimer(30, 61); + } + + if (_game._trigger == 61) { + _game._player._stepEnabled = true; + _scene->_sequences.addTimer(60, 62); + } + + if (_game._trigger == 62) { + _globals[kHeListened] = true; + _game._player._stepEnabled = false; + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + } + + if (_game._trigger == 80) { + _vm->_sound->command(73); + _globals[kRightDoorIsOpen504] = true; + _scene->deleteSequence(_globals._sequenceIndexes[2]); + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + } + + if (_game._trigger == 90) { + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 91); + } + + if (_game._trigger == 91) { + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 92); + } + + if (_game._trigger == 92) + _fireBreathFl = true; + + if (_fireBreathFl) { + _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -2); + _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); + _fireBreathFl = false; + } + + if (_game._trigger == 130) { + _scene->freeAnimation(_globals._animationIndexes[3]); + _scene->_sprites.remove(_globals._spriteIndexes[12]); + + _anim4ActvFl = false; + _anim5ActvFl = true; + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + _scene->changeVariant(1); + + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 3), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(66, 119), FACING_NORTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 0); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 1); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[3], 4); + } + + if (_game._trigger == 67) { + _game._player._stepEnabled = true; + _game._player._visible = true; + _anim0ActvFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + } + + if (_game._trigger == 136) + _scene->_nextSceneId = 506; + + if (_game._trigger == 100) { + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._playerPos = Common::Point(156, 114); + _game._player._visible = true; + _anim1ActvFl = false; + _game._player.resetFacing(FACING_EAST); + _scene->_sequences.addTimer(10, 101); + } + + if (_game._trigger == 101) { + _game._player._stepEnabled = true; + _scene->_sprites.remove(_globals._spriteIndexes[5]); + _scene->_sprites.remove(_globals._spriteIndexes[4]); + } +} + +void Scene504::actions() { + if (_vm->_gameConv->activeConvId() == 26) { + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_SIT_IN, NOUN_LARGE_CHAIR)) { + if (!_anim2ActvFl) { + _chairStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim2ActvFl = true; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('c', 1), 0); + _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); + } else + _vm->_dialogs->show(50436); + _action._inProgress = false; + return; + } + + if (_game._trigger == 95) { + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 67); + _listenStatus = 0; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim0ActvFl = true; + _globals[kHeListened] = true; + _vm->_gameConv->run(19); + _vm->_gameConv->exportValue(_game._difficulty); + _action._inProgress = false; + return; + } + + if (_game._trigger == 67) { + _game._player._stepEnabled = true; + _game._player._visible = true; + _anim0ActvFl = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->activeConvId() == 19) { + handleListenConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->activeConvId() == 27) { + handlePlayConversation(); + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->activeConvId() == 21) { + handleFightConversation(); + _action._inProgress = false; + return; + } + + if (_game._trigger == 100) { + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + _game._player._playerPos = Common::Point(156, 114); + _game._player._visible = true; + _anim1ActvFl = false; + _game._player.resetFacing(FACING_EAST); + _scene->_sequences.addTimer(10, 101); + _action._inProgress = false; + return; + } + + if (_game._trigger == 101) { + _game._player._stepEnabled = true; + _scene->_sprites.remove(_globals._spriteIndexes[5]); + _scene->_sprites.remove(_globals._spriteIndexes[4]); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_SIT_ON, NOUN_ORGAN_BENCH)) { + if (_globals[kRightDoorIsOpen504]) + _vm->_dialogs->show(50427); + else { + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 4), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('o', 1), 100); + _game._player._stepEnabled = false; + _game._player._visible = false; + _playingMusicFl = false; + _anim1ActvFl = true; + _playStatus = 0; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) { + if (_globals[kRightDoorIsOpen504]) { + if (_vm->_gameConv->activeConvId() == 26) + _vm->_gameConv->stop(); + + _scene->_nextSceneId = 505; + } else + _vm->_dialogs->show(50418); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + if (_globals[kFightStatus]) { + if (_game._visitedScenes.exists(506)) + _scene->_nextSceneId = 506; + else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE)) + _vm->_dialogs->show(50425); + else { + _phantomStatus = 6; + _game._player._stepEnabled = false; + } + } else + _vm->_dialogs->show(50418); + + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_MUSIC_SCORE)) { + switch (_game._trigger) { + case (0): + if (_game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _globals[kPlayerScore] += 5; + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[14] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[14], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[14], 1, 4); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[14], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[14], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + _action._inProgress = false; + return; + } + break; + + case 1: + _globals._sequenceIndexes[15] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[15], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[15], 14); + _scene->_hotspots.activate(NOUN_MUSIC_SCORE, false); + _game._objects.addToInventory(OBJ_MUSIC_SCORE); + _vm->_sound->command(26); + _action._inProgress = false; + return; + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[14]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + _action._inProgress = false; + return; + break; + + case 3: + _vm->_dialogs->showItem(OBJ_MUSIC_SCORE, 820, 0); + _game._player._stepEnabled = true; + _action._inProgress = false; + return; + break; + + default: + break; + } + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50410); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50411); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50412); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ORGAN)) { + _vm->_dialogs->show(50413); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_ORGAN_BENCH)) { + _vm->_dialogs->show(50414); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_MUSIC_SCORE) && _game._objects.isInRoom(OBJ_MUSIC_SCORE)) { + _vm->_dialogs->show(50415); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LEFT_DOOR)) { + _vm->_dialogs->show(50416); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RIGHT_DOOR)) { + _vm->_dialogs->show(_globals[kRightDoorIsOpen504] ? 50434 : 50417); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TABLE)) { + _vm->_dialogs->show(50419); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50420); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LARGE_CHAIR)) { + _vm->_dialogs->show(50422); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show(_globals[kFightStatus] ? 50426 : 50429); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_PHANTOM)) { + _vm->_dialogs->show(50428); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_OPEN, NOUN_TRAP_DOOR)) { + _vm->_dialogs->show(50421); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_RIGHT_DOOR) && !_globals[kRightDoorIsOpen504]) { + _vm->_dialogs->show(50433); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_CLOSE) && _action.isObject(NOUN_LEFT_DOOR) && !_globals[kFightStatus] && !_game._visitedScenes.exists(506)) { + _vm->_dialogs->show(50433); + _action._inProgress = false; + return; + } + + if (_anim3ActvFl && (_action.isAction(VERB_TAKE, NOUN_SWORD) || _action.isAction(VERB_ATTACK, NOUN_PHANTOM))) { + _game._player._stepEnabled = false; + _input3Count = 0; + _phantomStatus = 4; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(0); + _phantomStatus = 7; + _christineTalkCount = 0; + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) { + _vm->_dialogs->show(50431); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50435); + _action._inProgress = false; + return; + } +} + +void Scene504::preActions() { + if (_action.isAction(VERB_WALK_THROUGH, NOUN_RIGHT_DOOR) || _action.isAction(VERB_OPEN, NOUN_RIGHT_DOOR)) { + if (_globals[kRightDoorIsOpen504]) { + if ((_globals[kFightStatus] == 2) && !_game._visitedScenes.exists(506)) { + switch (_game._trigger) { + case 0: + _game._player.walk(Common::Point(317, 115), FACING_NORTHEAST); + _game._player._readyToWalk = false; + _game._player._needToWalk = false; + _game._player._stepEnabled = false; + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + _scene->_sequences.addTimer(6, 1); + break; + + case 1: + if (_vm->_gameConv->activeConvId() >= 0) + _scene->_sequences.addTimer(6, 1); + else { + _game._player._stepEnabled = true; + _action._inProgress = true; + _game._player._needToWalk = true; + _game._player._readyToWalk = true; + } + break; + + default: + break; + } + } else + _game._player.walk(Common::Point(317, 115), FACING_NORTHEAST); + } else if (_globals[kHeListened] || (_globals[kFightStatus] == 0)) + _game._player.walk(Common::Point(286, 120), FACING_NORTHEAST); + } + + if (_anim2ActvFl && !_action.isAction(VERB_SIT_IN) && _game._player._needToWalk) { + _chairStatus = 1; + _game._player._stepEnabled = false; + _game._player._readyToWalk = false; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_LEFT_DOOR) || _action.isAction(VERB_OPEN, NOUN_LEFT_DOOR)) { + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506)) { + _vm->_dialogs->show(50432); + _game._player.cancelCommand(); + return; + } else if (_game._visitedScenes.exists(506)) + _game._player.walk(Common::Point(0, 109), FACING_NORTHWEST); + else if (!_game._objects.isInInventory(OBJ_MUSIC_SCORE) || (_globals[kFightStatus] == 0)) + _game._player.walk(Common::Point(33, 116), FACING_NORTHWEST); + } + + if ((_globals[kFightStatus] == 0) && (_globals[kCoffinStatus] == 2) && !_game._visitedScenes.exists(506) + && !_action.isAction(VERB_LOOK) && !_action.isAction(VERB_LOOK_AT) && !_action.isAction(VERB_ATTACK) + && !_action.isAction(VERB_TAKE, NOUN_SWORD) && !_action.isAction(VERB_TALK_TO, NOUN_PHANTOM)) { + _vm->_dialogs->show(50430); + _game._player.cancelCommand(); + } +} + +void Scene504::handleListenAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == _listenFrame) + return; + + _listenFrame = curFrame; + int resetFrame = -1; + + switch (_listenFrame) { + case 8: + _vm->_gameConv->release(); + break; + + case 9: + resetFrame = (_listenStatus == 0) ? 8 : 9; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _listenFrame = resetFrame; + } +} + +void Scene504::handleOrganAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + if (curFrame == _playFrame) + return; + + _playFrame = curFrame; + int resetFrame = -1; + + switch (_playFrame) { + case 22: + _game._player._stepEnabled = true; + _vm->_gameConv->run(27); + break; + + case 23: + if (_playStatus == 0) + resetFrame = 22; + else { + _game._player._stepEnabled = false; + if (_songNum == 5) { + _playingMusicFl = false; + _fireBreathFl = false; + resetFrame = 104; + } + } + break; + + case 28: + if (!_playingMusicFl) { + _playingMusicFl = true; + _fireBreathFl = true; + _game._player._stepEnabled = false; + + switch (_songNum) { + case 1: + _vm->_sound->command(34); + break; + + case 2: + _vm->_sound->command(37); + break; + + case 3: + _vm->_sound->command(35); + break; + + case 4: + _vm->_sound->command(36); + break; + + default: + break; + } + } + break; + + case 69: + if ((_globals[kRightDoorIsOpen504]) && (_playCount >= 2)) { + _playCount = 0; + resetFrame = 102; + _vm->_sound->command(2); + _vm->_sound->command(16); + } else if (_songNum != _globals[kMusicSelected]) { + _vm->_sound->command(2); + _fireBreathFl = true; + resetFrame = 75; + } else { + resetFrame = 25; + ++_playCount; + if (!_globals[kRightDoorIsOpen504]) { + _scene->_sequences.addTimer(1, 80); + _globals[kPlayerScore] += 5; + } + } + break; + + case 76: + _scene->playSpeech(7); + break; + + case 90: + _vm->_sound->command(27); + break; + + case 102: + ++_deathCounter; + if (_deathCounter >= 17) + _scene->_reloadSceneFlag = true; + else + resetFrame = 101; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _playFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation1() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 41: + _vm->_gameConv->run(21); + _vm->_gameConv->exportValue(_game._objects.isInInventory(OBJ_MUSIC_SCORE)); + _vm->_gameConv->exportValue(0); + break; + + case 52: + case 53: + case 54: + case 55: + resetFrame = (_phantomStatus == 0) ? _vm->getRandomNumber(51, 54) : 55; + break; + + case 78: + _vm->_gameConv->release(); + break; + + case 110: + case 111: + case 112: + case 113: + resetFrame = (_phantomStatus == 1) ? _vm->getRandomNumber(109, 112) : 113; + break; + + case 142: + _scene->drawToBackground(_globals._spriteIndexes[13], 1, Common::Point(-32000, -32000), 0, 100); + break; + + case 143: + _game._player._stepEnabled = true; + break; + + case 149: + case 150: + case 151: + ++_input3Count; + + if (_phantomStatus == 4) { + _game._player._stepEnabled = false; + resetFrame = 200; + } else if (_input3Count >= 9) { + _game._player._stepEnabled = false; + resetFrame = 151; + } else if (_phantomStatus == 2) + resetFrame = _vm->getRandomNumber(148, 150); + break; + + case 169: + _vm->_sound->command(1); + _scene->playSpeech(7); + break; + + case 180: + _vm->_sound->command(27); + break; + + case 187: + _deathCounter = 0; + break; + + case 189: + ++_deathCounter; + if (_deathCounter >= 29) + _scene->_reloadSceneFlag = true; + else + resetFrame = 188; + break; + + case 227: + + _scene->freeAnimation(_globals._animationIndexes[3]); + _scene->_sprites.remove(_globals._spriteIndexes[9]); + _scene->_sprites.remove(_globals._spriteIndexes[8]); + _scene->_sprites.remove(_globals._spriteIndexes[7]); + _scene->_sprites.remove(_globals._spriteIndexes[10]); + _scene->_sprites.remove(_globals._spriteIndexes[11]); + + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 8), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('p', 2), 130); + + _scene->setAnimFrame(_globals._animationIndexes[3], 27); + resetFrame = -1; + _anim3ActvFl = false; + _anim4ActvFl = true; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation2() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 78: + _scene->playSpeech(9); + break; + + case 119: + _game._player._playerPos = Common::Point(114, 137); + _game._player._facing = FACING_WEST; + _game._player._visible = true; + _globals[kPlayerScore] += 5; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[3]); + _game._player.walk(Common::Point(130, 135), FACING_NORTHEAST); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _game._player.setWalkTrigger(120); + _vm->_sound->command(1); + break; + + case 150: + _vm->_sound->command(16); + break; + + case 160: + switch (_playStatus) { + case 5: + resetFrame = 164; + break; + + case 7: + resetFrame = 160; + break; + + default: + resetFrame = 159; + break; + } + break; + + case 161: + case 162: + case 163: + case 164: + resetFrame = (_phantomStatus == 5) ? 159 : _vm->getRandomNumber(160, 162); + + ++_christineTalkCount; + if (_christineTalkCount > 10) { + resetFrame = 159; + if (_phantomStatus != 5) + _phantomStatus = 4; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handlePhantomAnimation3() { + int curFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); + if (curFrame == _phantomFrame) + return; + + _phantomFrame = curFrame; + int resetFrame = -1; + + switch (_phantomFrame) { + case 58: + _game._player._stepEnabled = true; + break; + + case 80: + if (_phantomStatus == 7) + resetFrame = 116; + else if (_phantomStatus != 6) + resetFrame = 79; + break; + + case 115: + _game._player.walk(Common::Point(0, 109), FACING_NORTHWEST); + _game._player.setWalkTrigger(136); + break; + + case 116: + resetFrame = 115; + break; + + case 117: + case 118: + case 119: + resetFrame = _vm->getRandomNumber(116, 118); + ++_christineTalkCount; + if (_christineTalkCount > 10) { + resetFrame = 79; + if (_phantomStatus != 6) + _phantomStatus = 5; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); + _phantomFrame = resetFrame; + } +} + +void Scene504::handleChairAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + if (curFrame == _chairFrame) + return; + + _chairFrame = curFrame; + int resetFrame = -1; + + switch (_chairFrame) { + case 24: + _game._player._stepEnabled = true; + break; + + case 25: + case 26: + case 30: + case 31: + if (!_chairDialogDoneFl) { + _chairDialogDoneFl = true; + _vm->_dialogs->show(50424); + } + + if (_chairStatus == 0) { + if (_vm->getRandomNumber(1,5) == 1) + resetFrame = _vm->getRandomNumber(24, 30); + else + resetFrame = _chairFrame - 1; + } else + resetFrame = 31; + break; + + case 47: + resetFrame = -1; + _game._player._stepEnabled = true; + _game._player._visible = true; + _game._player._readyToWalk = true; + _anim2ActvFl = false; + _chairDialogDoneFl = false; + _scene->freeAnimation(_globals._animationIndexes[2]); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _chairFrame = resetFrame; + } +} + +void Scene504::handleListenConversation() { + if ((_action._activeAction._verbId == 2) && !_game._trigger) { + _game._player.walk(Common::Point(286, 120), FACING_EAST); + _game._player.setWalkTrigger(95); + } + + if (_action._activeAction._verbId == 12) + _listenStatus = 1; +} + +void Scene504::handlePlayConversation() { + switch (_action._activeAction._verbId) { + case 2: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + _songNum = 1; + break; + + case 3: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + _songNum = 2; + break; + + case 4: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + _songNum = 3; + break; + + case 5: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + _songNum = 4; + break; + + case 6: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + _songNum = 5; + break; + + case 8: + _vm->_gameConv->setStartNode(1); + _vm->_gameConv->stop(); + _playStatus = 1; + break; + + default: + break; + } +} + +void Scene504::handleFightConversation() { + switch (_action._activeAction._verbId) { + case 3: + _vm->_gameConv->hold(); + _phantomStatus = 1; + break; + + case 8: + _phantomStatus = 2; + break; + + case 10: + case 11: + case 12: + case 15: + _vm->_gameConv->setInterlocutorTrigger(145); + break; + + case 14: + case 17: + _phantomStatus = 5; + _globals[kFightStatus] = 2; + break; + + default: + break; + } + + if ((_game._trigger == 145) && (_phantomStatus != 5)) { + _phantomStatus = 7; + _christineTalkCount = 0; + } +} + +/*------------------------------------------------------------------------*/ + +Scene505::Scene505(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _checkFrame106 = false; + _leaveRoomFl = false; + _partedFl = false; + + _raoulStatus = -1; + _raoulFrame = -1; + _raoulCount = -1; + _bothStatus = -1; + _bothFrame = -1; + _bothCount = -1; + _partStatus = -1; + _partFrame = -1; + _partCount = -1; +} + +void Scene505::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_anim1ActvFl); + s.syncAsByte(_anim2ActvFl); + s.syncAsByte(_checkFrame106); + s.syncAsByte(_leaveRoomFl); + s.syncAsByte(_partedFl); + + s.syncAsSint16LE(_raoulStatus); + s.syncAsSint16LE(_raoulFrame); + s.syncAsSint16LE(_raoulCount); + s.syncAsSint16LE(_bothStatus); + s.syncAsSint16LE(_bothFrame); + s.syncAsSint16LE(_bothCount); + s.syncAsSint16LE(_partStatus); + s.syncAsSint16LE(_partFrame); + s.syncAsSint16LE(_partCount); +} + +void Scene505::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + if ((_globals[kCoffinStatus] == 2) && (!_globals[kChrisLeft505])) + _scene->_variant = 1; + + _scene->addActiveVocab(NOUN_CHRISTINE); +} + +void Scene505::enter() { + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _partedFl = false; + _leaveRoomFl = false; + _anim0ActvFl = false; + _anim1ActvFl = false; + _anim2ActvFl = false; + _checkFrame106 = false; + } + + _vm->_gameConv->load(20); + _scene->_hotspots.activateAtPos(NOUN_LID, false, Common::Point(216, 44)); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('x', 6)); + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 4)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 5)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 4)); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + if (_vm->_gameConv->restoreRunning() == 20) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + _scene->setAnimFrame(_globals._animationIndexes[1], 109); + _anim1ActvFl = true; + _game._player._visible = false; + _game._player._stepEnabled = false; + _bothStatus = 3; + + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } else if (_partedFl && (_globals[kFightStatus] == 0)) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + + _anim2ActvFl = true; + _bothStatus = 3; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(91, 108), FACING_NORTHWEST); + _scene->setAnimFrame(_globals._animationIndexes[2], 89); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 5); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 6); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[2], 7); + } else if (_globals[kFightStatus]) { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + } else { + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + _anim1ActvFl = true; + _bothStatus = 0; + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + } + } + + if ((_scene->_priorSceneId == 504) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(5, 87); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(58, 104), FACING_SOUTHEAST); + if (_globals[kCoffinStatus] != 2) { + _game._player.setWalkTrigger(70); + _anim1ActvFl = true; + _bothStatus = 0; + _scene->_hotspots.activate(NOUN_CHRISTINE, true); + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('c', 1), 65); + } else { + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _game._player._stepEnabled = true; + } + } + + sceneEntrySound(); +} + +void Scene505::step() { + if (_anim0ActvFl) + handleRaoulAnimation(); + + if (_anim1ActvFl) + handleBothanimation(); + + if (_anim2ActvFl) + handlePartedAnimation(); + + if (_game._trigger == 65) { + _scene->freeAnimation(_globals._animationIndexes[1]); + _vm->_sound->command(1); + _partedFl = true; + _anim2ActvFl = true; + _anim1ActvFl = false; + _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('b', 1), 0); + + int hotspotIDx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots.setPosition(hotspotIDx, Common::Point(91, 108), FACING_NORTHWEST); + _scene->_dynamicHotspots[hotspotIDx]._articleNumber = PREP_ON; + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 3); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 4); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 5); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 6); + _scene->setDynamicAnim(hotspotIDx, _globals._animationIndexes[2], 7); + } + + if (_game._trigger == 70) { + _game._player._stepEnabled = true; + if (!_game._visitedScenes._sceneRevisited) { + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + } + } +} + +void Scene505::actions() { + if (_game._trigger == 80) { + _bothStatus = 2; + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->activeConvId() == 20) { + handleCoffinDialog(); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + if (_globals[kCoffinStatus] != 2) + _vm->_dialogs->show(50536); + else { + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + _partStatus = 10; + _partCount = 0; + } + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && !_globals[kLookedAtSkullFace]) { + _vm->_dialogs->show(50539); + _action._inProgress = false; + return; + } + + if ((_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE)) || ((_action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_UNLOCK, NOUN_LID)) && _globals[kLookedAtSkullFace])) { + if (_globals[kCoffinStatus] == 0) { + switch (_game._trigger) { + case (0): + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 9, 95); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 96); + _action._inProgress = false; + return; + + case 95: + _vm->_sound->command(76); + _vm->_dialogs->show(50528); + _action._inProgress = false; + return; + + case 96: + _game._player._visible = true; + _game._player._stepEnabled = true; + _globals[kCoffinStatus] = 1; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); + _action._inProgress = false; + return; + + default: + break; + } + } else { + _vm->_dialogs->show(50534); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_PUSH, NOUN_SKULL) && (_scene->_customDest.x >= 19)) { + switch (_game._trigger) { + case 0: + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[0] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[0], false, 5, 2); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[0], true); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_SPRITE, 6, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + break; + + case 1: { + int sprIdx; + _vm->_sound->command(77); + if (_scene->_customDest.x <= 44) + sprIdx = _globals._spriteIndexes[4]; + else if (_scene->_customDest.x <= 58) + sprIdx = _globals._spriteIndexes[3]; + else if (_scene->_customDest.x <= 71) + sprIdx = _globals._spriteIndexes[2]; + else if (_scene->_customDest.x <= 84) { + sprIdx = _globals._spriteIndexes[1]; + if (_globals[kCoffinStatus] == 1) { + _bothStatus = 1; + _scene->_hotspots.activate(NOUN_LID, false); + _scene->_hotspots.activate(NOUN_CHRISTINE, false); + _scene->_hotspots.activateAtPos(NOUN_LID, true, Common::Point(216, 44)); + _scene->changeVariant(1); + } + } else if (_scene->_customDest.x <= 100) + sprIdx = _globals._spriteIndexes[5]; + else + sprIdx = _globals._spriteIndexes[6]; + + int skullSeqIdx = _scene->_sequences.startPingPongCycle(sprIdx, false, 5, 2); + _scene->_sequences.setAnimRange(skullSeqIdx, -1, -2); + _scene->_sequences.setDepth(skullSeqIdx, 1); + } + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[0]); + _game._player._visible = true; + _game._player._stepEnabled = true; + if (_bothStatus == 1) { + _game._player.walk(Common::Point(136, 126), FACING_EAST); + _game._player.setWalkTrigger(80); + _game._player._stepEnabled = false; + } + break; + + default: + break; + } + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR)) { + if (_anim2ActvFl) { + _leaveRoomFl = true; + _game._player._stepEnabled = false; + } else { + _globals[kChrisLeft505] = true; + _scene->_nextSceneId = 504; + } + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50510); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50511); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50512); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SARCOPHAGUS)) { + _vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50513 : 50514); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL_FACE)) { + _globals[kLookedAtSkullFace] = true; + _vm->_dialogs->show(50529); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + _vm->_dialogs->show(50519); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULL)) { + _vm->_dialogs->show((_scene->_customDest.x < 19) ? 50521 : 50520); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_SKULLS)) { + _vm->_dialogs->show(50521); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TOTEM)) { + _vm->_dialogs->show(50522); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DESK)) { + _vm->_dialogs->show(50523); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_POLE)) { + _vm->_dialogs->show(50524); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CURTAIN)) { + _vm->_dialogs->show(50525); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + _vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50530 : 50537); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_LID)) { + _vm->_dialogs->show((_globals[kCoffinStatus] == 2) ? 50531 : 50532); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_LOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_LOCK, NOUN_LID) || _action.isAction(VERB_LOCK, NOUN_SKULL_FACE)) { + _vm->_dialogs->show(50535); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_OPEN, NOUN_SARCOPHAGUS) || _action.isAction(VERB_OPEN, NOUN_LID)) { + if (_globals[kCoffinStatus] == 2) + _vm->_dialogs->show(50533); + else if (_globals[kCoffinStatus] == 1) + _vm->_dialogs->show(50518); + else + _vm->_dialogs->show(50515); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE) && (_globals[kCoffinStatus] != 2)) { + _vm->_dialogs->show(50538); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show((_globals[kCoffinStatus] <= 1) ? 50538 : 50540); + _action._inProgress = false; + } +} + +void Scene505::preActions() { + if ((_globals[kCoffinStatus] == 0) && (_action.isAction(VERB_UNLOCK, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_SARCOPHAGUS) || _action.isAction(VERB_PUT, NOUN_KEY, NOUN_SKULL_FACE) || _action.isAction(VERB_UNLOCK, NOUN_LID))) { + if (_action.isObject(NOUN_SKULL_FACE) || _globals[kLookedAtSkullFace]) + _game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST); + } + + if (_action.isObject(NOUN_SKULL_FACE) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player.walk(Common::Point(279, 150), FACING_SOUTHWEST); + + if (_action.isObject(NOUN_CURTAIN) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player._needToWalk = true; + + if (_action.isObject(NOUN_SKULL) && (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT))) + _game._player._needToWalk = true; +} + +void Scene505::handleCoffinDialog() { + int interlocutorFl = false; + int heroFl = false; + + switch (_action._activeAction._verbId) { + case 8: + heroFl = true; + interlocutorFl = true; + _bothStatus = 6; + break; + + case 14: + heroFl = true; + interlocutorFl = true; + if (!_checkFrame106) + _vm->_gameConv->hold(); + break; + + case 17: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _raoulStatus = 2; + } + break; + + case 20: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _game._player.walk(Common::Point(244, 130), FACING_SOUTHWEST); + _game._player.setWalkTrigger(71); + } + break; + + case 22: + heroFl = true; + interlocutorFl = true; + if (!_game._trigger) { + _vm->_gameConv->hold(); + _bothStatus = 7; + } + break; + + default: + break; + } + + switch (_game._trigger) { + case 70: + case 76: + _vm->_gameConv->release(); + break; + + case 71: + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 75); + _anim0ActvFl = true; + _raoulStatus = 0; + _raoulCount = 0; + _game._player._visible = false; + break; + + case 75: + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + _scene->_sequences.addTimer(10, 76); + break; + + case 85: + if ((_bothStatus != 6) && (_bothStatus != 0)) + _bothStatus = 5; + break; + + case 90: + if ((_bothStatus != 6) && (_bothStatus != 0)) + _bothStatus = 4; + break; + + default: + break; + } + + if (!heroFl) + _vm->_gameConv->setHeroTrigger(85); + + if (!interlocutorFl) + _vm->_gameConv->setInterlocutorTrigger(90); + + _bothCount = 0; +} + +void Scene505::handleRaoulAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == _raoulFrame) + return; + + _raoulFrame = curFrame; + int resetFrame = -1; + + switch (_raoulFrame) { + case 3: + _vm->_gameConv->release(); + break; + + case 4: + case 5: + case 6: + if (_raoulStatus == 0) { + resetFrame = _vm->getRandomNumber(3, 5); + ++_raoulCount; + if (_raoulCount > 20) { + _raoulStatus = 1; + resetFrame = 3; + } + break; + } + + if (_raoulStatus == 1) + resetFrame = 3; + + if (_raoulStatus == 2) + resetFrame = 6; + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); + _raoulFrame = resetFrame; + } +} + +void Scene505::handleBothanimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); + if (curFrame == _bothFrame) + return; + + _bothFrame = curFrame; + int resetFrame = -1; + + switch (_bothFrame) { + case 1: + case 20: + case 39: + if (_bothStatus == 0) { + if (_vm->getRandomNumber(1, 35) == 1) { + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 1; + else + resetFrame = 20; + } else + resetFrame = 0; + } else if (_bothStatus == 1) + resetFrame = 39; + else + resetFrame = 0; + break; + + case 14: + if (_vm->getRandomNumber(1, 3) == 1) + resetFrame = 8; + break; + + case 32: + if (_vm->getRandomNumber(1, 2) == 1) + resetFrame = 28; + break; + + case 41: + _vm->_sound->command(39); + break; + + case 51: + _globals._sequenceIndexes[7] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[7], false, 12); + _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); + _globals[kCoffinStatus] = 2; + break; + + case 66: + _game._player._stepEnabled = false; + _vm->_gameConv->run(20); + _vm->_gameConv->exportPointer(&_globals[kPlayerScore]); + break; + + case 67: + if (_bothStatus == 1) + resetFrame = 66; + break; + + case 68: + _game._player._visible = false; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + case 106: + _checkFrame106 = true; + _vm->_gameConv->release(); + break; + + case 109: + case 130: + _vm->_gameConv->release(); + break; + + case 110: + case 111: + case 112: + case 113: + case 114: + case 115: + case 131: + switch (_bothStatus) { + case 4: + resetFrame = _vm->getRandomNumber(112, 114); + ++_bothCount; + if (_bothCount > 20) { + _bothStatus = 3; + resetFrame = 109; + } + break; + + case 5: + resetFrame = _vm->getRandomNumber(109, 111); + ++_bothCount; + if (_bothCount > 20) { + _bothStatus = 3; + resetFrame = 109; + } + break; + + case 6: + resetFrame = 131; + _bothStatus = 8; + _game._player._stepEnabled = false; + break; + + case 7: + resetFrame = 115; + _bothStatus = 3; + break; + + default: + resetFrame = 109; + break; + } + break; + + case 127: + _vm->_sound->command(26); + _game._objects.addToInventory(OBJ_WEDDING_RING); + _vm->_dialogs->showItem(OBJ_WEDDING_RING, 821, 0); + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); + _bothFrame = resetFrame; + } +} + +void Scene505::handlePartedAnimation() { + int curFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); + if (curFrame == _partFrame) + return; + + _partFrame = curFrame; + int resetFrame = -1; + + switch (_partFrame) { + case 20: + _vm->_sound->command(16); + break; + + case 25: + _game._player._playerPos = Common::Point(93, 133); + _game._player.resetFacing(FACING_WEST); + _game._player._visible = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[2]); + break; + + case 70: + _game._player._stepEnabled = true; + break; + + case 90: + if (_partStatus == 10) + resetFrame = 146; + else if (!_leaveRoomFl) + resetFrame = 89; + break; + + case 145: + _scene->_nextSceneId = 504; + break; + + case 147: + case 148: + case 149: + resetFrame = _vm->getRandomNumber(146, 148); + ++_partCount; + if (_partCount > 10) { + resetFrame = 89; + _partStatus = 8; + } + break; + + default: + break; + } + + if (resetFrame >= 0) { + _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); + _partFrame = resetFrame; + } +} + +/*------------------------------------------------------------------------*/ + +Scene506::Scene506(MADSEngine *vm) : Scene5xx(vm) { + _anim0ActvFl = false; + _skipFl = false; + _ascendingFl = false; +} + +void Scene506::synchronize(Common::Serializer &s) { + Scene5xx::synchronize(s); + + s.syncAsByte(_anim0ActvFl); + s.syncAsByte(_skipFl); + s.syncAsByte(_ascendingFl); +} + +void Scene506::setup() { + setPlayerSpritesPrefix(); + setAAName(); + + _scene->addActiveVocab(NOUN_CHRISTINE); + _scene->addActiveVocab(VERB_LOOK_AT); + + if (!_globals[kChristineIsInBoat]) + _scene->_variant = 1; +} + +void Scene506::enter() { + _vm->_disableFastwalk = true; + + if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { + _anim0ActvFl = false; + _skipFl = false; + _ascendingFl = false; + } + + _vm->_gameConv->load(26); + + _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0)); + _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 1)); + _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 2)); + _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 3)); + _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 0)); + _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1)); + _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0)); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 0), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9"); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_6", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_3", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + _globals._spriteIndexes[6] = _scene->_sprites.addSprites("*CHR_2", PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); + + if (_game._objects.isInRoom(OBJ_OAR)) { + _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14); + } else + _scene->_hotspots.activate(NOUN_OAR, false); + + _globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2); + + _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], -1, -2); + + _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0); + _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, -2); + + if (_scene->_priorSceneId == RETURNING_FROM_LOADING) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + if (!_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + } else if (_scene->_priorSceneId == 504) { + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + + if (_game._visitedScenes._sceneRevisited) { + _game._player._playerPos = Common::Point(189, 123); + _game._player._facing = FACING_SOUTHWEST; + _game._player._stepEnabled = false; + _game._player._visible = false; + + if (!_globals[kChristineIsInBoat]) { + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('r', 2), 95); + } else { + _game._player._playerPos = Common::Point(186, 122); + _game._player._facing = FACING_SOUTHWEST; + _game._player._stepEnabled = false; + _game._player._visible = false; + _anim0ActvFl = true; + _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 0); + int hotspotIdx = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0)); + _scene->_dynamicHotspots[hotspotIdx]._articleNumber = PREP_ON; + _scene->_dynamicHotspots.setPosition(hotspotIdx, Common::Point(79, 133), FACING_SOUTHWEST); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 2); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 3); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 4); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 5); + _scene->setDynamicAnim(hotspotIdx, _globals._animationIndexes[0], 6); + } + } else if ((_scene->_priorSceneId == 501) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { + _game._player._playerPos = Common::Point(0, 142); + _game._player._facing = FACING_EAST; + _game._player._stepEnabled = false; + _game._player.walk(Common::Point(23, 145), FACING_EAST); + _game._player.setWalkTrigger(60); + } + + sceneEntrySound(); +} + +void Scene506::step() { + switch (_game._trigger) { + case 60: + _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61); + break; + + case 61: + _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1); + _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14); + _game._player._stepEnabled = true; + break; + + case 95: + _game._player._visible = true; + _game._player._stepEnabled = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[1]); + break; + + default: + break; + } + + if (_anim0ActvFl) { + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if ((curFrame == 141) && !_skipFl) { + _game._player._visible = true; + _skipFl = true; + _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); + } + + if (curFrame == 240) + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + + if (curFrame == 300) + _scene->setAnimFrame(_globals._animationIndexes[0], 239); + + if (curFrame == 168) + _game._player._stepEnabled = true; + + if (curFrame == 289) + _scene->_nextSceneId = 501; + } + + if (_ascendingFl && (_vm->_gameConv->activeConvId() != 26)) { + _ascendingFl = false; + _game._player._stepEnabled = false; + } +} + +void Scene506::actions() { + if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(1); + _scene->setAnimFrame(_globals._animationIndexes[0], 290); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_OAR)) { + switch (_game._trigger) { + case (0): + if (_game._objects.isInRoom(OBJ_OAR)) { + _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.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 1); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); + } + break; + + case 1: + _scene->deleteSequence(_globals._sequenceIndexes[5]); + _scene->_hotspots.activate(NOUN_OAR, false); + _game._objects.addToInventory(OBJ_OAR); + _vm->_sound->command(26); + break; + + case 2: + _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); + _game._player._visible = true; + _scene->_sequences.addTimer(20, 3); + break; + + case 3: + _vm->_dialogs->showItem(OBJ_OAR, 824, 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)) { + if (_scene->_customDest.x < 150) { + 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.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 65); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 67); + break; + + case 65: + _scene->deleteSequence(_globals._sequenceIndexes[3]); + _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.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 66); + _vm->_sound->command(24); + break; + + case 66: + _game._player.walk(Common::Point(0, 142), FACING_WEST); + _game._player.setWalkTrigger(68); + break; + + case 67: + _game._player._visible = true; + break; + + case 68: + if (_globals[kChristineIsInBoat]) + _scene->_nextSceneId = 501; + else + _scene->setAnimFrame(_globals._animationIndexes[0], 241); + break; + + default: + break; + } + } else { + switch (_game._trigger) { + case (0): + if (!_globals[kChristineIsInBoat]) { + _vm->_gameConv->run(26); + _vm->_gameConv->exportValue(2); + int curFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); + if (curFrame == 240 || curFrame == 239) + _scene->setAnimFrame(_globals._animationIndexes[0], 290); + _ascendingFl = true; + } + _game._player._stepEnabled = false; + _game._player._visible = false; + _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 5, 1); + _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -1, -2); + _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[7], SYNC_PLAYER, 0); + _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 90); + break; + + case 90: + _vm->_gameConv->stop(); + _scene->_nextSceneId = 504; + break; + + default: + break; + } + } + _action._inProgress = false; + return; + } + + if (_vm->_gameConv->activeConvId() == 26) { + _action._inProgress = false; + return; + } + + if (_action._lookFlag) { + _vm->_dialogs->show(50610); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { + if (_action.isObject(NOUN_FLOOR)) { + _vm->_dialogs->show(50611); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_WALL)) { + _vm->_dialogs->show(50612); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_TORCH)) { + _vm->_dialogs->show(50613); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_COLUMN)) { + _vm->_dialogs->show(50614); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CEILING)) { + _vm->_dialogs->show(50615); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_RAMP)) { + _vm->_dialogs->show(50616); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_DOOR)) { + if (_scene->_customDest.x < 150) + _vm->_dialogs->show(50617); + else + _vm->_dialogs->show(50618); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_OAR) && _game._objects.isInRoom(OBJ_OAR)) { + _vm->_dialogs->show(50619); + _action._inProgress = false; + return; + } + + if (_action.isObject(NOUN_CHRISTINE)) { + if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() < 235) + _vm->_dialogs->show(50621); + else + _vm->_dialogs->show(50620); + _action._inProgress = false; + return; + } + } + + if (_action.isAction(VERB_TAKE, NOUN_TORCH)) { + _vm->_dialogs->show(50613); + _action._inProgress = false; + return; + } + + if (_action.isAction(VERB_TAKE, NOUN_CHRISTINE)) { + _vm->_dialogs->show(50622); + _action._inProgress = false; + } +} + +void Scene506::preActions() { + if (_action.isAction(VERB_UNLOCK, NOUN_DOOR) || _action.isAction(VERB_LOCK, NOUN_DOOR)) + _game._player.walk(Common::Point(33, 142), FACING_NORTHWEST); + + if (_action.isAction(VERB_OPEN, NOUN_DOOR)) { + if (_scene->_customDest.x < 150) + _game._player.walk(Common::Point(33, 142), FACING_NORTHWEST); + else + _game._player.walk(Common::Point(191, 118), FACING_EAST); + } +} + +/*------------------------------------------------------------------------*/ + +} // End of namespace Phantom +} // End of namespace MADS |