2683 lines
82 KiB
C++
2683 lines
82 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "common/scummsys.h"
|
|
#include "mads/mads.h"
|
|
#include "mads/scene.h"
|
|
#include "mads/nebular/nebular_scenes.h"
|
|
#include "mads/nebular/nebular_scenes7.h"
|
|
|
|
namespace MADS {
|
|
|
|
namespace Nebular {
|
|
|
|
void Scene7xx::setAAName() {
|
|
_game._aaName = Resources::formatAAName(5);
|
|
}
|
|
|
|
void Scene7xx::setPlayerSpritesPrefix() {
|
|
_vm->_sound->command(5);
|
|
|
|
Common::String oldName = _game._player._spritesPrefix;
|
|
|
|
if ((_scene->_nextSceneId == 703) || (_scene->_nextSceneId == 704) || (_scene->_nextSceneId == 705)
|
|
|| (_scene->_nextSceneId == 707) || (_scene->_nextSceneId == 710) || (_scene->_nextSceneId == 711))
|
|
_game._player._spritesPrefix = "";
|
|
else if (_globals[kSexOfRex] == REX_MALE)
|
|
_game._player._spritesPrefix = "RXM";
|
|
else
|
|
_game._player._spritesPrefix = "ROX";
|
|
|
|
_game._player._scalingVelocity = true;
|
|
|
|
if (oldName != _game._player._spritesPrefix)
|
|
_game._player._spritesChanged = true;
|
|
|
|
_vm->_palette->setEntry(16, 10, 63, 63);
|
|
_vm->_palette->setEntry(17, 10, 45, 45);
|
|
}
|
|
|
|
void Scene7xx::sceneEntrySound() {
|
|
if (!_vm->_musicFlag) {
|
|
_vm->_sound->command(2);
|
|
return;
|
|
}
|
|
|
|
switch (_scene->_nextSceneId) {
|
|
case 701:
|
|
case 702:
|
|
case 704:
|
|
case 705:
|
|
case 751:
|
|
_vm->_sound->command(38);
|
|
break;
|
|
case 703:
|
|
if (_globals[kMonsterAlive] == 0)
|
|
_vm->_sound->command(24);
|
|
else
|
|
_vm->_sound->command(27);
|
|
break;
|
|
case 706:
|
|
case 707:
|
|
case 710:
|
|
case 711:
|
|
_vm->_sound->command(25);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene701::Scene701(MADSEngine *vm) : Scene7xx(vm) {
|
|
_fishingLineId = -1;
|
|
}
|
|
|
|
void Scene701::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_fishingLineId);
|
|
}
|
|
|
|
void Scene701::setup() {
|
|
setPlayerSpritesPrefix();
|
|
setAAName();
|
|
|
|
_scene->addActiveVocab(NOUN_BOAT);
|
|
_scene->addActiveVocab(VERB_CLIMB_INTO);
|
|
_scene->addActiveVocab(NOUN_FISHING_LINE);
|
|
_scene->addActiveVocab(VERB_WALKTO);
|
|
}
|
|
|
|
void Scene701::enter() {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
|
|
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 5));
|
|
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', 0));
|
|
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('b', 1));
|
|
_globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RM202A1");
|
|
_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 8));
|
|
|
|
if (_scene->_roomChanged) {
|
|
_game._objects.addToInventory(OBJ_BINOCULARS);
|
|
_game._objects.addToInventory(OBJ_TWINKIFRUIT);
|
|
_game._objects.addToInventory(OBJ_BOMB);
|
|
_game._objects.addToInventory(OBJ_CHICKEN);
|
|
_game._objects.addToInventory(OBJ_BONES);
|
|
|
|
_globals[kCityFlooded] = true;
|
|
_globals[kLineStatus] = LINE_TIED;
|
|
_globals[kBoatRaised] = false;
|
|
}
|
|
|
|
if (_globals[kBoatStatus] == BOAT_UNFLOODED) {
|
|
if (_globals[kBoatRaised])
|
|
_globals[kBoatStatus] = BOAT_GONE;
|
|
else if (_globals[kLineStatus] == LINE_TIED)
|
|
_globals[kBoatStatus] = BOAT_TIED_FLOATING;
|
|
else if (_game._difficulty == DIFFICULTY_HARD)
|
|
_globals[kBoatStatus] = BOAT_ADRIFT;
|
|
else
|
|
_globals[kBoatStatus] = BOAT_TIED;
|
|
}
|
|
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
|
|
int boatStatus = (_scene->_priorSceneId == 703) ? BOAT_GONE : _globals[kBoatStatus];
|
|
|
|
switch (boatStatus) {
|
|
case BOAT_TIED_FLOATING:
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 20, 0, 0, 0);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 10);
|
|
break;
|
|
case BOAT_ADRIFT:
|
|
_globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], false, 20, 0, 0, 0);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10);
|
|
break;
|
|
case BOAT_TIED: {
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
|
|
int idx = _scene->_dynamicHotspots.add(837, 759, _globals._sequenceIndexes[2], Common::Rect());
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(231, 127), FACING_NORTH);
|
|
break;
|
|
}
|
|
case BOAT_GONE:
|
|
_scene->_hotspots.activate(NOUN_BOAT, false);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (_globals[kLineStatus] == LINE_DROPPED || _globals[kLineStatus] == LINE_TIED) {
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 8);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
|
|
_fishingLineId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTHEAST);
|
|
}
|
|
|
|
if (_scene->_priorSceneId == 702) {
|
|
_game._player._playerPos = Common::Point(309, 138);
|
|
_game._player._facing = FACING_WEST;
|
|
} else if (_scene->_priorSceneId == 710) {
|
|
_game._player._playerPos = Common::Point(154, 129);
|
|
_game._player._facing = FACING_NORTH;
|
|
_game._player._visible = false;
|
|
_game._player._stepEnabled = false;
|
|
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
|
|
_scene->_sequences.addTimer(15, 60);
|
|
} else if (_scene->_priorSceneId == 703) {
|
|
_game._player._playerPos = Common::Point(231, 127);
|
|
_game._player._facing = FACING_SOUTH;
|
|
_game._player._visible = false;
|
|
_game._player._stepEnabled = false;
|
|
_scene->loadAnimation(formAnimName('B', 1), 80);
|
|
_vm->_sound->command(28);
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG && _scene->_priorSceneId != 620) {
|
|
_game._player._playerPos = Common::Point(22, 131);
|
|
_game._player._facing = FACING_EAST;
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.addTimer(60, 70);
|
|
}
|
|
|
|
_game.loadQuoteSet(0x310, 0x30F, 0);
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene701::step() {
|
|
switch(_game._trigger) {
|
|
case 60:
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[5]);
|
|
_globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
|
|
break;
|
|
|
|
case 61:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]);
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
case 70:
|
|
_vm->_sound->command(16);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
|
|
break;
|
|
|
|
case 71:
|
|
_game._player.walk(Common::Point(61, 131), FACING_EAST);
|
|
_scene->_sequences.addTimer(120, 72);
|
|
break;
|
|
|
|
case 72:
|
|
_vm->_sound->command(17);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
|
|
break;
|
|
|
|
case 73:
|
|
_game._player._stepEnabled = true;
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_kernelMessages.reset();
|
|
break;
|
|
|
|
case 80: {
|
|
_game._player._visible = true;
|
|
_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 129), FACING_NORTH);
|
|
_globals[kBoatStatus] = BOAT_TIED;
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene701::preActions() {
|
|
if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
|
|
_game._player._walkOffScreenSceneId = 702;
|
|
|
|
if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
|
|
_game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
|
|
|
|
if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_BUILDING))
|
|
_game._player.walk(Common::Point(154, 129), FACING_NORTH);
|
|
}
|
|
|
|
void Scene701::actions() {
|
|
if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM)) {
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_BUILDING) && _game._objects[OBJ_VASE]._roomNumber == 706) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1: {
|
|
int temp = _globals._sequenceIndexes[5];
|
|
_globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -2);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[5], Common::Point(155, 129));
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], temp);
|
|
_scene->_sequences.addTimer(15, 2);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
_scene->_nextSceneId = 710;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_STEP_INTO, NOUN_ELEVATOR)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_vm->_sound->command(16);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_kernelMessages.reset();
|
|
_scene->_kernelMessages.add(Common::Point(0, 0), 0x310, 34, 0, 120, _game.getQuote(0x30D));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1:
|
|
_game._player.walk(Common::Point(22, 131), FACING_EAST);
|
|
_scene->_sequences.addTimer(120, 3);
|
|
break;
|
|
|
|
case 3:
|
|
_vm->_sound->command(17);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
|
|
break;
|
|
|
|
case 4:
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_globals[kResurrectRoom] = 701;
|
|
_scene->_nextSceneId = 605;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if ((_action.isAction(VERB_PULL, NOUN_BOAT) || _action.isAction(VERB_TAKE, NOUN_BOAT) ||
|
|
_action.isAction(VERB_PULL, NOUN_FISHING_LINE) || _action.isAction(VERB_TAKE, NOUN_FISHING_LINE)) &&
|
|
!_game._objects.isInInventory(OBJ_FISHING_LINE)) {
|
|
if (_globals[kBoatStatus] == BOAT_TIED_FLOATING) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[4]);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[3]);
|
|
_scene->_dynamicHotspots.remove(_fishingLineId);
|
|
_scene->_hotspots.activate(NOUN_BOAT, false);
|
|
_game._player._visible = false;
|
|
_scene->loadAnimation(formAnimName('E', -1), 1);
|
|
break;
|
|
|
|
case 1: {
|
|
_game._player._visible = true;
|
|
_game._player._priorTimer = _scene->_animation[0]->getNextFrameTimer() - _game._player._ticksAmount;
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1);
|
|
_scene->_sequences.setDepth (_globals._sequenceIndexes[2], 9);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOAT, VERB_CLIMB_INTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(231, 127), FACING_NORTH);
|
|
_scene->_sequences.addTimer(15, 2);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
_globals[kBoatStatus] = BOAT_TIED;
|
|
_globals[kLineStatus] = LINE_NOW_UNTIED;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_globals[kBoatStatus] == BOAT_TIED) {
|
|
_vm->_dialogs->show(70125);
|
|
} else if (_globals[kLineStatus] == LINE_DROPPED) {
|
|
_globals[kLineStatus] = LINE_NOW_UNTIED;
|
|
_game._objects.addToInventory(OBJ_FISHING_LINE);
|
|
_vm->_sound->command(15);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[3]);
|
|
_vm->_dialogs->showItem(OBJ_FISHING_LINE, 70126);
|
|
} else {
|
|
_vm->_dialogs->show(70127);
|
|
}
|
|
} else if (_action.isAction(VERB_CLIMB_INTO, NOUN_BOAT) && _globals[kBoatStatus] == BOAT_TIED) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
|
|
_game._player._visible = false;
|
|
_scene->loadAnimation(formAnimName('B', 0), 1);
|
|
break;
|
|
|
|
case 1:
|
|
_scene->_nextSceneId = 703;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action._lookFlag) {
|
|
if (_globals[kBoatStatus] != BOAT_GONE) {
|
|
if (_globals[kBoatStatus] == BOAT_TIED)
|
|
_vm->_dialogs->show(70128);
|
|
else
|
|
_vm->_dialogs->show(70110);
|
|
} else
|
|
_vm->_dialogs->show(70111);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY))
|
|
_vm->_dialogs->show(70112);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR))
|
|
_vm->_dialogs->show(70113);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
|
|
_vm->_dialogs->show(70114);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_PYLON))
|
|
_vm->_dialogs->show(70115);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_HOOK)) {
|
|
if (_globals[kLineStatus] == LINE_NOT_DROPPED || _globals[kLineStatus] == LINE_NOW_UNTIED)
|
|
_vm->_dialogs->show(70116);
|
|
else
|
|
_vm->_dialogs->show(70117);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
|
|
_vm->_dialogs->show(70118);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
|
|
_vm->_dialogs->show(70119);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_EAST_END_OF_PLATFORM))
|
|
_vm->_dialogs->show(70120);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
|
|
_vm->_dialogs->show(70121);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BOAT)) {
|
|
if (_globals[kBoatStatus] == BOAT_ADRIFT || _globals[kBoatStatus] == BOAT_TIED_FLOATING)
|
|
_vm->_dialogs->show(70122);
|
|
else
|
|
_vm->_dialogs->show(70123);
|
|
} else if (_action.isAction(VERB_CAST, NOUN_FISHING_ROD, NOUN_BOAT) && _game._objects.isInInventory(OBJ_FISHING_LINE))
|
|
_vm->_dialogs->show(70124);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
void Scene702::setup() {
|
|
setPlayerSpritesPrefix();
|
|
setAAName();
|
|
}
|
|
|
|
void Scene702::enter() {
|
|
_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
|
|
|
|
if (_scene->_priorSceneId == 701) {
|
|
_game._player._playerPos = Common::Point(13, 145);
|
|
_game._player._facing = FACING_EAST;
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG && _scene->_priorSceneId != 620) {
|
|
_game._player._playerPos = Common::Point(289, 138);
|
|
_game._player.walk(Common::Point(262, 148), FACING_WEST);
|
|
_game._player._facing = FACING_WEST;
|
|
_game._player._visible = true;
|
|
}
|
|
|
|
if (_game._globals[kTeleporterCommand]) {
|
|
switch(_game._globals[kTeleporterCommand]) {
|
|
case TELEPORTER_BEAM_OUT:
|
|
case TELEPORTER_WRONG:
|
|
case TELEPORTER_STEP_OUT:
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_game._globals[kTeleporterCommand] = TELEPORTER_NONE;
|
|
}
|
|
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene702::preActions() {
|
|
if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM))
|
|
_game._player._walkOffScreenSceneId = 701;
|
|
}
|
|
|
|
void Scene702::actions() {
|
|
if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
|
|
; // Only set the action as finished
|
|
else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_scene->_nextSceneId = 711;
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT) && (!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
|
|
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
|
|
break;
|
|
case 1:
|
|
_vm->_sound->command(0xF);
|
|
if (_game._objects.isInInventory(OBJ_BONE))
|
|
_game._objects.setRoom(OBJ_BONE, 1);
|
|
_game._objects.addToInventory(OBJ_BONES);
|
|
_vm->_dialogs->show(OBJ_BONES, 70218);
|
|
break;
|
|
case 2:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[12]);
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action._lookFlag)
|
|
_vm->_dialogs->show(70210);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
|
|
_vm->_dialogs->show(70211);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_BLOCK))
|
|
_vm->_dialogs->show(70212);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
|
|
_vm->_dialogs->show(70213);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
|
|
_vm->_dialogs->show(70214);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_WEST_END_OF_PLATFORM))
|
|
_vm->_dialogs->show(70215);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
|
|
_vm->_dialogs->show(70216);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT))
|
|
_vm->_dialogs->show(70217);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._mainObjectSource == CAT_HOTSPOT)) {
|
|
if (_game._objects.isInInventory(OBJ_BONES))
|
|
_vm->_dialogs->show(70219);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_SUBMERGED_CITY))
|
|
_vm->_dialogs->show(70220);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene703::Scene703(MADSEngine *vm) : Scene7xx(vm) {
|
|
_monsterMode = -1;
|
|
_boatFrame = -1;
|
|
_curSequence = -1;
|
|
_boatDir = -1;
|
|
|
|
_useBomb = false;
|
|
_startMonsterTimer = false;
|
|
_rexDeathFl = false;
|
|
_restartTrigger70Fl = false;
|
|
|
|
_lastFrameTime = 0;
|
|
_monsterTime = 0;
|
|
}
|
|
|
|
void Scene703::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_monsterMode);
|
|
s.syncAsSint16LE(_boatFrame);
|
|
s.syncAsSint16LE(_curSequence);
|
|
s.syncAsSint16LE(_boatDir);
|
|
|
|
s.syncAsByte(_useBomb);
|
|
s.syncAsByte(_startMonsterTimer);
|
|
s.syncAsByte(_rexDeathFl);
|
|
s.syncAsByte(_restartTrigger70Fl);
|
|
|
|
s.syncAsUint32LE(_lastFrameTime);
|
|
s.syncAsUint32LE(_monsterTime);
|
|
}
|
|
|
|
void Scene703::setup() {
|
|
_game._player._spritesPrefix = "";
|
|
setAAName();
|
|
}
|
|
|
|
void Scene703::handleBottleInterface() {
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_dialog1.write(0x311, true);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 1:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 2:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 3:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, false);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene703::setBottleSequence() {
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
_game._player._stepEnabled = false;
|
|
if (_boatDir == 2)
|
|
_curSequence = 6;
|
|
else
|
|
_curSequence = 7;
|
|
}
|
|
|
|
void Scene703::handleFillBottle(int quote) {
|
|
switch (quote) {
|
|
case 0x311:
|
|
_globals[kBottleStatus] = 1;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x312:
|
|
_globals[kBottleStatus] = 2;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x313:
|
|
_globals[kBottleStatus] = 3;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x314:
|
|
_globals[kBottleStatus] = 4;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x315:
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene703::enter() {
|
|
_game._player._visible = false;
|
|
|
|
if (!_game._visitedScenes._sceneRevisited) {
|
|
if (_scene->_priorSceneId == 704)
|
|
_globals[kMonsterAlive] = false;
|
|
else
|
|
_globals[kMonsterAlive] = true;
|
|
}
|
|
|
|
_startMonsterTimer = true;
|
|
_rexDeathFl = true;
|
|
_monsterTime = 0;
|
|
_restartTrigger70Fl = true;
|
|
_useBomb = false;
|
|
_boatFrame = -1;
|
|
|
|
if (!_globals[kMonsterAlive])
|
|
_scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
|
|
|
|
if (_scene->_priorSceneId == 704) {
|
|
_game._player._stepEnabled = false;
|
|
_curSequence = 2;
|
|
_boatDir = 2;
|
|
_monsterMode = 0;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(34);
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._stepEnabled = false;
|
|
_boatDir = 1;
|
|
if (_globals[kMonsterAlive]) {
|
|
_monsterMode = 1;
|
|
_curSequence = 0;
|
|
_scene->loadAnimation(formAnimName('B', -1));
|
|
} else {
|
|
_curSequence = 0;
|
|
_monsterMode = 0;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
}
|
|
} else if (_globals[kMonsterAlive]) {
|
|
_curSequence = 0;
|
|
_boatDir = 1;
|
|
_monsterMode = 1;
|
|
_scene->loadAnimation(formAnimName('B', -1));
|
|
_scene->_animation[0]->setCurrentFrame(39);
|
|
} else if (_boatDir == 1) {
|
|
_curSequence = 0;
|
|
_monsterMode = 0;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(9);
|
|
} else if (_boatDir == 2) {
|
|
_curSequence = 0;
|
|
_monsterMode = 0;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(56);
|
|
}
|
|
|
|
if (_scene->_roomChanged) {
|
|
_game._objects.addToInventory(OBJ_TWINKIFRUIT);
|
|
_game._objects.addToInventory(OBJ_BOMB);
|
|
_game._objects.addToInventory(OBJ_CHICKEN);
|
|
_game._objects.addToInventory(OBJ_BONES);
|
|
}
|
|
|
|
_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
sceneEntrySound();
|
|
_vm->_sound->command(28);
|
|
}
|
|
|
|
void Scene703::step() {
|
|
if (_startMonsterTimer) {
|
|
long diff = _scene->_frameStartTime - _lastFrameTime;
|
|
if ((diff >= 0) && (diff <= 12))
|
|
_monsterTime += diff;
|
|
else
|
|
_monsterTime++;
|
|
|
|
_lastFrameTime = _scene->_frameStartTime;
|
|
}
|
|
|
|
if ((_monsterTime >= 2400) && !_rexDeathFl && !_useBomb) {
|
|
_startMonsterTimer = false;
|
|
_rexDeathFl = true;
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 3;
|
|
_scene->loadAnimation(formAnimName('D', -1));
|
|
_rexDeathFl = false;
|
|
_monsterTime = 0;
|
|
}
|
|
|
|
|
|
if (_game._trigger == 70)
|
|
_scene->_reloadSceneFlag = true;
|
|
|
|
if ((_monsterMode == 3) && (_scene->_animation[0] != nullptr)) {
|
|
if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
|
|
_boatFrame = _scene->_animation[0]->getCurrentFrame();
|
|
int nextBoatFrame = -1;
|
|
|
|
if (_boatFrame == 62) {
|
|
nextBoatFrame = 61;
|
|
if (_restartTrigger70Fl) {
|
|
_restartTrigger70Fl = false;
|
|
_scene->_sequences.addTimer(15, 70);
|
|
}
|
|
}
|
|
|
|
if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
|
|
_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
|
|
_boatFrame = nextBoatFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_game._trigger == 70)
|
|
_scene->_reloadSceneFlag = true;
|
|
|
|
if ((_monsterMode == 0) && (_scene->_animation[0] != nullptr)) {
|
|
if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
|
|
_boatFrame = _scene->_animation[0]->getCurrentFrame();
|
|
int nextBoatFrame = -1;
|
|
|
|
switch (_boatFrame) {
|
|
case 11:
|
|
if (_curSequence == 7) {
|
|
_curSequence = 0;
|
|
nextBoatFrame = 100;
|
|
} else if (_curSequence == 5)
|
|
nextBoatFrame = 82;
|
|
else if (_curSequence == 1)
|
|
nextBoatFrame = 11;
|
|
else {
|
|
nextBoatFrame = 9;
|
|
if (!_game._player._stepEnabled)
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
case 34:
|
|
if (_curSequence != 2)
|
|
_scene->_nextSceneId = 704;
|
|
break;
|
|
|
|
case 57:
|
|
if (_curSequence == 6) {
|
|
_curSequence = 0;
|
|
nextBoatFrame = 91;
|
|
} else if (_curSequence == 4)
|
|
nextBoatFrame = 73;
|
|
else if (_curSequence == 3)
|
|
nextBoatFrame = 57;
|
|
else {
|
|
nextBoatFrame = 56;
|
|
if (!_game._player._stepEnabled)
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
case 73:
|
|
_scene->_nextSceneId = 701;
|
|
break;
|
|
|
|
case 82:
|
|
nextBoatFrame = 11;
|
|
break;
|
|
|
|
case 91:
|
|
nextBoatFrame = 57;
|
|
break;
|
|
|
|
case 100:
|
|
nextBoatFrame = 56;
|
|
if (!_game._player._stepEnabled) {
|
|
_scene->_sequences.addTimer(30, 80);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
case 110:
|
|
nextBoatFrame = 9;
|
|
if (!_game._player._stepEnabled) {
|
|
_scene->_sequences.addTimer(30, 80);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
|
|
_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
|
|
_boatFrame = nextBoatFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_game._trigger == 80) {
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_vm->_dialogs->show(432);
|
|
break;
|
|
|
|
case 1:
|
|
_vm->_dialogs->show(70324);
|
|
break;
|
|
|
|
case 2:
|
|
_vm->_dialogs->show(70325);
|
|
break;
|
|
|
|
case 3:
|
|
_vm->_dialogs->show(70326);
|
|
break;
|
|
|
|
case 4:
|
|
_vm->_dialogs->show(70327);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if ((_monsterMode == 1) && (_scene->_animation[0] != nullptr)) {
|
|
if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
|
|
_boatFrame = _scene->_animation[0]->getCurrentFrame();
|
|
int nextBoatFrame = -1;
|
|
|
|
switch (_boatFrame) {
|
|
case 39:
|
|
_game._player._stepEnabled = true;
|
|
_startMonsterTimer = true;
|
|
_rexDeathFl = false;
|
|
break;
|
|
|
|
case 40:
|
|
case 49:
|
|
case 54:
|
|
case 67:
|
|
case 78:
|
|
case 87:
|
|
case 96:
|
|
case 105:
|
|
case 114:
|
|
case 123:
|
|
if (_curSequence == 8)
|
|
nextBoatFrame = 129;
|
|
|
|
break;
|
|
|
|
case 129:
|
|
nextBoatFrame = 39;
|
|
break;
|
|
|
|
case 151:
|
|
_scene->_nextSceneId = 701;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
|
|
_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
|
|
_boatFrame = nextBoatFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((_monsterMode == 2) && (_scene->_animation[0] != nullptr)) {
|
|
if (_scene->_animation[0]->getCurrentFrame() != _boatFrame) {
|
|
_boatFrame = _scene->_animation[0]->getCurrentFrame();
|
|
int nextBoatFrame = -1;
|
|
|
|
switch (_boatFrame) {
|
|
case 14:
|
|
if (!_useBomb) {
|
|
if (_game._difficulty == DIFFICULTY_HARD)
|
|
_game._objects.setRoom(OBJ_CHICKEN, 1);
|
|
else
|
|
_vm->_dialogs->show(70319);
|
|
}
|
|
nextBoatFrame = 80;
|
|
break;
|
|
|
|
case 33:
|
|
if (_game._objects.isInInventory(OBJ_BONES)) {
|
|
_game._objects.setRoom(OBJ_BONES, 1);
|
|
_game._objects.addToInventory(OBJ_BONE);
|
|
} else
|
|
_game._objects.setRoom(OBJ_BONE, 1);
|
|
|
|
nextBoatFrame = 80;
|
|
break;
|
|
|
|
case 53:
|
|
_game._objects.setRoom(OBJ_TWINKIFRUIT, 1);
|
|
nextBoatFrame = 80;
|
|
_curSequence = 9;
|
|
break;
|
|
|
|
case 80:
|
|
if (_game._difficulty == DIFFICULTY_HARD) {
|
|
_game._objects.setRoom(OBJ_BOMB, 1);
|
|
_vm->_dialogs->show(70318);
|
|
} else
|
|
_vm->_dialogs->show(70317);
|
|
|
|
_scene->freeAnimation();
|
|
_monsterMode = 1;
|
|
_scene->loadAnimation(formAnimName('B', -1));
|
|
_scene->_animation[0]->setCurrentFrame(39);
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
case 91:
|
|
if (!_useBomb) {
|
|
_scene->freeAnimation();
|
|
_monsterMode = 1;
|
|
_scene->loadAnimation(formAnimName('B', -1));
|
|
_scene->_animation[0]->setCurrentFrame(39);
|
|
_game._player._stepEnabled = true;
|
|
} else
|
|
_game._objects.setRoom(OBJ_CHICKEN_BOMB, 1);
|
|
|
|
break;
|
|
|
|
case 126:
|
|
_scene->_hotspots.activate(NOUN_SEA_MONSTER, false);
|
|
_globals[kMonsterAlive] = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 0;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(9);
|
|
_game._player._stepEnabled = true;
|
|
if (_game._storyMode == STORYMODE_NAUGHTY)
|
|
_vm->_dialogs->show(70321);
|
|
else
|
|
_vm->_dialogs->show(70322);
|
|
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((nextBoatFrame >= 0) && (nextBoatFrame != _scene->_animation[0]->getCurrentFrame())) {
|
|
_scene->_animation[0]->setCurrentFrame(nextBoatFrame);
|
|
_boatFrame = nextBoatFrame;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene703::actions() {
|
|
if (_game._screenObjects._inputMode == kInputConversation)
|
|
handleFillBottle(_action._activeAction._verbId);
|
|
else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_DOCK_TO_SOUTH)) {
|
|
_game._player._stepEnabled = false;
|
|
if (_globals[kMonsterAlive])
|
|
_curSequence = 8;
|
|
else if (_boatDir == 1)
|
|
_curSequence = 5;
|
|
else
|
|
_curSequence = 3;
|
|
} else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
|
|
_game._player._stepEnabled = false;
|
|
if (_globals[kMonsterAlive]) {
|
|
_startMonsterTimer = false;
|
|
_rexDeathFl = true;
|
|
_monsterTime = 0;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 3;
|
|
_scene->loadAnimation(formAnimName('D', -1));
|
|
} else if (_boatDir == 2)
|
|
_curSequence = 4;
|
|
else
|
|
_curSequence = 1;
|
|
} else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_SEA_MONSTER) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_SEA_MONSTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 2;
|
|
_scene->loadAnimation(formAnimName('C', -1));
|
|
_scene->_animation[0]->setCurrentFrame(19);
|
|
} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN, NOUN_SEA_MONSTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 2;
|
|
_scene->loadAnimation(formAnimName('C', -1));
|
|
} else if (_action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_SEA_MONSTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 2;
|
|
_scene->loadAnimation(formAnimName('C', -1));
|
|
_scene->_animation[0]->setCurrentFrame(39);
|
|
} else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SEA_MONSTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 2;
|
|
_scene->loadAnimation(formAnimName('C', -1));
|
|
_scene->_animation[0]->setCurrentFrame(59);
|
|
} else if (_action.isAction(VERB_THROW, NOUN_CHICKEN_BOMB, NOUN_SEA_MONSTER)) {
|
|
_useBomb = true;
|
|
_game._player._stepEnabled = false;
|
|
_scene->freeAnimation();
|
|
_monsterMode = 2;
|
|
_scene->loadAnimation(formAnimName('C', -1));
|
|
} else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
|
|
if (_globals[kBottleStatus] != 4) {
|
|
handleBottleInterface();
|
|
_dialog1.start();
|
|
} else
|
|
_vm->_dialogs->show(70323);
|
|
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_SEA_MONSTER)) {
|
|
if (_globals[kMonsterAlive])
|
|
_vm->_dialogs->show(70310);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_WATER)) {
|
|
if (!_globals[kMonsterAlive])
|
|
_vm->_dialogs->show(70311);
|
|
else
|
|
_vm->_dialogs->show(70312);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_NORTH)) {
|
|
if (_globals[kMonsterAlive])
|
|
_vm->_dialogs->show(70313);
|
|
else if (_game._visitedScenes.exists(710))
|
|
_vm->_dialogs->show(70314);
|
|
else
|
|
_vm->_dialogs->show(70315);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
|
|
_vm->_dialogs->show(70316);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene704::Scene704(MADSEngine *vm) : Scene7xx(vm) {
|
|
_bottleHotspotId = -1;
|
|
_boatCurrentFrame = -1;
|
|
_animationMode = -1;
|
|
_boatDirection = -1;
|
|
|
|
_takeBottleFl = false;
|
|
}
|
|
|
|
void Scene704::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_bottleHotspotId);
|
|
s.syncAsSint16LE(_boatCurrentFrame);
|
|
s.syncAsSint16LE(_animationMode);
|
|
s.syncAsSint16LE(_boatDirection);
|
|
|
|
s.syncAsByte(_takeBottleFl);
|
|
}
|
|
|
|
void Scene704::setup() {
|
|
_game._player._spritesPrefix = "";
|
|
setAAName();
|
|
_scene->addActiveVocab(NOUN_BOTTLE);
|
|
_scene->addActiveVocab(VERB_LOOK_AT);
|
|
}
|
|
|
|
void Scene704::handleBottleInterface() {
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_dialog1.write(0x311, true);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 1:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 2:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 3:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, false);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene704::setBottleSequence() {
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
_game._player._stepEnabled = false;
|
|
if (_boatDirection == 2)
|
|
_animationMode = 6;
|
|
else
|
|
_animationMode = 7;
|
|
}
|
|
|
|
void Scene704::handleFillBottle(int quote) {
|
|
switch (quote) {
|
|
case 0x311:
|
|
_globals[kBottleStatus] = 1;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x312:
|
|
_globals[kBottleStatus] = 2;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x313:
|
|
_globals[kBottleStatus] = 3;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x314:
|
|
_globals[kBottleStatus] = 4;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x315:
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene704::enter() {
|
|
if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
|
|
if (_scene->_priorSceneId == 705) {
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
|
|
} else {
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(190, 122));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
|
|
}
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_LOOK_AT, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
|
|
_bottleHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE);
|
|
}
|
|
|
|
_game._player._visible = false;
|
|
_takeBottleFl = false;
|
|
_boatCurrentFrame = -1;
|
|
|
|
if (_scene->_priorSceneId == 705) {
|
|
_game._player._stepEnabled = false;
|
|
_animationMode = 2;
|
|
_boatDirection = 2;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(36);
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._stepEnabled = false;
|
|
_boatDirection = 1;
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
} else if (_boatDirection == 1) {
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(8);
|
|
} else if (_boatDirection == 2) {
|
|
if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId) {
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(123, 125));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1);
|
|
}
|
|
_scene->loadAnimation(formAnimName('A', -1));
|
|
_scene->_animation[0]->setCurrentFrame(57);
|
|
}
|
|
|
|
if (_scene->_roomChanged)
|
|
_globals[kMonsterAlive] = false;
|
|
|
|
_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
|
|
sceneEntrySound();
|
|
_vm->_sound->command(28);
|
|
}
|
|
|
|
void Scene704::step() {
|
|
if (_scene->_animation[0] != nullptr) {
|
|
if (_scene->_animation[0]->getCurrentFrame() != _boatCurrentFrame) {
|
|
_boatCurrentFrame = _scene->_animation[0]->getCurrentFrame();
|
|
int nextFrame = -1;
|
|
|
|
switch (_boatCurrentFrame) {
|
|
case 10:
|
|
switch (_animationMode) {
|
|
case 1:
|
|
nextFrame = 10;
|
|
break;
|
|
case 5:
|
|
nextFrame = 74;
|
|
break;
|
|
case 7:
|
|
_animationMode = 0;
|
|
nextFrame = 92;
|
|
break;
|
|
default:
|
|
if (!_game._player._stepEnabled)
|
|
_game._player._stepEnabled = true;
|
|
|
|
nextFrame = 8;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 36:
|
|
if (_animationMode != 2)
|
|
_scene->_nextSceneId = 705;
|
|
break;
|
|
|
|
case 59:
|
|
switch (_animationMode) {
|
|
case 3:
|
|
nextFrame = 59;
|
|
break;
|
|
|
|
case 4:
|
|
nextFrame = 65;
|
|
break;
|
|
|
|
case 6:
|
|
_animationMode = 0;
|
|
nextFrame = 83;
|
|
break;
|
|
|
|
default:
|
|
if (!_game._player._stepEnabled) {
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
nextFrame = 57;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 65:
|
|
_scene->_nextSceneId = 703;
|
|
break;
|
|
|
|
case 74:
|
|
nextFrame = 10;
|
|
break;
|
|
|
|
case 83:
|
|
nextFrame = 59;
|
|
break;
|
|
|
|
case 90:
|
|
if (_takeBottleFl) {
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_scene->_dynamicHotspots.remove(_bottleHotspotId);
|
|
_game._objects.addToInventory(OBJ_BOTTLE);
|
|
_vm->_sound->command(15);
|
|
_vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
|
|
}
|
|
break;
|
|
|
|
case 92:
|
|
nextFrame = 57;
|
|
if (!_game._player._stepEnabled && !_takeBottleFl) {
|
|
_scene->_sequences.addTimer(30, 70);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
case 98:
|
|
if (_takeBottleFl) {
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_scene->_dynamicHotspots.remove(_bottleHotspotId);
|
|
_game._objects.addToInventory(OBJ_BOTTLE);
|
|
_vm->_sound->command(15);
|
|
_vm->_dialogs->showItem(OBJ_BOTTLE, 70415);
|
|
}
|
|
break;
|
|
|
|
case 101:
|
|
nextFrame = 8;
|
|
if (!_game._player._stepEnabled && !_takeBottleFl) {
|
|
_scene->_sequences.addTimer(30, 70);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((nextFrame >= 0) && (nextFrame != _scene->_animation[0]->getCurrentFrame())) {
|
|
_scene->_animation[0]->setCurrentFrame(nextFrame);
|
|
_boatCurrentFrame = nextFrame;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_game._trigger == 70) {
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_vm->_dialogs->show(432);
|
|
break;
|
|
|
|
case 1:
|
|
_vm->_dialogs->show(70324);
|
|
break;
|
|
|
|
case 2:
|
|
_vm->_dialogs->show(70325);
|
|
break;
|
|
|
|
case 3:
|
|
_vm->_dialogs->show(70326);
|
|
break;
|
|
|
|
case 4:
|
|
_vm->_dialogs->show(70327);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene704::actions() {
|
|
if (_game._screenObjects._inputMode == kInputConversation)
|
|
handleFillBottle(_action._activeAction._verbId);
|
|
else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
|
|
_game._player._stepEnabled = false;
|
|
if (_boatDirection == 1)
|
|
_animationMode = 5;
|
|
else
|
|
_animationMode = 3;
|
|
} else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_BUILDING_TO_NORTH)) {
|
|
_game._player._stepEnabled = false;
|
|
if (_boatDirection == 2)
|
|
_animationMode = 4;
|
|
else
|
|
_animationMode = 1;
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_BOTTLE)) {
|
|
if (!_game._objects.isInInventory(OBJ_BOTTLE)) {
|
|
_game._player._stepEnabled = false;
|
|
_takeBottleFl = true;
|
|
if (_boatDirection == 2) {
|
|
_animationMode = 6;
|
|
} else {
|
|
_animationMode = 7;
|
|
}
|
|
}
|
|
} else if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER)) {
|
|
if (_game._objects.isInInventory(OBJ_BOTTLE)) {
|
|
if (_globals[kBottleStatus] != 4) {
|
|
_takeBottleFl = false;
|
|
handleBottleInterface();
|
|
_dialog1.start();
|
|
} else
|
|
_vm->_dialogs->show(70323);
|
|
}
|
|
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_WATER))
|
|
_vm->_dialogs->show(70410);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BUILDING_TO_NORTH)) {
|
|
if (_game._visitedScenes.exists(710))
|
|
_vm->_dialogs->show(70411);
|
|
else
|
|
_vm->_dialogs->show(70412);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
|
|
_vm->_dialogs->show(70413);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT))
|
|
_vm->_dialogs->show(70414);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH))
|
|
_vm->_dialogs->show(70416);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_SKY))
|
|
_vm->_dialogs->show(70417);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
void Scene705::setup() {
|
|
_game._player._spritesPrefix = "";
|
|
setAAName();
|
|
}
|
|
|
|
void Scene705::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
}
|
|
|
|
void Scene705::handleBottleInterface() {
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_dialog1.write(0x311, true);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 1:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, true);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 2:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, true);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
case 3:
|
|
_dialog1.write(0x311, false);
|
|
_dialog1.write(0x312, false);
|
|
_dialog1.write(0x313, false);
|
|
_dialog1.write(0x314, true);
|
|
_dialog1.write(0x315, true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene705::setBottleSequence() {
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[3]);
|
|
_game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON;
|
|
_scene->loadAnimation(formAnimName('F', -1), 90);
|
|
}
|
|
|
|
void Scene705::handleFillBottle(int quote) {
|
|
switch (quote) {
|
|
case 0x311:
|
|
_globals[kBottleStatus] = 1;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x312:
|
|
_globals[kBottleStatus] = 2;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x313:
|
|
_globals[kBottleStatus] = 3;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x314:
|
|
_globals[kBottleStatus] = 4;
|
|
setBottleSequence();
|
|
break;
|
|
|
|
case 0x315:
|
|
_scene->_userInterface.setup(kInputBuildingSentences);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene705::enter() {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0));
|
|
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1));
|
|
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0));
|
|
|
|
_game._player._visible = false;
|
|
|
|
if (_scene->_priorSceneId == 706) {
|
|
_game._player._stepEnabled = false;
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.addTimer(1, 80);
|
|
_vm->_sound->command(28);
|
|
} else
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
|
|
|
|
if (_scene->_roomChanged)
|
|
_game._objects.addToInventory(OBJ_BOTTLE);
|
|
|
|
_game.loadQuoteSet(0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
_dialog1.setup(0x98, 0x311, 0x312, 0x313, 0x314, 0x315, 0);
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene705::step() {
|
|
switch (_game._trigger) {
|
|
case 70:
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
|
|
break;
|
|
|
|
case 71: {
|
|
int syncIdx = _globals._sequenceIndexes[3];
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
switch (_game._trigger) {
|
|
case 80:
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 1, 0, 0);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81);
|
|
break;
|
|
|
|
case 81: {
|
|
_vm->_sound->command(19);
|
|
int syncIdx = _globals._sequenceIndexes[1];
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
switch (_game._trigger) {
|
|
case 90:
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1);
|
|
_scene->_sequences.addTimer(30, 91);
|
|
break;
|
|
|
|
case 91:
|
|
switch (_globals[kBottleStatus]) {
|
|
case 0:
|
|
_vm->_dialogs->show(432);
|
|
break;
|
|
|
|
case 1:
|
|
_vm->_dialogs->show(70324);
|
|
break;
|
|
|
|
case 2:
|
|
_vm->_dialogs->show(70325);
|
|
break;
|
|
|
|
case 3:
|
|
_vm->_dialogs->show(70326);
|
|
break;
|
|
|
|
case 4:
|
|
_vm->_dialogs->show(70327);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene705::actions() {
|
|
if (_game._screenObjects._inputMode == kInputConversation)
|
|
handleFillBottle(_action._activeAction._verbId);
|
|
else if (_action.isAction(VERB_STEER_TOWARDS, NOUN_OPEN_WATER_TO_SOUTH)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[3]);
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
_vm->_sound->command(18);
|
|
break;
|
|
|
|
case 1: {
|
|
int syncIdx = _globals._sequenceIndexes[2];
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 2);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
|
|
_scene->_nextSceneId = 704;
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_CLIMB_THROUGH, NOUN_WINDOW)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[3]);
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 16);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1: {
|
|
int syncIdx = _globals._sequenceIndexes[3];
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 16);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx);
|
|
_scene->_nextSceneId = 706;
|
|
_game._player._stepEnabled = true;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_FILL, NOUN_BOTTLE, NOUN_WATER) || _action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_WATER)) {
|
|
if (_globals[kBottleStatus] != 4) {
|
|
handleBottleInterface();
|
|
_dialog1.start();
|
|
} else
|
|
_vm->_dialogs->show(70323);
|
|
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_WATER))
|
|
_vm->_dialogs->show(70511);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_VOLCANO_RIM))
|
|
_vm->_dialogs->show(70512);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_OPEN_WATER_TO_SOUTH))
|
|
_vm->_dialogs->show(70513);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_SKY))
|
|
_vm->_dialogs->show(70514);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BUILDING))
|
|
_vm->_dialogs->show(70515);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_WINDOW))
|
|
_vm->_dialogs->show(70516);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene706::Scene706(MADSEngine *vm) : Scene7xx(vm) {
|
|
_vaseHotspotId = -1;
|
|
_vaseMode = -1;
|
|
_animationMode = -1;
|
|
_animationFrame = -1;
|
|
|
|
_emptyPedestral = false;
|
|
}
|
|
|
|
void Scene706::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_vaseHotspotId);
|
|
s.syncAsSint16LE(_vaseMode);
|
|
s.syncAsSint16LE(_animationMode);
|
|
s.syncAsSint16LE(_animationFrame);
|
|
|
|
s.syncAsByte(_emptyPedestral);
|
|
}
|
|
|
|
void Scene706::setup() {
|
|
setPlayerSpritesPrefix();
|
|
setAAName();
|
|
_scene->addActiveVocab(NOUN_BOTTLE);
|
|
_scene->addActiveVocab(NOUN_VASE);
|
|
_scene->addActiveVocab(VERB_WALKTO);
|
|
}
|
|
|
|
void Scene706::handleRexDeath() {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_scene->loadAnimation(formAnimName('a', -1), 2);
|
|
break;
|
|
|
|
case 2:
|
|
if (_animationMode == 1)
|
|
_vm->_dialogs->show(70625);
|
|
else if (_globals[kBottleStatus] < 2)
|
|
_vm->_dialogs->show(70628);
|
|
else
|
|
_vm->_dialogs->show(70629);
|
|
|
|
_game._objects.setRoom(OBJ_VASE, _scene->_currentSceneId);
|
|
if (_animationMode == 2)
|
|
_game._objects.setRoom(OBJ_BOTTLE, 2);
|
|
|
|
_animationMode = 0;
|
|
_scene->_reloadSceneFlag = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene706::handleTakeVase() {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 4, 2, 0, 0);
|
|
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 7, 1);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
|
|
break;
|
|
|
|
case 1:
|
|
_vm->_sound->command(9);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_scene->_dynamicHotspots.remove(_vaseHotspotId);
|
|
_game._objects.addToInventory(OBJ_VASE);
|
|
if (_vaseMode == 1) {
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
|
|
_game._objects.setRoom(OBJ_BOTTLE, _scene->_currentSceneId);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]);
|
|
_game._player._visible = true;
|
|
_vm->_dialogs->showItem(OBJ_VASE, 70630);
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene706::enter() {
|
|
_globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_3");
|
|
_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1));
|
|
|
|
if (!_game._visitedScenes._sceneRevisited)
|
|
_emptyPedestral = false;
|
|
|
|
if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId) {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('v', -1));
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 4);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_VASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
|
|
_vaseHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
|
|
} else if (_game._objects.isInRoom(OBJ_BOTTLE)) {
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
|
|
}
|
|
|
|
_game._player._visible = true;
|
|
|
|
if (_scene->_priorSceneId == 707) {
|
|
_game._player._playerPos = Common::Point(277, 103);
|
|
_game._player._facing = FACING_SOUTHWEST;
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._playerPos = Common::Point(167, 152);
|
|
_game._player._facing = FACING_NORTH;
|
|
}
|
|
|
|
if (_globals[kTeleporterCommand]) {
|
|
_game._player._visible = false;
|
|
_game._player._stepEnabled = false;
|
|
|
|
switch (_globals[kTeleporterCommand]) {
|
|
case 1:
|
|
_scene->loadAnimation(formAnimName('E', 1), 75);
|
|
break;
|
|
|
|
case 2:
|
|
_scene->loadAnimation(formAnimName('E', -1), 80);
|
|
break;
|
|
|
|
default:
|
|
_game._player.walk(Common::Point(264, 116), FACING_SOUTHWEST);
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
}
|
|
_globals[kTeleporterCommand] = 0;
|
|
}
|
|
|
|
_animationMode = 0;
|
|
|
|
if (_scene->_roomChanged) {
|
|
_game._objects.addToInventory(OBJ_BOTTLE);
|
|
_globals[kBottleStatus] = 2;
|
|
}
|
|
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene706::step() {
|
|
if (_game._trigger == 75) {
|
|
_game._player._stepEnabled = true;
|
|
_game._player._visible = true;
|
|
_game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount;
|
|
_game._player.walk(Common::Point(264, 116), FACING_SOUTHWEST);
|
|
}
|
|
|
|
if (_game._trigger == 80) {
|
|
_globals[kTeleporterCommand] = 1;
|
|
_scene->_nextSceneId = _globals[kTeleporterDestination];
|
|
_scene->_reloadSceneFlag = true;
|
|
}
|
|
|
|
if (_scene->_animation[0] != nullptr) {
|
|
if ((_animationMode != 0) && (_scene->_animation[0]->getCurrentFrame() != _animationFrame)) {
|
|
_animationFrame = _scene->_animation[0]->getCurrentFrame();
|
|
|
|
if (_animationFrame == 6) {
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_game._objects.setRoom(OBJ_VASE, 2);
|
|
|
|
if (_animationMode == 2) {
|
|
_game._objects.setRoom(OBJ_BOTTLE, 1);
|
|
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[4], 4);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(195, 99));
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_BOTTLE, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(175, 124), FACING_SOUTHEAST);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene706::preActions() {
|
|
if (_action.isAction(VERB_LOOK, NOUN_PORTRAIT))
|
|
_game._player._needToWalk = true;
|
|
}
|
|
|
|
void Scene706::actions() {
|
|
if (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_scene->_nextSceneId = 707;
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
|
|
if (_action.isAction(VERB_EXIT, NOUN_ROOM)) {
|
|
_scene->_nextSceneId = 705;
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
|
|
if (_action.isAction(VERB_TAKE, NOUN_VASE)) {
|
|
if (_game._difficulty != DIFFICULTY_EASY) {
|
|
_animationMode = 1;
|
|
handleRexDeath();
|
|
} else if (_game._trigger || !_game._objects.isInInventory(OBJ_VASE)) {
|
|
handleTakeVase();
|
|
_emptyPedestral = true;
|
|
}
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
|
|
if (_action.isAction(VERB_PUT, NOUN_BOTTLE, NOUN_PEDESTAL)) {
|
|
if ((_globals[kBottleStatus] == 2 && _game._difficulty == DIFFICULTY_HARD) ||
|
|
(_globals[kBottleStatus] != 0 && _game._difficulty != DIFFICULTY_HARD)) {
|
|
if (!_game._objects.isInInventory(OBJ_VASE) || _game._trigger) {
|
|
_vaseMode = 1;
|
|
handleTakeVase();
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
} else if (_game._objects.isInRoom(OBJ_VASE) || _game._trigger) {
|
|
_animationMode = 2;
|
|
handleRexDeath();
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (_action.isAction(VERB_PUT, NOUN_PEDESTAL) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) {
|
|
int objectId = _game._objects.getIdFromDesc(_action._activeAction._objectNameId);
|
|
if (_game._objects[objectId].hasQuality(10))
|
|
_vm->_dialogs->show(70626);
|
|
else
|
|
_vm->_dialogs->show(70627);
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_BOTTLE) && _game._objects.isInInventory(OBJ_VASE))
|
|
_vm->_dialogs->show(70631);
|
|
else if (_action._lookFlag) {
|
|
if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
|
|
_vm->_dialogs->show(70610);
|
|
else
|
|
_vm->_dialogs->show(70611);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_FLOOR))
|
|
_vm->_dialogs->show(70612);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PILLAR))
|
|
_vm->_dialogs->show(70613);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_OLD_TEA_CUP))
|
|
_vm->_dialogs->show(70614);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_OLD_TEA_CUP))
|
|
_vm->_dialogs->show(70615);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_OLD_VASE))
|
|
_vm->_dialogs->show(70616);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PORTRAIT))
|
|
_vm->_dialogs->show(70617);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_NAME_PLATE))
|
|
_vm->_dialogs->show(70618);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_WALL))
|
|
_vm->_dialogs->show(70619);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PEDESTAL)) {
|
|
if (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId)
|
|
_vm->_dialogs->show(70620);
|
|
else if (_game._objects[OBJ_BOTTLE]._roomNumber == _scene->_currentSceneId)
|
|
_vm->_dialogs->show(70622);
|
|
else
|
|
_vm->_dialogs->show(70621);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
|
|
_vm->_dialogs->show(70623);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_VASE) && (_game._objects[OBJ_VASE]._roomNumber == _scene->_currentSceneId))
|
|
_vm->_dialogs->show(70624);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BOTTLE) && (_action._mainObjectSource == CAT_HOTSPOT))
|
|
_vm->_dialogs->show(70632);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
void Scene707::setup() {
|
|
_game._player._spritesPrefix = "";
|
|
// The original calls Scene7xx::setAAName()
|
|
_game._aaName = Resources::formatAAName(5);
|
|
}
|
|
|
|
void Scene707::enter() {
|
|
_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
|
|
teleporterEnter();
|
|
|
|
// The original uses Scene7xx_sceneEntrySound
|
|
if (!_vm->_musicFlag)
|
|
_vm->_sound->command(2);
|
|
else
|
|
_vm->_sound->command(25);
|
|
}
|
|
|
|
void Scene707::step() {
|
|
teleporterStep();
|
|
}
|
|
|
|
void Scene707::actions() {
|
|
if (teleporterActions()) {
|
|
_action._inProgress = false;
|
|
return;
|
|
}
|
|
|
|
if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT))
|
|
_vm->_dialogs->show(70710);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD))
|
|
_vm->_dialogs->show(70711);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY))
|
|
_vm->_dialogs->show(70712);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_0_KEY) || _action.isAction(VERB_LOOK, NOUN_1_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_2_KEY) || _action.isAction(VERB_LOOK, NOUN_3_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_4_KEY) || _action.isAction(VERB_LOOK, NOUN_5_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_6_KEY) || _action.isAction(VERB_LOOK, NOUN_7_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_8_KEY) || _action.isAction(VERB_LOOK, NOUN_9_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_SMILE_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)
|
|
|| _action.isAction(VERB_LOOK, NOUN_FROWN_KEY))
|
|
_vm->_dialogs->show(70713);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_DEVICE) || _action._lookFlag)
|
|
_vm->_dialogs->show(70714);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
void Scene710::setup() {
|
|
_game._player._spritesPrefix = "";
|
|
setAAName();
|
|
}
|
|
|
|
void Scene710::enter() {
|
|
_scene->_userInterface.setup(kInputLimitedSentences);
|
|
|
|
if (_game._objects[OBJ_VASE]._roomNumber == 706) {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1));
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0);
|
|
}
|
|
|
|
_game._player._visible = false;
|
|
_scene->_sequences.addTimer(600, 70);
|
|
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene710::step() {
|
|
if (_game._trigger == 70) {
|
|
if (_game._globals[kCityFlooded])
|
|
_scene->_nextSceneId = 701;
|
|
else
|
|
_scene->_nextSceneId = 751;
|
|
}
|
|
}
|
|
|
|
void Scene710::actions() {
|
|
if (_action.isAction(VERB_PUT_DOWN, NOUN_BINOCULARS)) {
|
|
_game._player._stepEnabled = false;
|
|
|
|
if (_game._globals[kCityFlooded])
|
|
_scene->_nextSceneId = 701;
|
|
else
|
|
_scene->_nextSceneId = 751;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
void Scene711::setup() {
|
|
// The original was calling Scene7xx::setPlayerSpreitesPrefix()
|
|
_vm->_sound->command(5);
|
|
Common::String oldName = _game._player._spritesPrefix;
|
|
_game._player._spritesPrefix = "";
|
|
_game._player._scalingVelocity = true;
|
|
|
|
if (oldName != _game._player._spritesPrefix)
|
|
_game._player._spritesChanged = true;
|
|
|
|
_vm->_palette->setEntry(16, 10, 63, 63);
|
|
_vm->_palette->setEntry(17, 10, 45, 45);
|
|
|
|
// The original was calling Scene7xx::setAAName()
|
|
_game._aaName = Resources::formatAAName(5);
|
|
|
|
_game._player._spritesPrefix = "";
|
|
}
|
|
|
|
void Scene711::enter() {
|
|
if (_globals[kSexOfRex] == REX_FEMALE)
|
|
_handSpriteId = _scene->_sprites.addSprites("*ROXHAND");
|
|
else
|
|
_handSpriteId = _scene->_sprites.addSprites("*REXHAND");
|
|
|
|
teleporterEnter();
|
|
|
|
// The original was using Scene7xx_SceneEntrySound()
|
|
if (!_vm->_musicFlag)
|
|
_vm->_sound->command(2);
|
|
else
|
|
_vm->_sound->command(25);
|
|
}
|
|
|
|
void Scene711::step() {
|
|
teleporterStep();
|
|
}
|
|
|
|
void Scene711::actions() {
|
|
if (teleporterActions())
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene751::Scene751(MADSEngine *vm) : Scene7xx(vm) {
|
|
_rexHandingLine = false;
|
|
}
|
|
|
|
void Scene751::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsByte(_rexHandingLine);
|
|
}
|
|
|
|
void Scene751::setup() {
|
|
setPlayerSpritesPrefix();
|
|
setAAName();
|
|
_scene->addActiveVocab(NOUN_FISHING_LINE);
|
|
_scene->addActiveVocab(VERB_WALKTO);
|
|
}
|
|
|
|
void Scene751::enter() {
|
|
_globals._spriteIndexes[1] = _scene->_sprites.addSprites("*RM701X0");
|
|
_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0));
|
|
_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('f', 0));
|
|
_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RM202A1");
|
|
|
|
if (!_game._visitedScenes._sceneRevisited)
|
|
_rexHandingLine = false;
|
|
|
|
if (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3) {
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
|
|
}
|
|
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
|
|
if (_scene->_priorSceneId == 752) {
|
|
_game._player._playerPos = Common::Point(309, 138);
|
|
_game._player._facing = FACING_WEST;
|
|
} else if (_scene->_priorSceneId == 710) {
|
|
_game._player._playerPos = Common::Point(154, 129);
|
|
_game._player._facing = FACING_NORTH;
|
|
_game._player._visible = false;
|
|
_game._player._stepEnabled = false;
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
|
|
_scene->_sequences.addTimer(15, 70);
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._playerPos = Common::Point(22, 131);
|
|
_game._player._facing = FACING_EAST;
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.addTimer(60, 60);
|
|
} else if (_rexHandingLine) {
|
|
_game._player._visible = false;
|
|
_game._player._playerPos = Common::Point(268, 140);
|
|
_game._player._facing = FACING_NORTHWEST;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
|
|
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]);
|
|
} else if (_globals[kLineStatus] == 2) {
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
|
|
}
|
|
|
|
if (_scene->_roomChanged) {
|
|
_game._objects.addToInventory(OBJ_FISHING_LINE);
|
|
_game._objects.addToInventory(OBJ_BINOCULARS);
|
|
}
|
|
|
|
sceneEntrySound();
|
|
_game.loadQuoteSet(0x30A, 0x30B, 0x30C, 0x30D, 0x30E, 0);
|
|
|
|
if (_globals[kTimebombTimer] > 0)
|
|
_globals[kTimebombTimer] = 10200;
|
|
}
|
|
|
|
void Scene751::step() {
|
|
switch (_game._trigger) {
|
|
case 70:
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[4]);
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
|
|
break;
|
|
|
|
case 71:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]);
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((_globals[kTimebombTimer] >= 10800) && (_globals[kTimebombStatus] == 1)) {
|
|
_globals[kTimebombStatus] = 3;
|
|
_globals[kTimebombTimer] = 0;
|
|
_globals[kCheckDaemonTimebomb] = false;
|
|
_scene->_nextSceneId = 620;
|
|
}
|
|
|
|
switch (_game._trigger) {
|
|
case 60:
|
|
_vm->_sound->command(16);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 61);
|
|
break;
|
|
|
|
case 61:
|
|
_game._player.walk(Common::Point(61, 131), FACING_EAST);
|
|
_scene->_sequences.addTimer(120, 62);
|
|
break;
|
|
|
|
case 62:
|
|
_vm->_sound->command(17);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 63);
|
|
break;
|
|
|
|
case 63:
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_game._player._stepEnabled = true;
|
|
_scene->_kernelMessages.reset();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Scene751::preActions() {
|
|
if (_action.isAction(VERB_LOOK, NOUN_TALL_BUILDING))
|
|
_game._player.walk(Common::Point(154, 129), FACING_NORTHEAST);
|
|
|
|
if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_TALL_BUILDING))
|
|
_game._player.walk(Common::Point(154, 129), FACING_NORTH);
|
|
|
|
if (_action.isAction(VERB_WALKTO, NOUN_EAST_END_OF_PLATFORM))
|
|
_game._player._walkOffScreenSceneId = 752;
|
|
|
|
if (!_rexHandingLine)
|
|
return;
|
|
|
|
if (_action.isAction(VERB_LOOK) || _action.isObject(NOUN_FISHING_LINE) || _action.isAction(VERB_TALKTO))
|
|
_game._player._needToWalk = false;
|
|
|
|
if ((!_action.isAction(VERB_PUT, NOUN_FISHING_LINE, NOUN_HOOK) || !_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_HOOK) || !_action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_HOOK))
|
|
&& (_game._player._needToWalk)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._readyToWalk = false;
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 11, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 7);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
|
|
_game._player._visible = true;
|
|
_rexHandingLine = false;
|
|
_game._player._stepEnabled = true;
|
|
_game._player._readyToWalk = true;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Scene751::actions() {
|
|
if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
|
|
; // Nothing
|
|
else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_TALL_BUILDING)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1: {
|
|
int syncIdx = _globals._sequenceIndexes[4];
|
|
_globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(155, 129));
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx);
|
|
_scene->_sequences.addTimer(15, 2);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
_scene->_nextSceneId = 710;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_STEP_INTO, NOUN_ELEVATOR)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[1]);
|
|
_vm->_sound->command(16);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_kernelMessages.reset();
|
|
_scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x30D));
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1:
|
|
_game._player.walk(Common::Point(22, 131), FACING_EAST);
|
|
_scene->_sequences.addTimer(120, 3);
|
|
break;
|
|
|
|
case 3:
|
|
_vm->_sound->command(17);
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 5, 1, 0, 0);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 4);
|
|
break;
|
|
|
|
case 4:
|
|
_globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1);
|
|
_scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(48, 136));
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10);
|
|
_scene->_sequences.addTimer(60, 5);
|
|
break;
|
|
|
|
case 5:
|
|
_game._player._stepEnabled = true;
|
|
_scene->_nextSceneId = 513;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_PUT, NOUN_FISHING_LINE, NOUN_HOOK) || _action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_HOOK) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_HOOK)) {
|
|
if (_globals[kLineStatus] == 1) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._visible = false;
|
|
_game._player._stepEnabled = false;
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], -1, 6);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], -1);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1);
|
|
break;
|
|
|
|
case 1: {
|
|
int syncIdx = _globals._sequenceIndexes[2];
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7);
|
|
_scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx);
|
|
_scene->_sequences.addTimer(30, 2);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
_rexHandingLine = true;
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[2]);
|
|
_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0);
|
|
_scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, -2);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
|
|
break;
|
|
|
|
case 3: {
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]);
|
|
_game._player._visible = true;
|
|
_globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(268, 140), FACING_NORTHWEST);
|
|
_scene->_kernelMessages.reset();
|
|
_game._objects.setRoom(OBJ_FISHING_LINE, _scene->_currentSceneId);
|
|
_rexHandingLine = false;
|
|
_globals[kLineStatus] = 2;
|
|
_game._player._stepEnabled = true;
|
|
_vm->_dialogs->show(75120);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_CITY))
|
|
_vm->_dialogs->show(75110);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_ELEVATOR))
|
|
_vm->_dialogs->show(75112);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
|
|
_vm->_dialogs->show(75113);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_PYLON))
|
|
_vm->_dialogs->show(75114);
|
|
else if ((_action.isAction(VERB_LOOK, NOUN_HOOK) || _action.isAction(VERB_LOOK, NOUN_FISHING_LINE))
|
|
&& (_globals[kLineStatus] == 2 || _globals[kLineStatus] == 3))
|
|
_vm->_dialogs->show(75116);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_HOOK))
|
|
_vm->_dialogs->show(75115);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
|
|
_vm->_dialogs->show(75117);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
|
|
_vm->_dialogs->show(75118);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_EAST_END_OF_PLATFORM))
|
|
_vm->_dialogs->show(75119);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_FISHING_LINE) && (_globals[kLineStatus] == 3 || _globals[kLineStatus] == 2))
|
|
_vm->_dialogs->show(75121);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_TALL_BUILDING))
|
|
_vm->_dialogs->show(75122);
|
|
else if (_action.isAction(VERB_TIE, NOUN_FISHING_LINE, NOUN_CEMENT_PYLON) || _action.isAction(VERB_ATTACH, NOUN_FISHING_LINE, NOUN_CEMENT_PYLON))
|
|
_vm->_dialogs->show(75123);
|
|
else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
Scene752::Scene752(MADSEngine *vm) : Scene7xx(vm) {
|
|
_cardId = -1;
|
|
}
|
|
|
|
void Scene752::synchronize(Common::Serializer &s) {
|
|
Scene7xx::synchronize(s);
|
|
|
|
s.syncAsSint16LE(_cardId);
|
|
}
|
|
|
|
void Scene752::setup() {
|
|
setPlayerSpritesPrefix();
|
|
setAAName();
|
|
|
|
_scene->addActiveVocab(NOUN_ID_CARD);
|
|
_scene->addActiveVocab(VERB_WALKTO);
|
|
_scene->addActiveVocab(VERB_LOOK_AT);
|
|
_scene->addActiveVocab(NOUN_LASER_BEAM);
|
|
}
|
|
|
|
void Scene752::enter() {
|
|
_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('l', -1));
|
|
_globals._spriteIndexes[12] = _scene->_sprites.addSprites("*RXMBD_8");
|
|
|
|
if (_scene->_priorSceneId == 751) {
|
|
_game._player._playerPos = Common::Point(13, 145);
|
|
_game._player._facing = FACING_EAST;
|
|
} else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) {
|
|
_game._player._playerPos = Common::Point(289, 138);
|
|
_game._player.walk(Common::Point(262, 148), FACING_WEST);
|
|
_game._player._facing = FACING_WEST;
|
|
_game._player._visible = true;
|
|
}
|
|
|
|
if (_game._objects[OBJ_ID_CARD]._roomNumber == 752) {
|
|
_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('i', -1));
|
|
_globals._sequenceIndexes[13] = _scene->_sequences.startCycle(_globals._spriteIndexes[13], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 8);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_ID_CARD, VERB_WALKTO, _globals._sequenceIndexes[13], Common::Rect(0, 0, 0, 0));
|
|
_cardId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(234, 135), FACING_NORTH);
|
|
}
|
|
|
|
if (_game._globals[kLaserHoleIsThere]) {
|
|
_globals._sequenceIndexes[14] = _scene->_sequences.startCycle(_globals._spriteIndexes[14], false, 1);
|
|
_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 13);
|
|
int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_LOOK_AT, _globals._sequenceIndexes[14], Common::Rect(0, 0, 0, 0));
|
|
_scene->_dynamicHotspots.setPosition(idx, Common::Point(215, 130), FACING_NORTHWEST);
|
|
}
|
|
|
|
if (_game._globals[kTeleporterCommand]) {
|
|
switch(_game._globals[kTeleporterCommand]) {
|
|
case TELEPORTER_BEAM_OUT:
|
|
case TELEPORTER_WRONG:
|
|
case TELEPORTER_STEP_OUT:
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_game._globals[kTeleporterCommand] = TELEPORTER_NONE;
|
|
}
|
|
|
|
if (_globals._timebombTimer > 0)
|
|
_globals._timebombTimer = 10800 - 600;
|
|
|
|
sceneEntrySound();
|
|
}
|
|
|
|
void Scene752::step() {
|
|
if (_globals._timebombTimer >= 10800 && _game._globals[kTimebombStatus] == TIMEBOMB_ACTIVATED) {
|
|
_globals[kTimebombStatus] = TIMEBOMB_DEAD;
|
|
_globals._timebombTimer = 0;
|
|
_globals[kCheckDaemonTimebomb] = false;
|
|
_scene->_nextSceneId = 620;
|
|
}
|
|
}
|
|
|
|
void Scene752::preActions() {
|
|
if (_action.isAction(VERB_WALKTO, NOUN_WEST_END_OF_PLATFORM)) {
|
|
_game._player._walkOffScreenSceneId = 751;
|
|
}
|
|
}
|
|
|
|
void Scene752::actions() {
|
|
if (_action.isAction(VERB_WALK_ALONG, NOUN_PLATFORM))
|
|
;
|
|
else if (_action.isAction(VERB_STEP_INTO, NOUN_TELEPORTER)) {
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_scene->_nextSceneId = 711;
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_ID_CARD) && (!_game._objects.isInInventory(OBJ_ID_CARD) || _game._trigger)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
|
|
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
|
|
break;
|
|
case 1:
|
|
_vm->_sound->command(15);
|
|
_scene->_sequences.remove(_globals._sequenceIndexes[13]);
|
|
_game._objects.addToInventory(OBJ_ID_CARD);
|
|
_scene->_dynamicHotspots.remove(_cardId);
|
|
_vm->_dialogs->showItem(OBJ_ID_CARD, 830);
|
|
break;
|
|
case 2:
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT) &&
|
|
(!_game._objects.isInInventory(OBJ_BONES) || _game._trigger)) {
|
|
switch (_game._trigger) {
|
|
case 0:
|
|
_game._player._stepEnabled = false;
|
|
_game._player._visible = false;
|
|
_globals._sequenceIndexes[12] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[12], false, 5, 2, 0, 0);
|
|
_scene->_sequences.setMsgLayout(_globals._sequenceIndexes[12]);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_SPRITE, 4, 1);
|
|
_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
|
|
break;
|
|
case 1:
|
|
_vm->_sound->command(15);
|
|
if (_game._objects.isInInventory(OBJ_BONE))
|
|
_game._objects.setRoom(OBJ_BONE, NOWHERE);
|
|
_game._objects.addToInventory(OBJ_BONES);
|
|
_vm->_dialogs->showItem(OBJ_BONES, 75221);
|
|
break;
|
|
case 2:
|
|
_scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[12]);
|
|
_game._player._visible = true;
|
|
_game._player._stepEnabled = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_CITY)) {
|
|
if (_globals[kLaserHoleIsThere])
|
|
_vm->_dialogs->show(75212);
|
|
else
|
|
_vm->_dialogs->show(75210);
|
|
} else if (_action.isAction(VERB_LOOK, NOUN_PLATFORM))
|
|
_vm->_dialogs->show(75213);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_CEMENT_BLOCK))
|
|
_vm->_dialogs->show(75214);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_ROCK))
|
|
_vm->_dialogs->show(75215);
|
|
else if (_action.isAction(VERB_TAKE, NOUN_ROCK))
|
|
_vm->_dialogs->show(75216);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_WEST_END_OF_PLATFORM))
|
|
_vm->_dialogs->show(75217);
|
|
else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER))
|
|
_vm->_dialogs->show(75218);
|
|
else if ((_action.isAction(VERB_LOOK, NOUN_BONES) || _action.isAction(VERB_LOOK, NOUN_ID_CARD)) && (_action._mainObjectSource == CAT_HOTSPOT)) {
|
|
if (_game._objects[OBJ_ID_CARD]._roomNumber == 752)
|
|
_vm->_dialogs->show(75219);
|
|
else
|
|
_vm->_dialogs->show(75220);
|
|
} else if (_action.isAction(VERB_TAKE, NOUN_BONES) && (_action._savedFields._mainObjectSource == CAT_HOTSPOT)) {
|
|
if (_game._objects.isInInventory(OBJ_BONES))
|
|
_vm->_dialogs->show(75222);
|
|
} else
|
|
return;
|
|
|
|
_action._inProgress = false;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
} // End of namespace Nebular
|
|
} // End of namespace MADS
|