scummvm/engines/mads/phantom/phantom_scenes5.cpp
D G Turner e75722665d MADS: Fix Missing Default Switch Cases
These are flagged by GCC if -Wswitch-default is enabled.
2019-12-06 03:34:11 +00:00

4321 lines
130 KiB
C++

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