scummvm/engines/mads/phantom/phantom_scenes3.cpp
2021-01-09 00:58:36 +02:00

2782 lines
75 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.
*
*/
#ifdef ENABLE_MADSV2
#include "mads/mads.h"
#include "mads/conversations.h"
#include "mads/phantom/phantom_scenes.h"
#include "mads/phantom/phantom_scenes3.h"
namespace MADS {
namespace Phantom {
void Scene3xx::setAAName() {
_game._aaName = Resources::formatAAName(_globals[kTempInterface]);
_vm->_palette->setEntry(254, 43, 47, 51);
}
void Scene3xx::sceneEntrySound() {
if (!_vm->_musicFlag)
return;
switch (_scene->_nextSceneId) {
case 303:
case 304:
case 305:
case 307:
case 308:
if (_globals[kKnockedOverHead])
_vm->_sound->command(33);
else
_vm->_sound->command(16);
break;
case 310:
case 320:
case 330:
case 340:
_vm->_sound->command(36);
break;
default:
if (_scene->_nextSceneId != 306)
_vm->_sound->command(16);
break;
}
}
void Scene3xx::setPlayerSpritesPrefix() {
_vm->_sound->command(5);
if ((_scene->_nextSceneId == 304) || (_scene->_nextSceneId == 305) || (_scene->_nextSceneId == 306) || (_scene->_nextSceneId == 310))
_game._player._spritesPrefix = "";
else {
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;
}
/*------------------------------------------------------------------------*/
Scene301::Scene301(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_skip1Fl = false;
_skip2Fl = false;
_lightingHotspotId = -1;
_sandbagHotspotId = -1;
}
void Scene301::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsByte(_skip1Fl);
s.syncAsByte(_skip2Fl);
s.syncAsSint16LE(_lightingHotspotId);
s.syncAsSint16LE(_sandbagHotspotId);
}
void Scene301::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene301::enter() {
_vm->_disableFastwalk = true;
_anim0ActvFl = false;
_skip2Fl = false;
_skip1Fl = false;
_scene->loadSpeech(6);
_scene->_hotspots.activate(NOUN_CABLE, false);
_scene->_hotspots.activate(NOUN_STOOL, false);
_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 0));
if (_globals[kCurrentYear] == 1993) {
_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1));
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', 0));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('z', 1));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('z', 2));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('z', 3));
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('z', 4));
_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('z', 5));
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('z', 6));
_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(50, 116, 50 + 19, 116 + 10));
_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(67, 129), FACING_NORTHWEST);
_lightingHotspotId = _scene->_dynamicHotspots.add(NOUN_LIGHTING_INSTRUMENT, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(126, 118, 126 + 29, 118 + 8));
_scene->_dynamicHotspots.setPosition(_lightingHotspotId, Common::Point(152, 129), FACING_NORTHWEST);
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 14);
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
_globals._sequenceIndexes[4] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[4], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 14);
_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 14);
_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
_scene->_hotspots.activate(NOUN_CABLE, true);
} else {
_sandbagHotspotId = _scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(464, 114, 464 + 11, 114 + 9));
_scene->_dynamicHotspots.setPosition(_sandbagHotspotId, Common::Point(475, 125), FACING_NORTHWEST);
_scene->_dynamicHotspots.add(NOUN_SANDBAG, VERB_LOOK_AT, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(468, 42, 468 + 6, 42 + 13));
_scene->_hotspots.activate(NOUN_STOOL, true);
_scene->_hotspots.activate(NOUN_BIG_PROP, false);
}
if (_scene->_priorSceneId == 302) {
_game._player.firstWalk(Common::Point(-20, 132), FACING_WEST, Common::Point(19, 132), FACING_EAST, true);
_scene->setCamera(Common::Point(0, 0));
} else if ((_scene->_priorSceneId == 106) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
_game._player._playerPos = Common::Point(568, 133);
_game._player._facing = FACING_WEST;
_scene->setCamera(Common::Point(320, 0));
}
if (!_game._visitedScenes._sceneRevisited) {
_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0));
_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
}
sceneEntrySound();
}
void Scene301::step() {
if ((_globals[kDoneBrieConv203] == 3) && (_scene->_posAdjust.x < 320) && (_game._player._playerPos.x < 350)) {
_game._player.cancelCommand();
_game._player.walk(Common::Point(256, 130), FACING_NORTHWEST);
_game._player.setWalkTrigger(60);
_globals[kDoneBrieConv203] = 0;
_game._player._stepEnabled = false;
}
if (_game._trigger == 60) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('p', 1), 0);
_anim0ActvFl = true;
_game._player._visible = false;
_globals[kPlayerScore] += 10;
_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
}
if (_anim0ActvFl && !_skip1Fl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 50) {
_scene->playSpeech(6);
_skip1Fl = true;
}
}
if (_anim0ActvFl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 61) {
_scene->setAnimFrame(_globals._animationIndexes[0], 60);
if (!_skip2Fl) {
_vm->_sound->command(1);
_scene->_sequences.addTimer(420, 70);
_skip2Fl = true;
}
}
}
if (_game._trigger == 70) {
_scene->_userInterface.noInventoryAnim();
// CHECKME: Not sure about the next function call
_scene->_userInterface.refresh();
_scene->_nextSceneId = 104;
}
if (_game._trigger == 64)
_scene->_sequences.addTimer(60, 65);
if (_game._trigger == 65)
_vm->_dialogs->show(30137);
}
void Scene301::actions() {
if (_action.isAction(VERB_CLIMB_DOWN, NOUN_CIRCULAR_STAIRCASE)) {
switch (_game._trigger) {
case 0:
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 1);
_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
break;
case 1:
_scene->_nextSceneId = 106;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30110);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_GRID)) {
_vm->_dialogs->show(30111);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30112);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SIDE_WALL)) {
_vm->_dialogs->show(30113);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BACK_WALL)) {
_vm->_dialogs->show(30114);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SUPPORT)) {
_vm->_dialogs->show(30115);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_ACT_CURTAIN)) {
_vm->_dialogs->show(30116);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HOUSE)) {
_vm->_dialogs->show(30117);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_OTHER_CATWALK)) {
_vm->_dialogs->show(30118);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRIDWORK)) {
_vm->_dialogs->show(30119);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BEAM_POSITION)) {
_vm->_dialogs->show(30120);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30121);
else
_vm->_dialogs->show(30122);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_TARP)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30123);
else
_vm->_dialogs->show(30140);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_COUNTERWEIGHT_SYSTEM)) {
_vm->_dialogs->show(30124);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
_vm->_dialogs->show(30125);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BATTEN)) {
_vm->_dialogs->show(30126);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_STOOL)) {
_vm->_dialogs->show(30127);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HEMP)) {
_vm->_dialogs->show(30128);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CIRCULAR_STAIRCASE)) {
_vm->_dialogs->show(30129);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATWALK_OVER_HOUSE)) {
_vm->_dialogs->show(30130);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_STAIRCASE_POST)) {
_vm->_dialogs->show(30131);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_RAILING)) {
_vm->_dialogs->show(30132);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CYCLORAMA)) {
_vm->_dialogs->show(30133);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BIG_PROP)) {
_vm->_dialogs->show(30134);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_PROSCENIUM_ARCH)) {
_vm->_dialogs->show(30135);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CABLE)) {
_vm->_dialogs->show(30136);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
_vm->_dialogs->show(30138);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
_vm->_dialogs->show(30141);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TAKE, NOUN_SANDBAG) && (_action._mainObjectSource == CAT_HOTSPOT)) {
_vm->_dialogs->show(30139);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TAKE, NOUN_TARP)) {
_vm->_dialogs->show(30142);
_action._inProgress = false;
return;
}
}
void Scene301::preActions() {
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK_OVER_HOUSE))
_game._player._walkOffScreenSceneId = 302;
}
/*------------------------------------------------------------------------*/
Scene302::Scene302(MADSEngine *vm) : Scene3xx(vm) {
}
void Scene302::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
}
void Scene302::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene302::enter() {
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
if (_game._objects.isInRoom(OBJ_BLUE_FRAME)) {
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
} else
_scene->_hotspots.activate(NOUN_BLUE_FRAME, false);
if (_globals[kCurrentYear] == 1993) {
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
}
if (_scene->_priorSceneId == 303)
_game._player.firstWalk(Common::Point(-20, 134), FACING_WEST, Common::Point(15, 134), FACING_EAST, true);
else if ((_scene->_priorSceneId == 301) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
_game._player.firstWalk(Common::Point(340, 134), FACING_WEST, Common::Point(297, 134), FACING_WEST, true);
sceneEntrySound();
}
void Scene302::step() {
}
void Scene302::actions() {
if (_action.isAction(VERB_TAKE, NOUN_BLUE_FRAME) && (_game._objects.isInRoom(OBJ_BLUE_FRAME) || _game._trigger)) {
switch (_game._trigger) {
case (0):
if (_globals[kCurrentYear] == 1881) {
int count = 0;
if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
++count;
if (_game._objects.isInInventory(OBJ_RED_FRAME))
++count;
if (_game._objects.isInInventory(OBJ_GREEN_FRAME))
++count;
if (count < 3)
_globals[kPlayerScore] += 5;
}
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], true, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
break;
case 1:
_scene->deleteSequence(_globals._sequenceIndexes[2]);
_scene->_hotspots.activate(NOUN_BLUE_FRAME, false);
_game._objects.addToInventory(OBJ_BLUE_FRAME);
_vm->_sound->command(26);
break;
case 2:
_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
_game._player._visible = true;
_scene->_sequences.addTimer(20, 3);
break;
case 3:
if (_globals[kCurrentYear] == 1881)
_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 844, 0);
else
_vm->_dialogs->showItem(OBJ_BLUE_FRAME, 817, 0);
_game._player._stepEnabled = true;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30210);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30211);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRID)) {
_vm->_dialogs->show(30212);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HEMP)) {
_vm->_dialogs->show(30213);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SIDE_WALL)) {
_vm->_dialogs->show(30214);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30215);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_RAILING)) {
_vm->_dialogs->show(30216);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BEAM_POSITION)) {
_vm->_dialogs->show(30217);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_LIGHTING_INSTRUMENT)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30218);
else
_vm->_dialogs->show(30219);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BLUE_FRAME) && _game._objects.isInRoom(OBJ_BLUE_FRAME)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30220);
else
_vm->_dialogs->show(30221);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SUPPORT)) {
_vm->_dialogs->show(30222);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_OTHER_CATWALK)) {
_vm->_dialogs->show(30223);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
_vm->_dialogs->show(30224);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
_vm->_dialogs->show(30141);
_action._inProgress = false;
return;
}
}
void Scene302::preActions() {
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
if (_scene->_customDest.x > 160)
_game._player._walkOffScreenSceneId = 301;
else
_game._player._walkOffScreenSceneId = 303;
}
}
/*------------------------------------------------------------------------*/
Scene303::Scene303(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_hempHotspotId = -1;
_skipFrameCheckFl = -1;
}
void Scene303::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsSint16LE(_hempHotspotId);
s.syncAsSint16LE(_skipFrameCheckFl);
}
void Scene303::setup() {
setPlayerSpritesPrefix();
setAAName();
_scene->addActiveVocab(NOUN_CHANDELIER_CABLE);
_scene->addActiveVocab(VERB_CLIMB_DOWN);
}
void Scene303::enter() {
_anim0ActvFl = false;
_skipFrameCheckFl = false;
if (_globals[kRightDoorIsOpen504])
_vm->_gameConv->load(26);
if (_globals[kCurrentYear] == 1993) {
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('z', -1));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
}
if ((_game._objects.isInRoom(OBJ_LARGE_NOTE)) && (_globals[kCurrentYear] == 1993)) {
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4);
} else
_scene->_hotspots.activate(NOUN_LARGE_NOTE, false);
if (_globals[kCurrentYear] == 1993)
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
else {
_hempHotspotId = _scene->_dynamicHotspots.add(NOUN_CHANDELIER_CABLE, VERB_CLIMB_DOWN, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(74, 92, 74 + 7, 92 + 12));
_scene->_dynamicHotspots.setPosition(_hempHotspotId, Common::Point(95, 107), FACING_NORTHWEST);
_scene->_dynamicHotspots[_hempHotspotId]._articleNumber = PREP_ON;
_scene->_dynamicHotspots.setCursor(_hempHotspotId, CURSOR_GO_DOWN);
}
if (_scene->_priorSceneId == 307)
_game._player.firstWalk(Common::Point(-20, 135), FACING_EAST, Common::Point(16, 135), FACING_EAST, true);
else if (_scene->_priorSceneId == 304) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 60);
_game._player._stepEnabled = false;
_game._player._visible = false;
} else if (_scene->_priorSceneId == 305) {
_game._objects.addToInventory(OBJ_SWORD);
_game._player._playerPos = Common::Point(117, 92);
_game._player._facing = FACING_SOUTHWEST;
} else if ((_scene->_priorSceneId == 302) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
_game._player.firstWalk(Common::Point(340, 136), FACING_WEST, Common::Point(303, 136), FACING_WEST, true);
_scene->_rails.disableLine(5, 9);
_scene->_rails.disableLine(5, 12);
_scene->_rails.disableLine(5, 8);
_scene->_rails.disableLine(6, 3);
_scene->_rails.disableLine(6, 2);
_scene->_rails.disableLine(11, 3);
_scene->_rails.disableLine(11, 4);
_scene->_rails.disableLine(10, 2);
_scene->_rails.disableLine(4, 9);
_scene->_rails.disableLine(8, 0);
sceneEntrySound();
}
void Scene303::step() {
if (_game._trigger == 60) {
_game._player._playerPos = Common::Point(110, 95);
_game._player._stepEnabled = true;
_game._player._visible = true;
_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
_game._player.resetFacing(FACING_SOUTHWEST);
}
if (_anim0ActvFl) {
if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() >= 6) && !_skipFrameCheckFl) {
_skipFrameCheckFl = true;
_scene->deleteSequence(_globals._sequenceIndexes[2]);
_scene->_hotspots.activate(NOUN_LARGE_NOTE, false);
_game._objects.addToInventory(OBJ_LARGE_NOTE);
_vm->_sound->command(26);
}
}
}
void Scene303::actions() {
if ((_action.isAction(VERB_TAKE, NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) || ((_game._trigger > 0) && _game._trigger < 3)) {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 1);
_anim0ActvFl = true;
_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
_globals[kPlayerScore] += 5;
break;
case 1:
_anim0ActvFl = false;
_game._player._visible = true;
_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
_scene->_sequences.addTimer(20, 2);
break;
case 2:
_vm->_dialogs->showItem(OBJ_LARGE_NOTE, 818, 7);
_game._player._stepEnabled = true;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE)) {
if (_globals[kCurrentYear] == 1881) {
switch (_game._trigger) {
case 0:
if (_globals[kRightDoorIsOpen504])
_vm->_dialogs->show(30331);
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3);
_game._player._stepEnabled = false;
_game._player._visible = false;
_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
break;
case 3:
_scene->_nextSceneId = 304;
break;
default:
break;
}
} else
_vm->_dialogs->show(30325);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
if (_globals[kRightDoorIsOpen504]) {
if (_vm->_sound->_preferRoland)
_vm->_sound->command(74);
else
_scene->playSpeech(1);
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(4);
_action._inProgress = false;
return;
}
}
if (_action._lookFlag) {
_vm->_dialogs->show(30310);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
// CHECKME: That's illogical, the check is always false... Should be out of the big 'look' check
// It looks to me like an original bug
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK)) {
_vm->_dialogs->show(30316);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30311);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRID)) {
_vm->_dialogs->show(30312);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CHANDELIER_CABLE)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30317);
else if (_globals[kRightDoorIsOpen504])
_vm->_dialogs->show(30330);
else
_vm->_dialogs->show(30329);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HEMP)) {
_vm->_dialogs->show(30313);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BACK_WALL)) {
_vm->_dialogs->show(30314);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_DUCTWORK)) {
_vm->_dialogs->show(30315);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CRATE)) {
_vm->_dialogs->show(30318);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_SUPPORT)) {
_vm->_dialogs->show(30319);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_PIECE_OF_WOOD)) {
_vm->_dialogs->show(30320);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_RAILING)) {
_vm->_dialogs->show(30321);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CHANDELIER_TRAP)) {
_vm->_dialogs->show(30322);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HOLE)) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30326);
else
_vm->_dialogs->show(30323);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_LARGE_NOTE) && _game._objects.isInRoom(OBJ_LARGE_NOTE)) {
_vm->_dialogs->show(30324);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_WALK_TO, NOUN_HOLE)) {
_vm->_dialogs->show(30325);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
_vm->_dialogs->show(30327);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
_vm->_dialogs->show(30141);
_action._inProgress = false;
return;
}
}
void Scene303::preActions() {
if (_action.isAction(VERB_EXIT_TO, NOUN_CATWALK) && !_globals[kRightDoorIsOpen504]) {
if (_scene->_customDest.x > 160)
_game._player._walkOffScreenSceneId = 302;
else
_game._player._walkOffScreenSceneId = 307;
}
if (_action.isAction(VERB_CLIMB_INTO, NOUN_HOLE) || _action.isAction(VERB_CLIMB_DOWN, NOUN_CHANDELIER_CABLE))
_game._player.walk(Common::Point(110, 95), FACING_SOUTHWEST);
}
/*------------------------------------------------------------------------*/
Scene304::Scene304(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_anim1ActvFl = false;
_anim2ActvFl = false;
_raoulFrame = -1;
_raoulStatus = -1;
_fightFrame = -1;
_fightStatus = -1;
_fightCount = -1;
_phantomFrame = -1;
_phantomStatus = -1;
}
void Scene304::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsByte(_anim1ActvFl);
s.syncAsByte(_anim2ActvFl);
s.syncAsSint16LE(_raoulFrame);
s.syncAsSint16LE(_raoulStatus);
s.syncAsSint16LE(_fightFrame);
s.syncAsSint16LE(_fightStatus);
s.syncAsSint16LE(_fightCount);
s.syncAsSint16LE(_phantomFrame);
s.syncAsSint16LE(_phantomStatus);
}
void Scene304::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene304::enter() {
_game._player._playerPos.x = 0;
if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
_anim0ActvFl = false;
_anim1ActvFl = false;
_anim2ActvFl = false;
}
if (_globals[kRightDoorIsOpen504])
_vm->_gameConv->load(23);
if (!_globals[kRightDoorIsOpen504]) {
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('f', 1));
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('n', 1), 0);
_anim0ActvFl = true;
_raoulStatus = 1;
_game._player._stepEnabled = false;
} else {
_scene->_userInterface.setup(kInputLimitedSentences);
if (_scene->_priorSceneId == 305) {
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
_game._player._stepEnabled = false;
_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
_anim1ActvFl = true;
_scene->setAnimFrame(_globals._animationIndexes[1], 138);
} else {
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('f', 0));
_scene->drawToBackground(_globals._spriteIndexes[0], 1, Common::Point(-32000, -32000), 0, 100);
_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('f', 1), 0);
_anim1ActvFl = true;
_phantomStatus = 0;
_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('r', 1), 0);
_anim2ActvFl = true;
_fightStatus = 0;
_game._player._stepEnabled = false;
_fightCount = 0;
_globals[kPlayerScore] += 10;
_vm->_gameConv->run(23);
_vm->_gameConv->hold();
}
}
if ((_scene->_priorSceneId == RETURNING_FROM_LOADING) && !_globals[kRightDoorIsOpen504]) {
_scene->setAnimFrame(_globals._animationIndexes[0], 53);
_game._player._stepEnabled = true;
}
_game._player._visible = false;
sceneEntrySound();
}
void Scene304::step() {
if (_anim0ActvFl)
handleRaoulAnimation();
if (_anim1ActvFl)
handlePhantomAnimation();
if (_anim2ActvFl)
handleFightAnimation();
}
void Scene304::actions() {
if (_vm->_gameConv->activeConvId() == 23) {
handleConversation23();
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_OPENING) || _action.isAction(VERB_CLIMB, NOUN_CHANDELIER_CABLE)) {
_raoulStatus = 0;
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30410);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_CEILING)) {
_vm->_dialogs->show(30411);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_DOME)) {
_vm->_dialogs->show(30412);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_LATTICEWORK)) {
_vm->_dialogs->show(30413);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_OPENING)) {
_vm->_dialogs->show(30414);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CHANDELIER)) {
_vm->_dialogs->show(30415);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CHANDELIER_CABLE)) {
_vm->_dialogs->show(30416);
_action._inProgress = false;
return;
}
}
}
void Scene304::preActions() {
}
void Scene304::handleConversation23() {
switch (_action._activeAction._verbId) {
case 5:
_phantomStatus = 1;
_vm->_gameConv->hold();
break;
case 6:
if (_phantomStatus != 1)
_fightStatus = 0;
_vm->_gameConv->hold();
break;
case 9:
if (_phantomStatus != 1)
_fightStatus = 2;
break;
case 12:
_phantomStatus = 2;
break;
default:
break;
}
_fightCount = 0;
}
void Scene304::handleRaoulAnimation() {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _raoulFrame)
return;
_raoulFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
int resetFrame = -1;
switch (_raoulFrame) {
case 20:
_game._player._stepEnabled = true;
resetFrame = 53;
break;
case 53:
_scene->_nextSceneId = 303;
break;
case 54:
case 55:
case 56:
if (_raoulStatus == 0) {
resetFrame = 20;
_game._player._stepEnabled = false;
} else {
int random = _vm->getRandomNumber(1, 50);
switch (_raoulFrame) {
case 54:
if (random == 1)
resetFrame = 54;
else if (random == 2)
resetFrame = 55;
else
resetFrame = _raoulFrame - 1;
break;
case 55:
if (random == 1)
resetFrame = 54;
else if (random == 2)
resetFrame = 53;
else
resetFrame = _raoulFrame - 1;
break;
case 56:
if (random == 1)
resetFrame = 55;
else if (random == 2)
resetFrame = 53;
else
resetFrame = _raoulFrame - 1;
break;
default:
break;
}
}
break;
default:
break;
}
if (resetFrame >= 0) {
_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
_raoulFrame = resetFrame;
}
}
void Scene304::handlePhantomAnimation() {
if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _phantomFrame)
return;
_phantomFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
int resetFrame = -1;
switch (_phantomFrame) {
case 7:
case 11:
resetFrame = _vm->getRandomNumber(6, 7);
if (_phantomStatus == 1)
resetFrame = 7;
break;
case 9:
case 15:
switch (_vm->getRandomNumber(1, 3)) {
case 1:
resetFrame = 8;
break;
case 2:
resetFrame = 9;
break;
case 3:
resetFrame = 11;
break;
default:
break;
}
if (_phantomStatus == 1)
resetFrame = 11;
break;
case 13:
case 24:
switch (_vm->getRandomNumber(1, 3)) {
case 1:
resetFrame = 12;
break;
case 2:
resetFrame = 13;
break;
case 3:
resetFrame = 16;
break;
default:
break;
}
if (_phantomStatus == 1)
resetFrame = 16;
break;
case 20:
if (_vm->getRandomNumber(1, 2) == 1)
resetFrame = 19;
else
resetFrame = 20;
if (_phantomStatus == 1)
resetFrame = 24;
break;
case 25:
_vm->_gameConv->release();
break;
case 47:
_fightStatus = 0;
break;
case 59:
if (_phantomStatus == 2)
resetFrame = 59;
else
resetFrame = 58;
break;
case 60:
_game._player._stepEnabled = false;
break;
case 80:
_game._objects.setRoom(OBJ_SWORD, NOWHERE);
break;
case 137:
_game._player._playerPos.x = 100;
_scene->_nextSceneId = 305;
break;
case 176:
_game._player._playerPos.x = 200;
_scene->_nextSceneId = 305;
break;
default:
break;
}
if (resetFrame >= 0) {
_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
_phantomFrame = resetFrame;
}
}
void Scene304::handleFightAnimation() {
if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _fightFrame)
return;
_fightFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
int resetFrame = -1;
switch (_fightFrame) {
case 22:
_vm->_gameConv->release();
break;
case 23:
if (_fightStatus != 2)
resetFrame = 22;
break;
case 25:
case 26:
case 27:
if (_fightStatus == 2) {
resetFrame = _vm->getRandomNumber(24, 26);
++_fightCount;
if (_fightCount > 17)
resetFrame = 24;
}
break;
case 28:
_fightStatus = 2;
break;
case 45:
_vm->_gameConv->release();
break;
case 46:
case 47:
case 48:
if (_fightStatus == 2) {
resetFrame = _vm->getRandomNumber(45, 47);
++_fightCount;
if (_fightCount > 17)
resetFrame = 45;
}
break;
default:
break;
}
if (resetFrame >= 0) {
_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
_fightFrame = resetFrame;
}
}
/*------------------------------------------------------------------------*/
Scene305::Scene305(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_anim1ActvFl = false;
_skipFl = false;
_unmaskFl = false;
_unmaskFrame = -1;
}
void Scene305::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsByte(_anim1ActvFl);
s.syncAsByte(_skipFl);
s.syncAsByte(_unmaskFl);
s.syncAsSint16LE(_unmaskFrame);
}
void Scene305::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene305::enter() {
_unmaskFl = false;
_skipFl = false;
_game._player._visible = false;
_anim0ActvFl = false;
_anim1ActvFl = false;
_scene->_userInterface.setup(kInputLimitedSentences);
_scene->loadSpeech(5);
_game.loadQuoteSet(0x64, 0x65, 0);
if (_game._player._playerPos.x == 100) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('r', 1), 60);
_scene->_hotspots.activate(NOUN_MASK, false);
_anim1ActvFl = true;
} else if (_game._player._playerPos.x == 200) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 0);
_anim0ActvFl = true;
_scene->_hotspots.activate(NOUN_CANE, false);
}
sceneEntrySound();
}
void Scene305::step() {
if (_anim0ActvFl)
handle_animation_unmask ();
if (_anim1ActvFl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 53)
_game._player._stepEnabled = false;
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 54 && !_skipFl) {
_scene->playSpeech(5);
_skipFl = true;
}
}
if (_game._trigger == 60) {
_globals[kPlayerScore] -= 10;
_scene->_userInterface.noInventoryAnim();
// CHECKME: Not sure about the next function call
_scene->_userInterface.refresh();
_scene->_nextSceneId = 303;
}
}
void Scene305::actions() {
if (_action.isAction(VERB_PUSH, NOUN_CANE)) {
_scene->_nextSceneId = 304;
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TAKE, NOUN_MASK)) {
_unmaskFl = true;
_game._player._stepEnabled = false;
_action._inProgress = false;
}
}
void Scene305::preActions() {
}
void Scene305::handle_animation_unmask() {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _unmaskFrame)
return;
_unmaskFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
int resetFrame = -1;
switch (_unmaskFrame) {
case 25:
if (!_unmaskFl)
resetFrame = 0;
break;
case 60:
_scene->playSpeech(10);
_scene->_kernelMessages.add(Common::Point(176, 53), 0x1110, 0, 0, 360, _game.getQuote(0x64));
_scene->_kernelMessages.add(Common::Point(176, 68), 0x1110, 0, 0, 360, _game.getQuote(0x65));
break;
case 95:
_scene->_nextSceneId = 306;
break;
default:
break;
}
if (resetFrame >= 0) {
_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
_unmaskFrame = resetFrame;
}
}
/*------------------------------------------------------------------------*/
Scene306::Scene306(MADSEngine *vm) : Scene3xx(vm) {
_speechDoneFl = false;
}
void Scene306::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_speechDoneFl);
}
void Scene306::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene306::enter() {
_scene->loadSpeech(6);
_speechDoneFl = false;
warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
_game._player._visible = false;
_game._player._stepEnabled = false;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', 1), 60);
sceneEntrySound();
}
void Scene306::step() {
if (_game._trigger == 60) {
if (_vm->_sound->_preferRoland)
_scene->_sequences.addTimer(120, 61);
else
_scene->_sequences.addTimer(300, 61);
}
if (!_speechDoneFl && (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 3)) {
_scene->playSpeech(6);
_speechDoneFl = true;
}
if (_game._trigger == 61) {
_vm->_sound->command(1);
_vm->_sound->command(66);
_scene->_sequences.addTimer(120, 62);
}
if (_game._trigger == 62)
_scene->_nextSceneId = 150;
}
void Scene306::actions() {
}
void Scene306::preActions() {
}
/*------------------------------------------------------------------------*/
Scene307::Scene307(MADSEngine *vm) : Scene3xx(vm) {
}
void Scene307::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
}
void Scene307::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene307::enter() {
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 0));
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RRD_9");
_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RDR_9");
if (_globals[kRightDoorIsOpen504])
_scene->_hotspots.activate(NOUN_DOOR, true);
else
_scene->_hotspots.activate(NOUN_DOOR, false);
if (_game._objects.isInRoom(OBJ_GREEN_FRAME) && (_game._difficulty == DIFFICULTY_EASY)) {
_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14);
} else
_scene->_hotspots.activate(NOUN_GREEN_FRAME, false);
if (_scene->_priorSceneId == 308) {
_game._player._playerPos = Common::Point(18, 134);
_game._player._facing = FACING_SOUTHEAST;
_game._player._stepEnabled = false;
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
if (!(_globals[kPlayerScoreFlags] & 16)) {
_globals[kPlayerScoreFlags] |= 16;
_globals[kPlayerScore] += 5;
}
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 4);
_game._player.walk(Common::Point(41, 137), FACING_EAST);
_game._player.setWalkTrigger(60);
} else if ((_scene->_priorSceneId == 303) || (_scene->_priorSceneId != RETURNING_FROM_LOADING))
_game._player.firstWalk(Common::Point(340, 137), FACING_WEST, Common::Point(304, 137), FACING_WEST, true);
sceneEntrySound();
}
void Scene307::step() {
switch (_game._trigger) {
case 60:
_scene->deleteSequence(_globals._sequenceIndexes[3]);
_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 10);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
break;
case 61:
_vm->_sound->command(25);
_game._player._stepEnabled = true;
break;
default:
break;
}
}
void Scene307::actions() {
if (_action.isAction(VERB_TAKE, NOUN_GREEN_FRAME) && (_game._objects.isInRoom(OBJ_GREEN_FRAME) || _game._trigger)) {
switch (_game._trigger) {
case (0):
if (_globals[kCurrentYear] == 1881) {
int count = 0;
if (_game._objects.isInInventory(OBJ_YELLOW_FRAME))
++count;
if (_game._objects.isInInventory(OBJ_RED_FRAME))
++count;
if (_game._objects.isInInventory(OBJ_BLUE_FRAME))
++count;
if (count < 3)
_globals[kPlayerScore] += 5;
}
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 5);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 5, 1);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
break;
case 1:
_scene->deleteSequence(_globals._sequenceIndexes[2]);
_scene->_hotspots.activate(NOUN_GREEN_FRAME, false);
_game._objects.addToInventory(OBJ_GREEN_FRAME);
_vm->_sound->command(26);
break;
case 2:
_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[1]);
_game._player._visible = true;
_scene->_sequences.addTimer(20, 3);
break;
case 3:
if (_globals[kCurrentYear] == 1881)
_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 845, 0);
else
_vm->_dialogs->showItem(OBJ_GREEN_FRAME, 819, 0);
_game._player._stepEnabled = true;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], true, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 4);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4], true);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 4, 70);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 72);
break;
case 70:
_vm->_sound->command(24);
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
break;
case 71: {
int idx = _globals._sequenceIndexes[3];
_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, idx);
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 14);
_scene->_sequences.addTimer(10, 73);
}
break;
case 72:
_game._player._visible = true;
break;
case 73:
_scene->_nextSceneId = 308;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30710);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_COLUMN)) {
if (_globals[kRightDoorIsOpen504])
_vm->_dialogs->show(30725);
else
_vm->_dialogs->show(30711);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATWALK)) {
_vm->_dialogs->show(30712);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRID)) {
_vm->_dialogs->show(30713);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GIRDER)) {
_vm->_dialogs->show(30714);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_GRIDWORK)) {
_vm->_dialogs->show(30715);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_HEMP)) {
_vm->_dialogs->show(30716);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BACK_WALL)) {
_vm->_dialogs->show(30717);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_DUCTWORK)) {
_vm->_dialogs->show(30718);
_action._inProgress = false;
return;
}
if ((_action.isObject(NOUN_GREEN_FRAME)) && (_game._objects.isInRoom(OBJ_GREEN_FRAME))) {
if (_globals[kCurrentYear] == 1993)
_vm->_dialogs->show(30719);
else
_vm->_dialogs->show(30720);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_ALCOVE)) {
_vm->_dialogs->show(30721);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_RAILING)) {
_vm->_dialogs->show(30722);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_DOOR)) {
_vm->_dialogs->show(30726);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_TAKE, NOUN_HEMP)) {
_vm->_dialogs->show(30723);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_PULL, NOUN_HEMP)) {
_vm->_dialogs->show(30141);
_action._inProgress = false;
}
}
void Scene307::preActions() {
if (_action.isAction(VERB_EXIT_TO, NOUN_ALCOVE))
_game._player._walkOffScreenSceneId = 303;
if (_action.isAction(VERB_OPEN, NOUN_DOOR))
_game._player.walk(Common::Point(28, 137), FACING_NORTHWEST);
}
/*------------------------------------------------------------------------*/
Scene308::Scene308(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_anim1ActvFl = false;
_anim2ActvFl = false;
_anim3ActvFl = false;
_skip1Fl = false;
_skip2Fl = false;
_currentFloor = -1;
}
void Scene308::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsByte(_anim1ActvFl);
s.syncAsByte(_anim2ActvFl);
s.syncAsByte(_anim3ActvFl);
s.syncAsByte(_skip1Fl);
s.syncAsByte(_skip2Fl);
s.syncAsSint16LE(_currentFloor);
}
void Scene308::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene308::enter() {
_scene->loadSpeech(4);
if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
_anim0ActvFl = false;
_anim1ActvFl = false;
_anim2ActvFl = false;
_anim3ActvFl = false;
}
_skip1Fl = false;
_skip2Fl = false;
_vm->_gameConv->load(26);
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('a', 0));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
_scene->_userInterface.setup(kInputLimitedSentences);
_game._player._visible = false;
if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
switch (_currentFloor) {
case 1:
if (_globals[kRightDoorIsOpen504]) {
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104));
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124));
} else {
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127));
}
break;
case 2:
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76));
break;
case 3:
if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
_anim0ActvFl = true;
_skip1Fl = true;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 2);
_scene->setAnimFrame(_globals._animationIndexes[0], 76);
} else {
_anim0ActvFl = true;
_skip1Fl = true;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
_scene->setAnimFrame(_globals._animationIndexes[0], 96);
}
break;
default:
break;
}
} else if (_scene->_priorSceneId == 309) {
_currentFloor = 1;
if (_globals[kRightDoorIsOpen504]) {
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 104));
_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(161, 124));
} else {
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 127));
}
} else if (_scene->_priorSceneId == 206) {
_currentFloor = 2;
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setPosition(_globals._sequenceIndexes[0], Common::Point(160, 76));
} else if (_scene->_priorSceneId == 307) {
_currentFloor = 3;
_anim0ActvFl = true;
_skip1Fl = true;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
_scene->setAnimFrame(_globals._animationIndexes[0], 96);
}
if (!_game._visitedScenes._sceneRevisited) {
_globals[kPlayerScore] += 5;
_scene->_sequences.addTimer(1, 60);
}
sceneEntrySound();
}
void Scene308::step() {
if (_game._trigger == 60)
_vm->_dialogs->show(30810);
if (_anim2ActvFl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 77) {
_scene->setAnimFrame(_globals._animationIndexes[0], 76);
if (!_skip1Fl) {
_game._player._stepEnabled = true;
_vm->_dialogs->show(30811);
_skip1Fl = true;
}
}
}
if (_anim0ActvFl) {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 97) {
if (_globals[kTopFloorLocked]) {
_scene->setAnimFrame(_globals._animationIndexes[0], 96);
if (!_skip1Fl) {
_game._player._stepEnabled = true;
_vm->_dialogs->show(30811);
_skip1Fl = true;
}
}
} else if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 116) {
_globals[kTopFloorLocked] = true;
_scene->_nextSceneId = 307;
}
}
if (_anim1ActvFl) {
if ((_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == 51) && _globals[kTopFloorLocked]) {
_scene->setAnimFrame(_globals._animationIndexes[0], 50);
if (!_skip1Fl) {
_game._player._stepEnabled = true;
_vm->_dialogs->show(30811);
_skip1Fl = true;
}
}
}
}
void Scene308::actions() {
switch (_game._trigger) {
case 1:
_scene->_nextSceneId = 206;
_action._inProgress = false;
return;
case 2:
_scene->_nextSceneId = 307;
_action._inProgress = false;
return;
case 3:
_scene->_nextSceneId = 309;
_action._inProgress = false;
return;
default:
break;
}
if (_action.isAction(VERB_EXIT_TO, NOUN_MIDDLE_LEVEL)) {
switch (_currentFloor) {
case 1:
if (_globals[kRightDoorIsOpen504]) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 1);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_scene->deleteSequence(_globals._sequenceIndexes[1]);
_game._player._stepEnabled = false;
} else {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 1), 1);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
}
_action._inProgress = false;
return;
case 2:
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('m', 1), 1);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
_action._inProgress = false;
return;
case 3:
if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
_scene->freeAnimation(_globals._animationIndexes[0]);
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 4), 1);
_game._player._stepEnabled = false;
_anim2ActvFl = false;
} else {
_scene->freeAnimation(_globals._animationIndexes[0]);
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 1), 1);
_game._player._stepEnabled = false;
_anim0ActvFl = false;
_anim1ActvFl = false;
}
_action._inProgress = false;
return;
default:
break;
}
}
if (_action.isAction(VERB_EXIT_TO, NOUN_UPPER_LEVEL)) {
switch (_currentFloor) {
case 1:
if (_globals[kRightDoorIsOpen504]) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 2), 1);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_scene->deleteSequence(_globals._sequenceIndexes[1]);
_game._player._stepEnabled = false;
_anim2ActvFl = true;
_currentFloor = 3;
} else {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 2), 2);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
_anim0ActvFl = true;
_currentFloor = 3;
}
_action._inProgress = false;
return;
case 2:
if (_globals[kRightDoorIsOpen504]) {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
} else {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('u', 3), 2);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
_anim1ActvFl = true;
_currentFloor = 3;
}
_action._inProgress = false;
return;
case 3:
if (_globals[kRightDoorIsOpen504])
_globals[kTopFloorLocked] = false;
else {
_skip2Fl = false;
_skip1Fl = false;
}
_action._inProgress = false;
return;
default:
break;
}
}
if (_action.isAction(VERB_EXIT_TO, NOUN_LOWER_LEVEL)) {
switch (_currentFloor) {
case 1:
if (_globals[kRightDoorIsOpen504]) {
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(1);
} else {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 3);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
}
_action._inProgress = false;
return;
case 2:
if (_globals[kRightDoorIsOpen504]) {
if (_vm->_sound->_preferRoland)
_vm->_sound->command(74);
else
_scene->playSpeech(1);
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(6);
} else {
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', 1), 3);
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_game._player._stepEnabled = false;
}
_action._inProgress = false;
return;
case 3:
if (_globals[kRightDoorIsOpen504] && !_globals[kKnockedOverHead]) {
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(5);
} else if (_globals[kRightDoorIsOpen504] && _globals[kKnockedOverHead]) {
if (_vm->_sound->_preferRoland)
_vm->_sound->command(74);
else
_scene->playSpeech(1);
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(6);
} else {
_scene->freeAnimation(_globals._animationIndexes[0]);
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('x', 2), 3);
_game._player._stepEnabled = false;
_anim0ActvFl = false;
_anim1ActvFl = false;
}
_action._inProgress = false;
return;
default:
break;
}
}
}
void Scene308::preActions() {
}
/*------------------------------------------------------------------------*/
Scene309::Scene309(MADSEngine *vm) : Scene3xx(vm) {
_anim0ActvFl = false;
_boatStatus = -1;
_boatFrame = -1;
_talkCount = -1;
}
void Scene309::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsByte(_anim0ActvFl);
s.syncAsSint16LE(_boatStatus);
s.syncAsSint16LE(_boatFrame);
s.syncAsSint16LE(_talkCount);
}
void Scene309::setup() {
setPlayerSpritesPrefix();
setAAName();
if (_globals[kRightDoorIsOpen504])
_scene->_variant = 1;
}
void Scene309::enter() {
_scene->_hotspots.activate(NOUN_CHRISTINE, false);
_scene->_hotspots.activate(NOUN_BOAT, false);
_anim0ActvFl = false;
_boatStatus = 1;
_vm->_gameConv->load(26);
_globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('x', 0));
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RDR_9");
if (_scene->_priorSceneId == RETURNING_FROM_LOADING) {
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
if (_game._visitedScenes.exists(310)) {
_anim0ActvFl = true;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70);
_scene->setAnimFrame(_globals._animationIndexes[0], 184);
int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(id, Common::Point(62, 146), FACING_NORTHWEST);
_scene->_dynamicHotspots[id]._articleNumber = PREP_ON;
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 10);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 11);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 12);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 13);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 14);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 15);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 16);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 17);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 18);
_scene->_hotspots.activate(NOUN_CHRISTINE, true);
_scene->_hotspots.activate(NOUN_BOAT, true);
}
}
if (_scene->_priorSceneId == 404) {
_game._player._playerPos = Common::Point(319, 136);
_game._player._facing = FACING_SOUTHWEST;
_game._player.walk(Common::Point(281, 148), FACING_SOUTHWEST);
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
} else if (_scene->_priorSceneId == 310) {
_game._player._playerPos = Common::Point(209, 144);
_game._player._facing = FACING_SOUTH;
_game._player._stepEnabled = false;
_game._player._visible = false;
_anim0ActvFl = true;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('b', 1), 70);
int id = _scene->_dynamicHotspots.add(NOUN_CHRISTINE, VERB_WALK_TO, SYNTAX_SINGULAR_FEM, EXT_NONE, Common::Rect(0, 0, 0, 0));
_scene->_dynamicHotspots.setPosition(id, Common::Point(63, 146), FACING_NORTHWEST);
_scene->_dynamicHotspots[id]._articleNumber = PREP_ON;
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 10);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 11);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 12);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 13);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 14);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 15);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 16);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 17);
_scene->setDynamicAnim(id, _globals._animationIndexes[0], 18);
_scene->_hotspots.activate(NOUN_CHRISTINE, true);
_scene->_hotspots.activate(NOUN_BOAT, true);
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
} else if ((_scene->_priorSceneId == 308) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
_game._player._playerPos = Common::Point(0, 121);
_game._player._facing = FACING_SOUTHEAST;
_game._player.walk(Common::Point(28, 142), FACING_SOUTHEAST);
_game._player.setWalkTrigger(65);
_game._player._stepEnabled = false;
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -2);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
}
sceneEntrySound();
}
void Scene309::step() {
if (_anim0ActvFl)
handleBoatAnimation ();
switch (_game._trigger) {
case 65:
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 66);
break;
case 66:
_vm->_sound->command(25);
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, -1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 10);
_game._player._stepEnabled = true;
break;
default:
break;
}
}
void Scene309::actions() {
if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY)) {
if (_globals[kRightDoorIsOpen504]) {
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(1);
_boatStatus = 0;
_talkCount = 0;
} else if (_globals[kLanternStatus] == 1)
_game.enterCatacombs(false);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_TALK_TO, NOUN_CHRISTINE)) {
_vm->_gameConv->run(26);
_vm->_gameConv->exportValue(1);
_boatStatus = 0;
_talkCount = 0;
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR) || _action.isAction(VERB_OPEN, NOUN_DOOR)) {
switch (_game._trigger) {
case (0):
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 2);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 4);
_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[1], true);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 4, 60);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 62);
break;
case 60:
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_globals._sequenceIndexes[0] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
_vm->_sound->command(24);
break;
case 61: {
int idx = _globals._sequenceIndexes[0];
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[0], SYNC_SEQ, idx);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 14);
_game._player.walk(Common::Point(0, 121), FACING_NORTHWEST);
_game._player.setWalkTrigger(63);
}
break;
case 62:
_game._player._visible = true;
break;
case 63:
if (!_globals[kRightDoorIsOpen504]) {
_scene->deleteSequence(_globals._sequenceIndexes[0]);
_globals._sequenceIndexes[0] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[0], false, 8, 1);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[0], -1, -2);
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[0], SEQUENCE_TRIGGER_EXPIRE, 0, 64);
_vm->_sound->command(25);
} else
_scene->setAnimFrame(_globals._animationIndexes[0], 186);
break;
case 64:
_globals._sequenceIndexes[0] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[0], false, 5);
_scene->_sequences.setDepth(_globals._sequenceIndexes[0], 1);
_scene->_nextSceneId = 308;
break;
default:
break;
}
_action._inProgress = false;
return;
}
if (_action._lookFlag) {
_vm->_dialogs->show(30910);
_action._inProgress = false;
return;
}
if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
if (_action.isObject(NOUN_STONE_WALL)) {
_vm->_dialogs->show(30911);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_LAKE)) {
_vm->_dialogs->show(30912);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_STONE_COLUMN)) {
_vm->_dialogs->show(30913);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_DOORWAY)) {
_vm->_dialogs->show(30914);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_STONE_ARCHWAY)) {
_vm->_dialogs->show(30915);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_STONE_FLOOR)) {
_vm->_dialogs->show(30916);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CATACOMBS)) {
_vm->_dialogs->show(30917);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_CHRISTINE)) {
_vm->_dialogs->show(30919);
_action._inProgress = false;
return;
}
if (_action.isObject(NOUN_BOAT)) {
_vm->_dialogs->show(30921);
_action._inProgress = false;
return;
}
}
if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT)) {
_vm->_dialogs->show(30920);
_action._inProgress = false;
}
}
void Scene309::preActions() {
if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && (_globals[kLanternStatus] == 0)) {
_game._player._needToWalk = false;
_vm->_dialogs->show(30918);
}
if (_action.isAction(VERB_WALK_THROUGH, NOUN_STONE_ARCHWAY) && _globals[kRightDoorIsOpen504])
_game._player.walk(Common::Point(285, 147), FACING_NORTHEAST);
if (_action.isAction(VERB_OPEN, NOUN_DOOR))
_game._player.walk(Common::Point(16, 139), FACING_NORTHEAST);
}
void Scene309::handleBoatAnimation() {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _boatFrame)
return;
_boatFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
int resetFrame = -1;
switch (_boatFrame) {
case 72:
_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
_game._player._visible = true;
break;
case 130:
_game._player._stepEnabled = true;
break;
case 185:
if (_boatStatus == 0)
resetFrame = 244;
else
resetFrame = 184;
break;
case 244:
_scene->_nextSceneId = 308;
break;
case 245:
case 246:
case 247:
resetFrame = _vm->getRandomNumber(244, 246);
++_talkCount;
if (_talkCount > 10) {
resetFrame = 184;
_boatStatus = 1;
}
break;
default:
break;
}
if (resetFrame >= 0) {
_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
_boatFrame = resetFrame;
}
}
/*------------------------------------------------------------------------*/
Scene310::Scene310(MADSEngine *vm) : Scene3xx(vm) {
_raoulMessageColor = -1;
_chrisMessageColor = -1;
_lakeFrame = -1;
for (int i = 0; i < 4; i++)
_multiplanePosX[i] = -1;
}
void Scene310::synchronize(Common::Serializer &s) {
Scene3xx::synchronize(s);
s.syncAsSint16LE(_raoulMessageColor);
s.syncAsSint16LE(_chrisMessageColor);
s.syncAsSint16LE(_lakeFrame);
for (int i = 0; i < 4; i++)
s.syncAsSint16LE(_multiplanePosX[i]);
}
void Scene310::setup() {
setPlayerSpritesPrefix();
setAAName();
}
void Scene310::enter() {
warning("TODO: Switch to letter box view. See definition of MADS_MENU_Y");
for (int i = 0; i < 4; i++) {
_globals._spriteIndexes[i] = _scene->_sprites.addSprites(formAnimName('f', i));
_globals._sequenceIndexes[i] = -1;
}
_multiplanePosX[0] = 100;
_multiplanePosX[1] = 210;
_multiplanePosX[2] = 320;
_multiplanePosX[3] = 472;
_game.loadQuoteSet(0x66, 0x67, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x74, 0x70, 0x68, 0x73, 0x6B, 0);
_game._player._stepEnabled = false;
_game._player._visible = false;
_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('l', 1), 80);
_scene->_animation[_globals._animationIndexes[0]]->_canChangeView = true;
_game._camX._manualFl = true;
_raoulMessageColor = 0x102;
_chrisMessageColor = 0x1110;
_scene->_userInterface.emptyConversationList();
_scene->_userInterface.setup(kInputConversation);
sceneEntrySound();
}
void Scene310::step() {
handleLakeAnimation();
if (_game._trigger == 80)
_scene->_nextSceneId = 309;
bool positionsSetFl = false;
if (_globals._animationIndexes[0] >= 0) {
MADS::Animation *anim = _scene->_animation[_globals._animationIndexes[0]];
int curFrame = anim->getCurrentFrame();
uint32 clock = anim->getNextFrameTimer();
if ((curFrame > 0) && (_scene->_frameStartTime >= clock)) {
Common::Point pos = anim->getFramePosAdjust(curFrame);
if (pos.x != _scene->_posAdjust.x) {
setMultiplanePos(pos.x);
positionsSetFl = true;
}
}
}
if (!positionsSetFl && (_game._fx != kTransitionNone))
setMultiplanePos(320);
}
void Scene310::actions() {
}
void Scene310::preActions() {
}
void Scene310::setMultiplanePos(int x_new) {
int center = x_new + 160;
for (int i = 0; i < 4; i++) {
if (_globals._sequenceIndexes[i] >= 0)
_scene->deleteSequence(_globals._sequenceIndexes[i]);
int difference = center - _multiplanePosX[i];
int direction = 0;
if (difference < 0)
direction = 1;
else if (difference > 0)
direction = -1;
int displace = abs(difference);
if (direction < 0)
displace = -displace;
int x = _multiplanePosX[i] + displace - 1;
int y = _scene->_sprites[_globals._spriteIndexes[i]]->getFrameWidth(0) + 29;
int halfWidth = 1 + (_scene->_sprites[_globals._spriteIndexes[i]]->getFrameHeight(0) / 2);
if (((x - halfWidth) >= (x_new + 320)) || ((x + halfWidth) < x_new))
_globals._sequenceIndexes[i] = -1;
else {
_globals._sequenceIndexes[i] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[i], false, 1);
_scene->_sequences.setPosition(_globals._sequenceIndexes[i], Common::Point(x, y));
_scene->_sequences.setDepth(_globals._sequenceIndexes[i], 1);
}
}
}
void Scene310::handleLakeAnimation() {
if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _lakeFrame)
return;
_lakeFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
int id;
switch (_lakeFrame) {
case 60:
id = _scene->_kernelMessages.add(Common::Point(-142, 0), _chrisMessageColor, 0, 61, 600, _game.getQuote(0x66));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(-142, 15), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x67));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(-142, 30), _chrisMessageColor, 0, 0, 600, _game.getQuote(0x68));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 120:
_scene->_kernelMessages.reset();
break;
case 140:
id = _scene->_kernelMessages.add(Common::Point(-120, 0), _chrisMessageColor, 0, 63, 360, _game.getQuote(0x69));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(-120, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6A));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(-120, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x6B));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 200:
_scene->_kernelMessages.reset();
break;
case 220:
id = _scene->_kernelMessages.add(Common::Point(-32, 30), _chrisMessageColor, 0, 65, 240, _game.getQuote(0x6C));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(-32, 45), _chrisMessageColor, 0, 0, 240, _game.getQuote(0x6D));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 280:
_scene->_kernelMessages.reset();
break;
case 300:
id = _scene->_kernelMessages.add(Common::Point(101, 0), _raoulMessageColor, 0, 67, 360, _game.getQuote(0x6E));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(101, 15), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x6F));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(101, 30), _raoulMessageColor, 0, 0, 360, _game.getQuote(0x70));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 360:
_scene->_kernelMessages.reset();
break;
case 380:
id = _scene->_kernelMessages.add(Common::Point(107, 0), _chrisMessageColor, 0, 69, 360, _game.getQuote(0x71));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(107, 15), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x72));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
id = _scene->_kernelMessages.add(Common::Point(107, 30), _chrisMessageColor, 0, 0, 360, _game.getQuote(0x73));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 440:
_scene->_kernelMessages.reset();
break;
case 460:
id = _scene->_kernelMessages.add(Common::Point(107, 7), _chrisMessageColor, 0, 0, 180, _game.getQuote(0x74));
_scene->_kernelMessages.setAnim(id, _globals._animationIndexes[0], 0);
break;
case 510:
_scene->_kernelMessages.reset();
break;
default:
break;
}
}
/*------------------------------------------------------------------------*/
} // End of namespace Phantom
} // End of namespace MADS
#endif