aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/phantom/phantom_scenes5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mads/phantom/phantom_scenes5.cpp')
-rw-r--r--engines/mads/phantom/phantom_scenes5.cpp4309
1 files changed, 4309 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..508f2b936d
--- /dev/null
+++ b/engines/mads/phantom/phantom_scenes5.cpp
@@ -0,0 +1,4309 @@
+/* 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->get(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->_running == 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->abortConv();
+ _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->_running >= 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() {
+ int puzzleSolvedFl = true;
+
+ 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;
+ }
+
+ 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->get(19);
+ _vm->_gameConv->get(27);
+ } else
+ _vm->_gameConv->get(21);
+
+ _vm->_gameConv->get(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->_running == 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->_running == 19) {
+ handleListenConversation();
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_vm->_gameConv->_running == 27) {
+ handlePlayConversation();
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_vm->_gameConv->_running == 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->_running == 26)
+ _vm->_gameConv->abortConv();
+
+ _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->_running >= 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->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _playStatus = 1;
+ _songNum = 1;
+ break;
+
+ case 3:
+ *_vm->_gameConv->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _playStatus = 1;
+ _songNum = 2;
+ break;
+
+ case 4:
+ *_vm->_gameConv->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _playStatus = 1;
+ _songNum = 3;
+ break;
+
+ case 5:
+ *_vm->_gameConv->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _playStatus = 1;
+ _songNum = 4;
+ break;
+
+ case 6:
+ *_vm->_gameConv->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _playStatus = 1;
+ _songNum = 5;
+ break;
+
+ case 8:
+ *_vm->_gameConv->_nextStartNode = 1;
+ _vm->_gameConv->abortConv();
+ _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->get(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->_running == 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->get(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->_running != 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->abortConv();
+ _scene->_nextSceneId = 504;
+ break;
+
+ default:
+ break;
+ }
+ }
+ _action._inProgress = false;
+ return;
+ }
+
+ if (_vm->_gameConv->_running == 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