/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "common/scummsys.h" #include "mads/mads.h" #include "mads/scene.h" #include "mads/nebular/nebular_scenes.h" #include "mads/nebular/nebular_scenes2.h" namespace MADS { namespace Nebular { void Scene2xx::setAAName() { int idx = (_scene->_nextSceneId == 216) ? 4 : 2; _game._aaName = Resources::formatAAName(idx); } void Scene2xx::setPlayerSpritesPrefix() { _vm->_sound->command(5); Common::String oldName = _game._player._spritesPrefix; switch(_scene->_nextSceneId) { case 213: case 216: _game._player._spritesPrefix = ""; break; default: if (_globals[kSexOfRex] != SEX_MALE) { _game._player._spritesPrefix = "ROX"; } else { _game._player._spritesPrefix = "RXM"; } break; } _game._player._scalingVelocity = (_scene->_nextSceneId <= 212); if (oldName != _game._player._spritesPrefix) _game._player._spritesChanged = true; if ((_scene->_nextSceneId == 203 || _scene->_nextSceneId == 204) && _globals[kRhotundaStatus]) _game._player._loadsFirst = false; _vm->_palette->setEntry(16, 10, 63, 63); _vm->_palette->setEntry(17, 10, 45, 45); } void Scene2xx::sceneEntrySound() { if (_vm->_musicFlag) { switch (_scene->_nextSceneId) { case 201: if ((_globals[kTeleporterCommand] == 2) || (_globals[kTeleporterCommand] == 4) || (_globals[kMeteorologistStatus] != 1)) _vm->_sound->command(9); else _vm->_sound->command(17); break; case 202: case 203: case 204: case 205: case 208: case 209: case 212: _vm->_sound->command(9); break; case 206: case 211: case 215: _vm->_sound->command(10); break; case 207: case 214: _vm->_sound->command(11); break; case 210: if (_globals[kTwinklesStatus] == 0) _vm->_sound->command(15); else _vm->_sound->command(10); break; case 213: if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL) _vm->_sound->command(1); else _vm->_sound->command(9); break; case 216: _vm->_sound->command(16); break; default: _vm->_sound->command(10); break; } } else _vm->_sound->command(2); } /*------------------------------------------------------------------------*/ Scene201::Scene201(MADSEngine *vm) : Scene2xx(vm) { _pterodactylFlag = false; } void Scene201::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_pterodactylFlag); } void Scene201::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_SWOOPING_CREATURE); _scene->addActiveVocab(NOUN_BIRDS); _scene->addActiveVocab(VERB_WALKTO); } void Scene201::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', -1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('b', -1)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*SC002Z1"); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 1, 0); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 50); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 4, 0, 0, 0); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 6, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 8); _scene->_sequences.setPosition(_globals._sequenceIndexes[4], Common::Point(185, 46)); int idx = _scene->_dynamicHotspots.add(NOUN_BIRDS, 209, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(186, 81), FACING_NORTH); if ((_scene->_priorSceneId == 202) || (_scene->_priorSceneId == RETURNING_FROM_LOADING)) { _game._player._playerPos = Common::Point(165, 152); } else { _game._player._playerPos = Common::Point(223, 149); _game._player._facing = FACING_SOUTH; } if (_globals[kTeleporterCommand]) { _game._player._visible = false; _game._player._stepEnabled = false; int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u'; // Guess values. What is the default value used by the compiler? int suffixNum = -1; int endTrigger = -1; switch(_globals[kTeleporterCommand]) { case 1: suffixNum = 3; endTrigger = 76; _globals[kTeleporterUnderstood] = true; break; case 2: suffixNum = 1; endTrigger = 77; break; case 3: _game._player._visible = true; _game._player._stepEnabled = true; suffixNum = -1; break; case 4: suffixNum = 2; endTrigger = 78; break; } _globals[kTeleporterCommand] = 0; if (suffixNum >= 0) _scene->loadAnimation(formAnimName(sepChar, suffixNum), endTrigger); } if ((_scene->_priorSceneId == 202) && (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT) && !_scene->_roomChanged) { _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('a', 0)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('a', 1)); _game.loadQuoteSet(90, 91, 0); _game._player._stepEnabled = false; _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -1, 12); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_SPRITE, 12, 70); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); _pterodactylFlag = false; _game._player.walk(Common::Point(157, 143), FACING_NORTH); _vm->_palette->setEntry(252, 45, 63, 45); _vm->_palette->setEntry(253, 20, 45, 20); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 2, 0, 120, _game.getQuote(90)); } else _pterodactylFlag = true; if (_globals[kTeleporterUnderstood]) _scene->_hotspots.activate(NOUN_STRANGE_DEVICE, false); sceneEntrySound(); } void Scene201::step() { if (_pterodactylFlag && (_vm->getRandomNumber(5000) == 9)) { _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 5, 1, 6, 0); int idx = _scene->_dynamicHotspots.add(351, 13, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(270, 80), FACING_EAST); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 8); _vm->_sound->command(14); _pterodactylFlag = false; } if (_game._trigger == 70) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0); _game._player._visible = false; _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 12, 16); _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 1, 0, 0); _vm->_sound->command(42); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 3, 81); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 73); } if (_game._trigger == 81) { _scene->_kernelMessages.reset(); } if (_game._trigger == 71) { _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 9, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], -2, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 1); } if (_game._trigger == 73) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 17, -2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 74); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); } if (_game._trigger == 74) { _vm->_sound->command(40); _scene->_kernelMessages.add(Common::Point(125, 56), 0xFDFC, 32, 82, 180, _game.getQuote(91)); _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], -2, -2); _scene->_sequences.addTimer(180, 75); } if (_game._trigger == 75) { _globals[kMeteorologistEverSeen] = 0; _scene->_nextSceneId = 202; } if (_game._trigger == 76) { _game._player._stepEnabled = true; _game._player._visible = true; _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; } if (_game._trigger == 77) { _globals[kTeleporterCommand] = 1; _scene->_nextSceneId = _globals[kTeleporterDestination]; _scene->_reloadSceneFlag = true; } if (_game._trigger == 78) { _vm->_sound->command(40); _vm->_dialogs->show(20114); _scene->_reloadSceneFlag = true; } } void Scene201::actions() { if (_action._lookFlag == false) { if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) _scene->_nextSceneId = 202; else if (_action.isAction(VERB_CLIMB_UP, NOUN_STEPS) || (_action.isAction(VERB_WALK_INSIDE, NOUN_TELEPORTER)) || (_action.isAction(VERB_WALK_INSIDE, NOUN_STRANGE_DEVICE))) { if (_game._trigger == 0) { _game._player._stepEnabled = false; _game._player._visible = false; int sepChar = (_globals[kSexOfRex] == SEX_MALE) ? 't' : 'u'; _scene->loadAnimation(formAnimName(sepChar, 0), 1); } else if (_game._trigger == 1) { _scene->_nextSceneId = 213; } } else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) { _vm->_dialogs->show(20101); } else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) { _vm->_dialogs->show(20102); } else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH)) { _vm->_dialogs->show(20103); } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) { _vm->_dialogs->show(20104); } else if (_action.isAction(VERB_LOOK, NOUN_WATER)) { _vm->_dialogs->show(20105); } else if (_action.isAction(VERB_LOOK, NOUN_ISLAND_IN_DISTANCE)) { _vm->_dialogs->show(20106); } else if (_action.isAction(VERB_LOOK, NOUN_WEATHER_STATION)) { _vm->_dialogs->show(20107); } else if (_action.isAction(VERB_LOOK, NOUN_PATH)) { _vm->_dialogs->show(20108); } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_SOUTH)) { _vm->_dialogs->show(20110); } else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) { if (_globals[kMeteorologistEverSeen]) _vm->_dialogs->show(20112); else _vm->_dialogs->show(20109); } else if (_action.isAction(VERB_LOOK, NOUN_TELEPORTER)) { _vm->_dialogs->show(20113); } else return; } else { _vm->_dialogs->show(20111); } _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene202::Scene202(MADSEngine *vm) : Scene2xx(vm) { _activeMsgFl = false; _ladderTopFl = false; _waitingMeteoFl = false; _ladderHotspotId = -1; _meteoClock1 = 0; _meteoClock2 = 0; _toStationFl = false; _toTeleportFl = false; _lastRoute = 0; _stationCounter = 0; _meteoFrame = 0; _startTime = 0; _meteorologistSpecial = false; } void Scene202::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_activeMsgFl); s.syncAsByte(_ladderTopFl); s.syncAsByte(_waitingMeteoFl); s.syncAsByte(_toStationFl); s.syncAsByte(_toTeleportFl); s.syncAsSint32LE(_ladderHotspotId); s.syncAsSint32LE(_lastRoute); s.syncAsSint32LE(_stationCounter); s.syncAsSint32LE(_meteoFrame); s.syncAsUint32LE(_meteoClock1); s.syncAsUint32LE(_meteoClock2); s.syncAsUint32LE(_startTime); s.syncAsByte(_meteorologistSpecial); } void Scene202::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_LADDER); _scene->addActiveVocab(VERB_CLIMB_DOWN); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_BONE); _scene->addActiveVocab(NOUN_SKULL); _scene->addActiveVocab(NOUN_BROKEN_LADDER); } void Scene202::enter() { _game._player._beenVisible = true; _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', 1)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('b', 2)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('l', -1)); if (_globals[kSexOfRex] != SEX_MALE) { _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*ROXBD_2"); } else { _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*RXMBD_2"); } _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 0)); _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 1)); _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('a', 2)); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 0, 0, 0); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(149, 113)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 10); int idx = _scene->_dynamicHotspots.add(NOUN_SKULL, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(153, 97), FACING_SOUTH); if (!(_globals[kBone202Status] & 1)) { _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(130, 108)); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 10); idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(132, 97), FACING_SOUTH); } if (!(_globals[kBone202Status] & 2)) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(166, 110)); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 10); idx = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(165, 99), FACING_SOUTH); } if (_globals[kBone202Status]) _scene->changeVariant(_globals[kBone202Status]); if (_scene->_priorSceneId == 201) { _game._player._playerPos = Common::Point(190, 91); _game._player._facing = FACING_SOUTH; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(178, 152); _game._player._facing = FACING_NORTH; } if (_globals[kLadderBroken]) { _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6); _scene->_hotspots.activate(NOUN_LADDER, false); idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH); } _game.loadQuoteSet(0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x61, 0); _activeMsgFl = false; if (_scene->_priorSceneId == RETURNING_FROM_DIALOG) { if (_waitingMeteoFl) { _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1); _game._player._visible = false; } } else { _waitingMeteoFl = false; _ladderTopFl = false; } _meteoClock1 = _meteoClock2 = _scene->_frameStartTime; if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_BINOCULARS); if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) { _game._player._visible = false; _game._player._stepEnabled = false; _ladderTopFl = (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER); if (_ladderTopFl) { _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 8); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82)); _game._player._playerPos = Common::Point(246, 124); _game._player._facing = FACING_NORTH; _globals[kTeleporterUnderstood] = true; } else { _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123)); _game._player._playerPos = Common::Point(171, 122); _game._player._facing = FACING_NORTH; } _scene->loadAnimation(formAnimName('M', -1), 71); _scene->_animation[0]->setCurrentFrame(200); } else { if (_ladderTopFl) { _game._player._visible = false; _scene->_sequences.startCycle(_globals._sequenceIndexes[9], true, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _game._player._playerPos = Common::Point(246, 124); _game._player._facing = FACING_NORTH; } } _meteorologistSpecial = false; } void Scene202::setRandomKernelMessage() { int vocabId = _vm->getRandomNumber(92, 96); _scene->_kernelMessages.reset(); _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 70, 120, _game.getQuote(vocabId)); _activeMsgFl = true; } void Scene202::step() { if (!_activeMsgFl && (_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH) && (_vm->getRandomNumber(999) == 0)) { _scene->_kernelMessages.reset(); _activeMsgFl = false; if (_vm->getRandomNumber(4) == 0) setRandomKernelMessage(); } if (_game._trigger == 70) _activeMsgFl = false; if (_game._trigger == 71) { _vm->_sound->command(3); _vm->_sound->command(9); _meteoClock1 = _scene->_frameStartTime + 15 * 60; if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) { Common::Point msgPos; int msgFlag; if (!_ladderTopFl) { msgPos = Common::Point(0, 0); msgFlag = 2; } else { msgPos = Common::Point(248, 15); msgFlag = 0; } int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(102)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); if (_globals[kMeteorologistWatch] == METEOROLOGIST_GROUND) { _action._activeAction._verbId = VERB_LOOK; _action._activeAction._objectNameId = NOUN_BINOCULARS; _action._activeAction._indirectObjectId = NOUN_STRANGE_DEVICE; _game._triggerSetupMode = SEQUENCE_TRIGGER_PARSER; _scene->_sequences.addTimer(2 * 60, 2); _meteorologistSpecial = true; } else if (_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) { _scene->_sequences.addTimer(2 * 60, 90); } } _globals[kMeteorologistWatch] = METEOROLOGIST_NORMAL; } switch (_game._trigger) { case 90: _vm->_sound->command(41); _scene->_sequences.remove(_globals._sequenceIndexes[10]); _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 91); break; case 91: _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.addTimer(60, 92); break; case 92: { _scene->_sequences.remove(_globals._sequenceIndexes[9]); _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 93); _scene->_kernelMessages.reset(); int msgIndex = _scene->_kernelMessages.add(Common::Point(0, -65), 0x1110, 32, 0, 60, _game.getQuote(98)); _scene->_kernelMessages.setSeqIndex(msgIndex, _globals._sequenceIndexes[11]); } break; case 93: { _globals[kLadderBroken] = false; _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0); _scene->_hotspots.activate(NOUN_LADDER, false); int idx = _scene->_dynamicHotspots.add(NOUN_BROKEN_LADDER, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(246, 124), FACING_NORTH); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[11], _globals._sequenceIndexes[5]); _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[11]); _game._player._stepEnabled = true; _game._player._visible = true; _ladderTopFl = false; _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(99)); } break; default: break; } if (!_scene->_animation[0] && (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) && (_meteoClock2 <= _scene->_frameStartTime) && (_meteoClock1 <= _scene->_frameStartTime)) { int randVal = _vm->getRandomNumber(1, 500); int threshold = 1; if (_ladderTopFl) threshold += 25; if (!_globals[kMeteorologistEverSeen]) threshold += 25; if (threshold >= randVal) { _vm->_sound->command(17); _scene->loadAnimation(formAnimName('M', -1), 71); _toStationFl = true; _toTeleportFl = false; _globals[kMeteorologistEverSeen] = true; _lastRoute = 0; _stationCounter = 0; _meteoClock2 = _scene->_frameStartTime + 2; } } if (!_scene->_animation[0]) return; if (_waitingMeteoFl) { if (_scene->_animation[0]->getCurrentFrame() >= 200) { if ((_globals[kMeteorologistWatch] == METEOROLOGIST_TOWER) || _globals[kLadderBroken]) { _scene->_nextSceneId = 213; } else { _vm->_dialogs->show(20201); _scene->_reloadSceneFlag = true; } } if ((_scene->_animation[0]->getCurrentFrame() == 160) && (_meteoFrame != _scene->_animation[0]->getCurrentFrame())) { Common::Point msgPos; int msgFlag; if (!_ladderTopFl) { msgPos = Common::Point(0, 0); msgFlag = 2; } else { msgPos = Common::Point(248, 15); msgFlag = 0; } int msgIndex = _scene->_kernelMessages.add(msgPos, 0x1110, msgFlag | 32, 0, 120, _game.getQuote(101)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } } if (_meteoClock2 + 120 * 60 <= _scene->_frameStartTime) { _toTeleportFl = true; } if (_scene->_animation[0]->getCurrentFrame() == _meteoFrame) { return; } _meteoFrame = _scene->_animation[0]->getCurrentFrame(); int randVal = _vm->getRandomNumber(1, 1000); int frameStep = -1; switch (_scene->_animation[0]->getCurrentFrame()) { case 42: case 77: case 96: _stationCounter = 0; frameStep = subStep1(randVal); break; case 51: case 74: _toStationFl = false; frameStep = subStep2(randVal); break; case 27: case 119: case 159: frameStep = subStep3(randVal); break; case 176: frameStep = subStep4(randVal); break; case 59: _lastRoute = 3; ++_stationCounter; if (randVal <= 800) frameStep = 55; break; case 89: _lastRoute = 1; if (randVal <= 700) frameStep = 83; break; case 137: _lastRoute = 2; if (randVal <= 700) frameStep = 126; break; } if (frameStep >= 0 && frameStep != _scene->_animation[0]->getCurrentFrame() + 1) { _scene->_animation[0]->setCurrentFrame(frameStep); _meteoFrame = frameStep; } } int Scene202::subStep1(int randVal) { if ((randVal <= 100) || _toStationFl) return 42; if ((randVal <= 200) || _toTeleportFl) return 96; if ((randVal <= 300) && (_lastRoute != 1)) return 77; return 76; } int Scene202::subStep2(int randVal) { if ((randVal <= 150) && (_stationCounter < 5)) return 51; if ((randVal <= 300) || _toTeleportFl) return 74; if (randVal <= 400) return 64; return 44; } int Scene202::subStep3(int randVal) { if ((randVal <= 100) || _toStationFl) return 27; if ((randVal <= 200) || _toTeleportFl) return 159; if ((randVal <= 300) && (_lastRoute != 2)) return 119; return 110; } int Scene202::subStep4(int randVal) { if ((randVal <= 100) || _toTeleportFl) return 176; if (randVal <= 200) return 19; return 166; } void Scene202::preActions() { Player &player = _vm->_game->_player; if (player._needToWalk) _scene->_kernelMessages.reset(); if (_ladderTopFl && (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER) || player._needToWalk)) { if (_game._trigger == 0) { _vm->_sound->command(29); player._readyToWalk = false; player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[9]); _globals._sequenceIndexes[8] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1); } else if (_game._trigger == 1) { _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[8]); _scene->_dynamicHotspots.remove(_ladderHotspotId); player._visible = true; player._readyToWalk = true; player._stepEnabled = true; _ladderTopFl = false; } } if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS) && (_action._activeAction._indirectObjectId > 0)) { if (!player._readyToWalk || _ladderTopFl) player._needToWalk = false; else player._needToWalk = true; if (!_ladderTopFl) player.walk(Common::Point(171, 122), FACING_NORTH); } } void Scene202::actions() { if (_action._lookFlag) { _vm->_dialogs->show(20219); return; } if (_action.isAction(VERB_CLIMB_DOWN, NOUN_LADDER)) { _action._inProgress = false; return; } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) { _scene->_nextSceneId = 203; } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) { if (_globals[kMeteorologistStatus] != METEOROLOGIST_GONE) { if (_scene->_animation[0]) _globals[kMeteorologistStatus] = METEOROLOGIST_PRESENT; else _globals[kMeteorologistStatus] = METEOROLOGIST_ABSENT; } _scene->_nextSceneId = 201; } else if (_action.isAction(VERB_TAKE, NOUN_BONE) && (_action._savedFields._mainObjectSource == 4)) { switch (_game._trigger) { case 0: if (_game._objects.isInInventory(OBJ_BONES)) { _vm->_dialogs->show(20221); } else { _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 3, 2, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[7]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2); } break; case 1: if (_game._player._playerPos == Common::Point(132, 97)) { _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals[kBone202Status] |= BONE_202_LEFT_GONE; } else { _scene->_sequences.remove(_globals._sequenceIndexes[6]); _globals[kBone202Status] |= BONE_202_RIGHT_GONE; } break; case 2: if (_game._objects.isInInventory(OBJ_BONE)) { _game._objects.removeFromInventory(OBJ_BONE, NOWHERE); _game._objects.addToInventory(OBJ_BONES); _vm->_dialogs->showItem(OBJ_BONES, 20218); } else { _game._objects.addToInventory(OBJ_BONE); _vm->_dialogs->showItem(OBJ_BONE, 20218); } _scene->changeVariant(_globals[kBone202Status]); _game._player._stepEnabled = true; _game._player._visible = true; break; default: break; } _action._inProgress = false; } else if (_action.isAction(VERB_CLIMB_UP, NOUN_LADDER) && !_globals[kLadderBroken]) { switch (_game._trigger) { case 0: _vm->_sound->command(29); _meteoClock1 = _scene->_frameStartTime; _game._player._visible = false; _game._player._stepEnabled = false; _ladderHotspotId = _scene->_dynamicHotspots.add(NOUN_LADDER, 78, -1, Common::Rect(241, 68, 241 + 12, 68 + 54)); _scene->_dynamicHotspots.setPosition(_ladderHotspotId, Common::Point(246, 124), FACING_NORTH); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], _globals._sequenceIndexes[9]); _ladderTopFl = true; _game._player._stepEnabled = true; int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(97)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; default: _action._inProgress = false; return; } } else if ((_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_FIELD_TO_NORTH) || (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_STRANGE_DEVICE))) && (_globals[kSexOfRex] == SEX_MALE)) { if (!_ladderTopFl) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible= false; _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123)); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123)); if (_scene->_animation[0]) { _waitingMeteoFl = true; _globals[kMeteorologistWatch] = METEOROLOGIST_GROUND; } else { _scene->_sequences.addTimer(120, 2); } break; case 2: if (!_scene->_animation[0] && !_meteorologistSpecial) { _vm->_dialogs->show(20222); } _scene->_sequences.remove(_globals._sequenceIndexes[10]); _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 6); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(172, 123)); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[10]); _game._player._stepEnabled = true; _game._player._visible = true; break; default: _action._inProgress = false; return; } } else { switch (_game._trigger) { case 0: _toTeleportFl = true; _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[9]); _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], true, 6, 1, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: _globals._sequenceIndexes[10] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, -2); _scene->_sequences.setPosition(_globals._sequenceIndexes[10], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); if (_scene->_animation[0]) { if (_scene->_animation[0]->getCurrentFrame() > 200) { _scene->_sequences.addTimer(120, 2); } else { _waitingMeteoFl = true; _globals[kMeteorologistWatch] = METEOROLOGIST_GONE; if ((_scene->_animation[0]->getCurrentFrame() >= 44) && (_scene->_animation[0]->getCurrentFrame() <= 75)) { _scene->_kernelMessages.reset(); int msgIndex = _scene->_kernelMessages.add(Common::Point(248, 15), 0x1110, 32, 0, 60, _game.getQuote(100)); _scene->_kernelMessages.setQuoted(msgIndex, 4, false); } else { _action._inProgress = false; return; } } } else { _scene->_sequences.addTimer(120, 2); } break; case 2: if (!_scene->_animation[0]) _vm->_dialogs->show(20222); _meteorologistSpecial = false; _scene->_sequences.remove(_globals._sequenceIndexes[10]); _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], true, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(247, 82)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _game._player._stepEnabled = true; break; default: _action._inProgress = false; return; } } } else if (_action.isAction(VERB_WALK_INSIDE, NOUN_HUT)) { setRandomKernelMessage(); } else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) { _vm->_dialogs->show(20202); } else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT)) { _vm->_dialogs->show(20203); } else if (_action.isAction(VERB_LOOK, NOUN_GRASS)) { _vm->_dialogs->show(20204); } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) { if ((_globals[kMeteorologistStatus] == METEOROLOGIST_ABSENT) || (_globals[kMeteorologistStatus] == METEOROLOGIST_GONE)) _vm->_dialogs->show(20205); else if (_globals[kMeteorologistStatus] == METEOROLOGIST_PRESENT) _vm->_dialogs->show(20220); } else if (_action.isAction(VERB_LOOK, NOUN_WATCH_TOWER)) { _vm->_dialogs->show(20206); } else if (_action.isAction(VERB_LOOK, NOUN_TALL_GRASS)) { _vm->_dialogs->show(20207); } else if (_action.isAction(VERB_LOOK, NOUN_TREES)) { _vm->_dialogs->show(20208); } else if (_action.isAction(VERB_LOOK, NOUN_TREE)) { _vm->_dialogs->show(20209); } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) { _vm->_dialogs->show(20210); } else if (_action.isAction(VERB_LOOK, NOUN_HUT)) { if ((_game._player._playerPos == Common::Point(77, 105)) && (_game._player._facing == FACING_NORTH)) _vm->_dialogs->show(20212); else _vm->_dialogs->show(20211); } else if (_action.isAction(VERB_LOOK, NOUN_STRANGE_DEVICE)) { _vm->_dialogs->show(20213); } else if (_action.isAction(VERB_LOOK, NOUN_OCEAN_IN_DISTANCE)) { _vm->_dialogs->show(20214); } else if (_action.isAction(VERB_LOOK, NOUN_SKULL)) { _vm->_dialogs->show(20215); } else if (_action.isAction(VERB_TAKE, NOUN_SKULL)) { _vm->_dialogs->show(20216); } else if (_action.isAction(VERB_LOOK, NOUN_BONES) && _action._commandSource == 4) { _vm->_dialogs->show(20217); } else { return; } _action._inProgress = false; } /*****************************************************************************/ Scene203::Scene203(MADSEngine *vm) : Scene2xx(vm) { _rhotundaEat2Fl = false; _rhotundaEatFl = false; } void Scene203::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_rhotundaEat2Fl); s.syncAsByte(_rhotundaEatFl); } void Scene203::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(477); } void Scene203::enter() { if (_scene->_priorSceneId == 202) { _game._player._playerPos = Common::Point(187, 99); _game._player._facing = FACING_SOUTH; } else if (_scene->_priorSceneId == 209) { _game._player._playerPos = Common::Point(308, 117); _game._player._facing = FACING_WEST; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(155, 152); _game._player._facing = FACING_NORTH; } _rhotundaEatFl = false; _rhotundaEat2Fl = false; if ((_globals[kRhotundaStatus] == 0) && (!_scene->_roomChanged)) { _rhotundaEatFl = true; _game._player.walk(Common::Point(158, 135), FACING_SOUTH); int idx = _scene->_dynamicHotspots.add(131, 396, 0, Common::Rect(0, 0, 320, 156)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(155, 152), FACING_SOUTH); _scene->_dynamicHotspots.setCursor(idx, CURSOR_GO_DOWN); } if (!_rhotundaEatFl) { _globals._spriteIndexes[0] = _scene->_sprites.addSprites(formAnimName('b', -1)); if (_vm->getRandomNumber(1, 3) == 2) { _globals._spriteIndexes[15] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[0], false, 9, 1, 0, 0); int idx = _scene->_dynamicHotspots.add(477, 209, _globals._spriteIndexes[15], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(-2, 0), FACING_NONE); _vm->_sound->command(14); } } _game.loadQuoteSet(0x67, 0x68, 0x69, 0x6A, 0x5A, 0); if (_rhotundaEatFl) { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(_vm->getRandomNumber(103, 106))); } sceneEntrySound(); } void Scene203::step() { if (!_rhotundaEatFl) return; if ((_game._trigger == 0) && _rhotundaEat2Fl) return; if ((_game._player._playerPos != Common::Point(158, 136)) || (_game._player._facing != FACING_SOUTH)) return; _rhotundaEat2Fl = true; if (_game._trigger == 0) { _game._player._visible = false; _game._player._stepEnabled = false; _vm->_palette->lock(); _scene->_kernelMessages.reset(); _scene->resetScene(); _vm->_events->setCursor2(CURSOR_WAIT); _scene->loadAnimation(Resources::formatName(203, 'a', -1, EXT_AA, ""), 81); } else if (_game._trigger == 81) { _scene->_nextSceneId = 208; _scene->_reloadSceneFlag = true; } } void Scene203::preActions() { if (_rhotundaEatFl && !_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) { _game._player.walk(Common::Point(158, 136), FACING_SOUTH); _action._inProgress = false; return; } if (_action.isAction(VERB_WALKTO, NOUN_OPEN_AREA_TO_EAST)) _game._player._walkOffScreenSceneId = 209; } void Scene203::actions() { if (_action._savedFields._lookFlag) { _vm->_dialogs->show(20307); } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) { _scene->_nextSceneId = 208; } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_NORTH)) { _scene->_nextSceneId = 202; } else if (_action.isAction(VERB_LOOK, NOUN_SKY)) { _vm->_dialogs->show(20301); } else if (_action.isAction(VERB_LOOK, NOUN_CLIFF_FACE)) { _vm->_dialogs->show(20302); } else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) { _vm->_dialogs->show(20303); } else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) { _vm->_dialogs->show(20304); } else if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) { _vm->_dialogs->show(20305); } else if (_action.isAction(VERB_LOOK, NOUN_BOULDERS)) { _vm->_dialogs->show(20305); } else return; _action._inProgress = false; } /*****************************************************************************/ void Scene205::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_CHICKEN); _scene->addActiveVocab(NOUN_PIRANHA); } Scene205::Scene205(MADSEngine *vm) : Scene2xx(vm) { _lastFishTime = _scene->_frameStartTime; _chickenTime = _scene->_frameStartTime; _beingKicked = false; _kernelMessage = -1; } void Scene205::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_beingKicked); s.syncAsSint16LE(_kernelMessage); } void Scene205::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', -1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', -1)); if (_globals[kSexOfRex] == SEX_MALE) _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('a', 1)); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 10, 0, 0, 3); int idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 15, 0, 0, 0); idx = _scene->_dynamicHotspots.add(73, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(162, 120), FACING_NORTHEAST); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 0, 0, 0); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 6, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 11); if (!_game._visitedScenes._sceneRevisited) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 1, 0, 0); idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH); } if (_game._objects[12]._roomNumber == 205) { _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 11); } else { _scene->_hotspots.activate(450, false); } _beingKicked = false; _game.loadQuoteSet(0x6B, 0x70, 0x71, 0x72, 0x5A, 0x74, 0x75, 0x76, 0x77, 0x78, 0x73, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0xAC, 0xAD, 0xAE, 0x6C, 0x6D, 0x6E, 0x6F, 0x2, 0); _dialog1.setup(0x2A, 0x5A, 0x78, 0x74, 0x75, 0x76, 0x77, 0); if (!_game._visitedScenes._sceneRevisited) _dialog1.set(0x5A, 0x74, 0x75, 0x77, 0); _vm->_palette->setEntry(250, 63, 50, 20); _vm->_palette->setEntry(251, 50, 40, 15); _vm->_palette->setEntry(252, 63, 63, 40); _vm->_palette->setEntry(253, 50, 50, 30); _chickenTime = _vm->_game->_scene._frameStartTime; if (_globals[kSexOfRex] == SEX_FEMALE) _scene->_kernelMessages.initRandomMessages(3, Common::Rect(195, 99, 264, 134), 13, 2, 0xFDFC, 60, 108, 108, 109, 109, 110, 110, 111, 108, 0); if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) _game._player._playerPos = Common::Point(99, 152); if (_globals[kSexOfRex] != SEX_MALE) { _scene->loadAnimation(formAnimName('a', -1)); _scene->_animation[0]->_resetFlag = true; } else { _beingKicked = true; _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _game._player._visible = false; _game._player._stepEnabled = false; _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 6, 73); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 11, 74); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 71); } sceneEntrySound(); } void Scene205::step() { if (_globals[kSexOfRex] == SEX_FEMALE) { _scene->_kernelMessages.randomServer(); if (_vm->_game->_scene._frameStartTime >= _chickenTime) { int chanceMinor = _scene->_kernelMessages.checkRandom() + 1; if (_scene->_kernelMessages.generateRandom(100, chanceMinor)) _vm->_sound->command(28); _chickenTime = _vm->_game->_scene._frameStartTime + 2; } } if (_vm->_game->_scene._frameStartTime - _lastFishTime > 1300) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle( _globals._spriteIndexes[6], false, 5, 1, 0, 0); int idx = _scene->_dynamicHotspots.add(269, 13, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(49, 86), FACING_NORTH); _lastFishTime = _vm->_game->_scene._frameStartTime; } if (_game._trigger == 73) _scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 0, 60, _game.getQuote(112)); if (_game._trigger == 74) { _vm->_sound->command(26); _scene->_kernelMessages.add(Common::Point(106, 90), 0x1110, 32, 0, 60, _game.getQuote(113)); } if (_game._trigger == 71) { _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 6, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 2); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -2, -2); _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(160, 68), 0xFBFA, 32, 72, 180, _game.getQuote(114)); } if (_game._trigger == 72) _scene->_nextSceneId = 211; } void Scene205::handleWomanSpeech(int quote) { _kernelMessage = _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, INDEFINITE_TIMEOUT, _game.getQuote(quote)); } void Scene205::actions() { if (_game._screenObjects._inputMode == kInputConversation) { if (_kernelMessage >= 0) _scene->_kernelMessages.remove(_kernelMessage); _kernelMessage = -1; if (_game._trigger == 0) { _game._player._stepEnabled = false; _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(_action._activeAction._verbId)); } else { if ((_game._trigger > 1) || (_action._activeAction._verbId != 0x76)) _game._player._stepEnabled = true; switch (_action._activeAction._verbId) { case 0x5A: handleWomanSpeech(0x7A); _dialog1.write(0x78, true); _dialog1.write(0x5A, false); break; case 0x74: handleWomanSpeech(0x7C); _dialog1.write(0x74, false); _dialog1.write(0x76, true); break; case 0x75: case 0x78: handleWomanSpeech(0x7B); _dialog1.write(_action._activeAction._verbId, false); _vm->_dialogs->show(20501); break; case 0x76: if (_game._trigger == 1) { handleWomanSpeech(0x7D); _scene->_sequences.addTimer(120, 2); } else if (_game._trigger == 2) { handleWomanSpeech(0x7E); _dialog1.write(0x76, false); _globals[kChickenPermitted] = true; } break; case 0x77: _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 0, 0, 120, _game.getQuote(0x7F)); _scene->_userInterface.setup(kInputBuildingSentences); break; default: break; } if (_action._activeAction._verbId != 0x77) _dialog1.start(); } } else if (_action._lookFlag) _vm->_dialogs->show(20502); else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_OPPOSITE_BANK)) _vm->_dialogs->show(20518); else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN)) { if (_game._trigger == 0) { _game._player._stepEnabled = false; _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 18, 1, 120, _game.getQuote(0x73)); } else if (_game._trigger == 1) { _game._player._stepEnabled = true; handleWomanSpeech (0x79); _dialog1.write(0x5A, true); _dialog1.write(0x75, true); _dialog1.start(); } } else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) { if (_game._trigger == 0) { _game._player._stepEnabled = false; int rndVal = _vm->getRandomNumber(0xAC, 0xAE); _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 1, 120, _game.getQuote(rndVal)); } else if (_game._trigger == 1) _game._player._stepEnabled = true; } else if (_action.isAction(VERB_WALKTO, NOUN_OPPOSITE_BANK)) { if (_game._trigger == 0) { _game._player._visible = false; _game._player._stepEnabled = false; _vm->_palette->lock(); _scene->_kernelMessages.reset(); _game._player.removePlayerSprites(); _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('a', 0)); _vm->_palette->refreshSceneColors(); _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 6, 1, 0, 0); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1); _vm->_sound->command(27); } else if (_game._trigger == 1) { if (_scene->_animation[0] != nullptr) _scene->_animation[0]->resetSpriteSetsCount(); _vm->_dialogs->show(20516); _scene->_reloadSceneFlag = true; } } else { if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_SOUTH)) _scene->_nextSceneId = 210; if (_action.isAction(VERB_WALKTO, NOUN_FIRE_PIT) || _action.isAction(VERB_WALKTO, NOUN_CHICKEN_ON_SPIT)) { if (_game._objects.isInRoom(OBJ_CHICKEN)) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x6B)); } } else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && _globals[kChickenPermitted] && _game._objects.isInRoom(OBJ_CHICKEN)) { _game._objects.addToInventory(OBJ_CHICKEN); _scene->_sequences.remove(_globals._sequenceIndexes[4]); _scene->_hotspots.activate(NOUN_CHICKEN_ON_SPIT, false); _vm->_dialogs->showItem(OBJ_CHICKEN, 812); } else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN_ON_SPIT) && (!_globals[kChickenPermitted])) _scene->_kernelMessages.add(Common::Point(186, 27), 0xFBFA, 32, 0, 120, _game.getQuote(0x80)); else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN)) _vm->_dialogs->show(20503); else if (_action.isAction(VERB_LOOK, NOUN_HUT)) _vm->_dialogs->show(20504); else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(20505); else if (_action.isAction(VERB_TAKE, NOUN_CHICKEN) && (_action._mainObjectSource == CAT_HOTSPOT)) _vm->_dialogs->show(20506); else if (_action.isAction(VERB_LOOK, NOUN_CHICKEN_ON_SPIT)) _vm->_dialogs->show(20507); else if (_action.isAction(VERB_LOOK, NOUN_FIRE_PIT)) _vm->_dialogs->show(20508); else if (_action.isAction(VERB_TAKE, NOUN_FIRE_PIT)) _vm->_dialogs->show(20509); else if (_action.isAction(VERB_LOOK, NOUN_STREAM)) _vm->_dialogs->show(20510); else if (_action.isAction(VERB_LOOK, NOUN_OPPOSITE_BANK)) _vm->_dialogs->show(20511); else if (_game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId)) && ( _action.isAction(VERB_GIVE, NOUN_STREAM) || _action.isAction(VERB_THROW, NOUN_STREAM) || _action.isAction(VERB_GIVE, NOUN_PIRANHA) || _action.isAction(VERB_THROW, NOUN_PIRANHA))) _vm->_dialogs->show(20512); else if (_action.isAction(VERB_LOOK, NOUN_PIRANHA)) _vm->_dialogs->show(20513); else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT_BUSH)) _vm->_dialogs->show(20514); else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT_BUSH)) _vm->_dialogs->show(20515); else if (_action.isAction(VERB_TAKE, NOUN_NATIVE_WOMAN)) _vm->_dialogs->show(20517); else return; } _action._inProgress = false; } /*****************************************************************************/ Scene207::Scene207(MADSEngine *vm) : Scene2xx(vm) { _vultureFl = false; _spiderFl = false; _eyeFl = false; _spiderHotspotId = -1; _vultureHotspotId = -1; _spiderTime = _game._player._priorTimer; _vultureTime = _game._player._priorTimer; } void Scene207::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_vultureFl); s.syncAsByte(_spiderFl); s.syncAsByte(_eyeFl); s.syncAsSint32LE(_spiderHotspotId); s.syncAsSint32LE(_vultureHotspotId); } void Scene207::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_VULTURE); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_SPIDER); _scene->addActiveVocab(VERB_WALKTO); } void Scene207::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('h', 1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('c', -1)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('e', 0)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('e', 1)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('g', 1)); _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('g', 0)); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 7); int var2; if (!_game._visitedScenes._sceneRevisited) { var2 = 1; } else { var2 = _vm->getRandomNumber(4) + 1; } if (var2 > 2) _vultureFl = false; else _vultureFl = true; _spiderFl = (var2 & 1); if (_vultureFl) { _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 30, 0, 0, 400); _vultureHotspotId = _scene->_dynamicHotspots.add(389, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_vultureHotspotId, Common::Point(254, 94), FACING_WEST); } if (_spiderFl) { _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, -1); _spiderHotspotId = _scene->_dynamicHotspots.add(333, 13, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_spiderHotspotId, Common::Point(59, 132), FACING_SOUTH); } _eyeFl = false; if (_scene->_priorSceneId == 211) { _game._player._playerPos = Common::Point(13, 105); _game._player._facing = FACING_EAST; } else if (_scene->_priorSceneId == 214) { _game._player._playerPos = Common::Point(164, 117); _game._player._facing = FACING_SOUTH; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(305, 131); } _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 22); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 70); } void Scene207::moveVulture() { _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0); _vm->_sound->command(43); _vultureFl = false; _vultureTime = _game._player._priorTimer; _scene->_dynamicHotspots.remove(_vultureHotspotId); } void Scene207::moveSpider() { _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0); _spiderFl = false; _spiderTime = _game._player._priorTimer; _scene->_dynamicHotspots.remove(_spiderHotspotId); } void Scene207::step() { Player &player = _game._player; if (_vultureFl) { if (((int32)player._priorTimer - _vultureTime) > 1700) moveVulture(); } if (_spiderFl) { if (((int32)player._priorTimer - _spiderTime) > 800) moveSpider(); } if (_game._trigger == 70) { _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 10, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 23, 34); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); } if (_game._trigger == 71) _eyeFl = false; if (_eyeFl) return; if ((_game._player._playerPos.x >= 124) && (_game._player._playerPos.x <= 201)) { _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 1, 0, 0); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 71); _eyeFl = true; } } void Scene207::preActions() { if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST)) _game._player._walkOffScreenSceneId = 211; if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_FIELD_TO_EAST)) _game._player._walkOffScreenSceneId = 208; if (_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) { if (_action.isObject(NOUN_VULTURE)) { _vultureTime = -9999; } else if (_action.isObject(NOUN_SPIDER)) { _spiderTime = -9999; } } } void Scene207::actions() { if (_action._savedFields._lookFlag) _vm->_dialogs->show(20711); else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) _scene->_nextSceneId = 214; else { if ((_game._player._playerPos.x > 150) && (_game._player._playerPos.x < 189) && (_game._player._playerPos.y > 111) && (_game._player._playerPos.y < 130)) { if ((_game._player._playerPos.x <= 162) || (_game._player._playerPos.x >= 181) || (_game._player._playerPos.y <= 115) || (_game._player._playerPos.y >= 126)) { _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 10, 2, 0, 0); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 2, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6); } } else if (_eyeFl) { _scene->_sequences.remove(_globals._sequenceIndexes[7]); _scene->_sequences.remove(_globals._sequenceIndexes[8]); _eyeFl = false; } if (_action.isAction(VERB_LOOK, NOUN_DENSE_FOREST)) _vm->_dialogs->show(20701); else if (_action.isAction(VERB_LOOK, NOUN_HEDGE)) _vm->_dialogs->show(20702); else if (_action.isAction(VERB_LOOK, NOUN_SKULL_AND_CROSSBONES)) _vm->_dialogs->show(20703); else if (_action.isAction(VERB_LOOK, NOUN_CAULDRON)) _vm->_dialogs->show(20704); else if (_action.isAction(VERB_LOOK, NOUN_WITCHDOCTOR_HUT)) _vm->_dialogs->show(20705); else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST)) _vm->_dialogs->show(20706); else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS)) _vm->_dialogs->show(20707); else if (_action.isAction(VERB_LOOK, NOUN_ALOE_PLANT)) _vm->_dialogs->show(20708); else if (_action.isAction(VERB_LOOK, NOUN_LAWN)) _vm->_dialogs->show(20709); else if (_action.isAction(VERB_LOOK, NOUN_VULTURE)) _vm->_dialogs->show(20710); else if (_action.isAction(VERB_TAKE, NOUN_SKULL_AND_CROSSBONES)) _vm->_dialogs->show(20712); else if (_action.isAction(VERB_TAKE, NOUN_ALOE_PLANT)) _vm->_dialogs->show(20713); else if (_action.isAction(VERB_LOOK, NOUN_SPIDER)) _vm->_dialogs->show(20714); else if (_action.isAction(VERB_TAKE, NOUN_SPIDER)) _vm->_dialogs->show(20715); else return; } _action._inProgress = false; } /*****************************************************************************/ Scene208::Scene208(MADSEngine *vm) : Scene2xx(vm) { _rhotundaTurnFl = false; _boundingFl = false; _rhotundaTime = 0; } void Scene208::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_rhotundaTurnFl); s.syncAsByte(_boundingFl); s.syncAsSint32LE(_rhotundaTime); } void Scene208::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_HUGE_LEGS); _scene->addActiveVocab(NOUN_LEAF_COVERED_PIT); _scene->addActiveVocab(NOUN_PILE_OF_LEAVES); _scene->addActiveVocab(VERB_WALKTO); } void Scene208::updateTrap() { if (_globals[kRhotundaStatus] == 1) { _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 8, 0, 0, 24); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); int idx = _scene->_dynamicHotspots.add(NOUN_HUGE_LEGS, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH); _scene->_hotspots.activate(414, false); return; } switch (_globals[kLeavesStatus]) { case LEAVES_ON_GROUND: { _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 15); int idx = _scene->_dynamicHotspots.add(NOUN_PILE_OF_LEAVES, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(60, 152), FACING_NORTH); } break; case LEAVES_ON_TRAP: { _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1); _scene->_hotspots.activate(NOUN_DEEP_PIT, false); int idx = _scene->_dynamicHotspots.add(NOUN_LEAF_COVERED_PIT, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(100, 146), FACING_NORTH); _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; } break; } } void Scene208::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('a', 1)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 2)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMBD_8"); updateTrap(); _rhotundaTurnFl = false; _boundingFl = false; _scene->_kernelMessages._talkFont = _vm->_font->getFont(FONT_INTERFACE); _scene->_textSpacing = 0; if (_scene->_priorSceneId == 207) { _game._player._playerPos = Common::Point(8, 122); _game._player._facing = FACING_EAST; } else if (_scene->_priorSceneId == 203) { _game._player._playerPos = Common::Point(142, 108); _game._player._facing = FACING_SOUTH; } else if (_scene->_priorSceneId == 209) { _game._player._playerPos = Common::Point(307, 123); _game._player._facing = FACING_WEST; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(162, 149); _game._player._facing = FACING_NORTH; } _game.loadQuoteSet(0x81, 0x46, 0); if ((_scene->_priorSceneId == 207) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) { int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(129)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } _vm->_palette->setEntry(16, 0, 0, 63); _vm->_palette->setEntry(17, 0, 0, 45); sceneEntrySound(); } void Scene208::step() { if (_boundingFl && _scene->_animation[0] && (_rhotundaTime <= _scene->_animation[0]->getCurrentFrame())) { _rhotundaTime = _scene->_animation[0]->getCurrentFrame(); if (_rhotundaTime == 125) _scene->_sequences.remove(_globals._sequenceIndexes[4]); } if (!_rhotundaTurnFl) return; if ((_game._player._playerPos != Common::Point(20, 148)) || (_game._player._facing != FACING_EAST)) return; if ((_game._trigger == 0) && _boundingFl) return; _boundingFl = true; switch (_game._trigger) { case 0: _scene->loadAnimation(formAnimName('A', -1), 81); _rhotundaTime = 0; break; case 81: _scene->_sequences.remove(_globals._spriteIndexes[15]); _globals[kRhotundaStatus] = 1; updateTrap(); _scene->_sequences.addTimer(90, 82); break; case 82: _game._player._stepEnabled = true; break; } } void Scene208::preActions() { Player &player = _vm->_game->_player; if (_action.isAction(VERB_LOOK) && player._readyToWalk) player._needToWalk = true; if (_action.isAction(VERB_WALK_TOWARDS, NOUN_GRASSLAND_TO_EAST)) player._walkOffScreenSceneId = 209; if (_action.isAction(VERB_WALK_TOWARDS, NOUN_OPEN_AREA_TO_WEST)) player._walkOffScreenSceneId = 207; } void Scene208::subAction(int mode) { 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.setMsgLayout(_globals._sequenceIndexes[5]); int endTrigger; if ((mode == 1) || (mode == 2)) endTrigger = 1; else endTrigger = 2; _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, endTrigger); } break; case 1: { int oldSeq = _globals._sequenceIndexes[5]; _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 12, 3, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 3, 4); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldSeq); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2); _vm->_sound->command(20); } break; case 2: { switch (mode) { case 1: _game._objects.addToInventory(OBJ_BIG_LEAVES); _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals[kLeavesStatus] = 1; break; case 2: _game._objects.setRoom(OBJ_BIG_LEAVES, 1); _globals[kLeavesStatus] = 2; updateTrap(); break; case 3: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1); _game._objects.removeFromInventory(OBJ_TWINKIFRUIT, 1); _vm->_sound->command(34); break; case 4: _game._objects.removeFromInventory(OBJ_BURGER, 1); _vm->_sound->command(33); break; case 5: _game._objects.removeFromInventory(OBJ_DEAD_FISH, 1); _vm->_sound->command(33); break; default: break; } int oldVal = _globals._sequenceIndexes[5]; _globals._sequenceIndexes[5] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[5], false, 6, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldVal); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3); } break; case 3: _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } } void Scene208::actions() { if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LOWLANDS_TO_NORTH)) { if (_globals[kRhotundaStatus]) _scene->_nextSceneId = 203; else if (_game._trigger == 0) { _game._player._stepEnabled = false; int msgIndex = _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, _game.getQuote(70)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } else if (_game._trigger == 1) _scene->_nextSceneId = 203; } else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_SOUTH)) _scene->_nextSceneId = 212; else if (_action.isAction(VERB_TAKE, NOUN_PILE_OF_LEAVES) && (!_globals[kLeavesStatus] || _game._trigger)) { subAction(1); if (_game._player._stepEnabled) _vm->_dialogs->showItem(OBJ_BIG_LEAVES, 0x326, 0); } else if (_action.isAction(VERB_PUT, NOUN_BIG_LEAVES, NOUN_DEEP_PIT) && (_globals[kLeavesStatus] == 1 || _game._trigger)) subAction(2); else if (_action.isAction(VERB_PUT, NOUN_TWINKIFRUIT, NOUN_LEAF_COVERED_PIT)) { subAction(3); if (_game._player._stepEnabled) { _game._player._stepEnabled = false; _rhotundaTurnFl = true; _game._player.walk(Common::Point(20, 148), FACING_EAST); } } else if (_action.isAction(VERB_PUT, NOUN_BURGER, NOUN_LEAF_COVERED_PIT)) { subAction(4); if (_game._player._stepEnabled) _vm->_dialogs->show(20812); } else if (_action.isAction(VERB_PUT, NOUN_DEAD_FISH, NOUN_LEAF_COVERED_PIT)) { subAction(5); if (_game._player._stepEnabled) _vm->_dialogs->show(20812); } else if (_action.isAction(VERB_LOOK, NOUN_CUMULOUS_CLOUD)) _vm->_dialogs->show(20801); else if (_action.isAction(VERB_LOOK, NOUN_OPEN_AREA_TO_WEST)) _vm->_dialogs->show(20802); else if (_action.isAction(VERB_LOOK, NOUN_THORNY_BUSH)) _vm->_dialogs->show(20803); else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) _vm->_dialogs->show(20804); else if (_action.isAction(VERB_LOOK, NOUN_SMALL_CACTUS)) _vm->_dialogs->show(20805); else if (_action.isAction(VERB_TAKE, NOUN_SMALL_CACTUS)) _vm->_dialogs->show(20806); else if (_action.isAction(VERB_LOOK, NOUN_GRASSLAND_TO_EAST)) _vm->_dialogs->show(20807); else if (_action.isAction(VERB_LOOK, NOUN_DEEP_PIT)) _vm->_dialogs->show(20808); else if (_action.isAction(VERB_LOOK, NOUN_PILE_OF_LEAVES)) _vm->_dialogs->show(20809); else if (_action.isAction(VERB_LOOK, NOUN_LEAF_COVERED_PIT)) { if (_game._difficulty == DIFFICULTY_EASY) _vm->_dialogs->show(20810); else _vm->_dialogs->show(20811); } else if (_action.isAction(VERB_LOOK, NOUN_TREE) || _action.isAction(VERB_LOOK, NOUN_TREES)) _vm->_dialogs->show(20813); else if (_action.isAction(VERB_TAKE, NOUN_LEAF_COVERED_PIT)) _vm->_dialogs->show(20814); else if (_action.isAction(VERB_LOOK, NOUN_HUGE_LEGS)) _vm->_dialogs->show(20815); else if (_action.isAction(VERB_TAKE, NOUN_HUGE_LEGS) || _action.isAction(VERB_PULL, NOUN_HUGE_LEGS)) _vm->_dialogs->show(20816); else if (_action._savedFields._lookFlag && (_globals[kRhotundaStatus] == 1)) _vm->_dialogs->show(20819); else if (_action._savedFields._lookFlag && (_globals[kLeavesStatus] == 2)) _vm->_dialogs->show(20818); else if (_action._savedFields._lookFlag) _vm->_dialogs->show(20817); else return; _action._inProgress = false; } /*****************************************************************************/ Scene209::Scene209(MADSEngine *vm) : Scene2xx(vm) { _dodgeFl = false; _forceDodgeFl = false; _pitchFl = false; _fallFl = false; _forceFallFl = false; _playingAnimFl = false; _shouldFallFl = false; _shouldDodgeFl = false; _monkeyPosition = 0; _counter = 0; _pauseMode = 0; _binocularsDroppedFl = false; _startShootingInTimerFl = false; _dialogAbortVal = 0; _playingDialogFl = false; _shootMissedLastFl = false; _removeMonkeyFl = false; _shootReadyFl = false; _pauseCounterThreshold = 0; _pauseCounter = 0; } void Scene209::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_dodgeFl); s.syncAsByte(_forceDodgeFl); s.syncAsByte(_shouldDodgeFl); s.syncAsByte(_pitchFl); s.syncAsByte(_fallFl); s.syncAsByte(_forceFallFl); s.syncAsByte(_shouldFallFl); s.syncAsByte(_playingAnimFl); s.syncAsByte(_playingDialogFl); s.syncAsSint32LE(_pauseMode); s.syncAsSint32LE(_pauseCounterThreshold); s.syncAsSint32LE(_pauseCounter); s.syncAsByte(_removeMonkeyFl); s.syncAsSint32LE(_monkeyPosition); s.syncAsByte(_shootReadyFl); s.syncAsByte(_startShootingInTimerFl); s.syncAsByte(_shootMissedLastFl); s.syncAsByte(_binocularsDroppedFl); s.syncAsSint32LE(_dialogAbortVal); s.syncAsSint32LE(_counter); } void Scene209::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_PLANT_STALK); } void Scene209::handlePause() { switch (_game._trigger) { case 124: if (++_pauseCounter <= _pauseCounterThreshold) _scene->_sequences.addTimer(60, 124); else _pauseMode = 0; break; } } void Scene209::initPauseCounterThreshold() { switch (_game._trigger) { case 226: _scene->_sequences.addTimer(1, 124); _pauseCounterThreshold = _vm->getRandomNumber(7,12); _pauseMode = 2; _pauseCounter = 0; break; } } void Scene209::handlePeek() { switch (_game._trigger) { case 133: _vm->_sound->command(18); _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 134); break; case 134: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(60, 135); } break; case 135: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7); _scene->_sequences.addTimer(10, 136); break; case 136: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.addTimer(50, 137); break; case 137: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 138); break; case 138: _pauseMode = 1; _scene->_hotspots.activate(227, false); _playingAnimFl = false; break; } } void Scene209::handleVerticalMove() { switch (_game._trigger) { case 140: _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 8, 0, 1); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 141); break; case 141: { _vm->_sound->command(18); int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(60, 142); } break; case 142: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 143); break; case 143: _pauseMode = 1; _playingAnimFl = false; _scene->_hotspots.activate(227, false); break; } } void Scene209::handleLookStay() { switch (_game._trigger) { case 145: _vm->_sound->command(18); _monkeyPosition = 2; _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 51, 52); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 146); break; case 146: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(15, 147); } break; case 147: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7); _scene->_sequences.addTimer(8, 148); break; case 148: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); if (!_dodgeFl) { _scene->_sequences.addTimer(90, 149); } else { _scene->_sequences.addTimer(1, 149); _shouldDodgeFl = true; } break; case 149: _playingAnimFl = false; break; } } void Scene209::handleLookRight() { switch (_game._trigger) { case 151: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 14); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 152); break; case 152: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(60, 153); } break; case 153: _playingAnimFl = false; if (_dodgeFl) _shouldDodgeFl = true; break; } } void Scene209::handleBlink() { switch (_game._trigger) { case 155: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.addTimer(50, 156); break; case 156: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7); _scene->_sequences.addTimer(10, 157); break; case 157: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.addTimer(50, 158); break; case 158: _playingAnimFl = false; if (_dodgeFl) _shouldDodgeFl = true; break; } } void Scene209::handleGetBinoculars() { switch (_game._trigger) { case 161: _vm->_sound->command(18); _monkeyPosition = 3; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 8, 24); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_SPRITE, 20, 165); if (!_fallFl && !_dodgeFl) { _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 162); } else { _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163); } break; case 162: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 6, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 163); } break; case 163: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(8, 164); } break; case 164: _playingAnimFl = false; if (_fallFl) _shouldFallFl = true; break; case 165: _vm->_sound->command(18); break; } } void Scene209::handleBinocularBlink() { switch (_game._trigger) { case 167: { int oldIdx = _globals._sequenceIndexes[3]; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 168); } break; case 168: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 8, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(30, 169); } break; case 169: _playingAnimFl = false; if (_fallFl) _shouldFallFl = true; break; } } void Scene209::handleBinocularScan() { switch (_game._trigger) { case 171: { int oldIdx = _globals._sequenceIndexes[3]; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 43, 45); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 172); } break; case 172: { int oldIdx = _globals._sequenceIndexes[3]; int randAction = _vm->getRandomNumber(1,2); switch (randAction) { case 1: _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0); break; case 2: _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 4, 0, 0); break; } _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 25); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 173); } break; case 173: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 174); } break; case 174: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 12, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 23, 24); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addTimer(60, 175); } break; case 175: _playingAnimFl = false; if (_fallFl) _shouldFallFl = true; break; } } void Scene209::handleJumpInTree() { switch (_game._trigger) { case 178: { int oldIdx = 0; _monkeyPosition = 1; if (_removeMonkeyFl) _scene->_sequences.remove(_globals._sequenceIndexes[3]); else oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 46, 49); if (!_removeMonkeyFl) _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 179); } break; case 179: { _vm->_sound->command(18); int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 53, 61); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 180); } break; case 180: _removeMonkeyFl = true; _pauseMode = 1; _playingAnimFl = false; _scene->_hotspots.activate(227, false); break; } } void Scene209::handleTongue() { switch (_game._trigger) { case 182: { int oldIdx = _globals._sequenceIndexes[3]; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 26, 30); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 183); } break; case 183: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 31, 33); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 184); } break; case 184: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 36, 37); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 185); } break; case 185: { _vm->_sound->command(18); int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 6, 20, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 38, 39); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 186); } break; case 186: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 40, 41); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 178); _removeMonkeyFl = false; } break; } } void Scene209::handleStandFromPeek() { switch (_game._trigger) { case 189: _monkeyPosition = 4; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 50); _scene->_sequences.addTimer(8, 190); break; case 190: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.addTimer(8, 191); break; case 191: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 192); break; case 192: { _vm->_sound->command(18); int oldIdx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], oldIdx); _scene->_sequences.addTimer(8, 193); } break; case 193: _scene->_sequences.remove(_globals._sequenceIndexes[5]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22); _scene->_sequences.addTimer(5, 194); break; case 194: _playingAnimFl = false; _counter = 0; break; } } void Scene209::handleStandBlink() { switch (_game._trigger) { case 246: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22); _scene->_sequences.addTimer(10, 247); break; case 247: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 23); _scene->_sequences.addTimer(8, 248); break; case 248: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22); _scene->_sequences.addTimer(10, 249); break; case 249: _playingAnimFl = false; break; } } void Scene209::handleJumpAndHide() { switch (_game._trigger) { case 196: _vm->_sound->command(18); _monkeyPosition = 1; _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 16); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 197); break; case 197: _pauseMode = 1; _scene->_hotspots.activate(227, false); _playingAnimFl = false; break; } } void Scene209::handleMonkeyEating() { switch (_game._trigger) { case 199: _vm->_sound->command(18); _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 14); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 200); break; case 200: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 10, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 15, 16); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 201); } break; case 201: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 12); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addTimer(20, 202); } break; case 202: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 19); _scene->_sequences.addTimer(20, 203); break; case 203: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 17); _scene->_sequences.addTimer(20, 204); break; case 204: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 18, 19); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 205); break; case 205: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 8, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 20, 21); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 206); } break; case 206: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 22, 25); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); if (!_dodgeFl && !_fallFl) _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 207); else _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209); } break; case 207: { _vm->_sound->command(18); int msgIndex = _scene->_kernelMessages.add(Common::Point(180, 25), 0xFDFC, 0, 0, 90, _game.getQuote(130)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 15, 4, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 26, 27); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 208); } break; case 208: { _scene->_kernelMessages.add(Common::Point(180, 39), 0xFDFC, 0, 0, 90, _game.getQuote(131)); int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 4, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 28, 29); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 209); } break; case 209: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addTimer(1, 210); } break; case 210: _playingAnimFl = false; break; } } void Scene209::handleMonkeyFall() { switch (_game._trigger) { case 219: { _vm->_sound->command(25); _scene->_sprites.remove(_globals._spriteIndexes[7]); _scene->_sprites.remove(_globals._spriteIndexes[6]); _scene->_sprites.remove(_globals._spriteIndexes[5]); _scene->_sprites.remove(_globals._spriteIndexes[4]); _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('m', 4)); _scene->_kernelMessages.add(Common::Point(180, 26), 0xFDFC, 0, 0, 90, _game.getQuote(151)); _scene->_sequences.addTimer(40, 100); _scene->_hotspots.activate(227, false); int oldIdx = _globals._sequenceIndexes[3]; _monkeyPosition = 1; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 1, 35); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 220); } break; case 220: { _vm->_sound->command(18); _scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 90, _game.getQuote(159)); _scene->_hotspots.activate(227, false); int oldIdx = _globals._sequenceIndexes[3]; _monkeyPosition = 1; _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 36, 42); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 221); } break; case 221: { _game._objects.setRoom(OBJ_BINOCULARS, 209); _binocularsDroppedFl = true; int oldIdx = _globals._sequenceIndexes[8]; _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], oldIdx); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 43, 72); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 222); int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH); } break; case 222: { _scene->_kernelMessages.add(Common::Point(182, 109), 0xFDFC, 0, 0, 70, _game.getQuote(160)); int oldIdx = _globals._sequenceIndexes[8]; _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], 73, 78); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[8], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 223); } break; case 223: _scene->loadAnimation(Resources::formatName(209, 'e', -1, EXT_AA, ""), 224); _vm->_sound->command(38); break; case 224: _playingAnimFl = false; _fallFl = false; _counter = 0; _pauseMode = 0; _vm->_dialogs->show(20910); _game._player._stepEnabled = true; break; } } void Scene209::handleMonkey1() { switch (_game._trigger) { case 212: _scene->_sequences.remove(_globals._sequenceIndexes[4]); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 9, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 13); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 213); break; case 213: { int oldIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 1, 22); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 214); } break; case 214: { int oldIdx = _globals._sequenceIndexes[7]; _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 23, 26); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 215); int msgIndex = _scene->_kernelMessages.add(Common::Point(170, 21), 0xFDFC, 0, 0, 90, _game.getQuote(156)); _scene->_kernelMessages.setQuoted(msgIndex, 3, true); } break; case 215: { _vm->_sound->command(18); _scene->loadAnimation(Resources::formatName(209, 'a', -1, EXT_AA, ""), 251); int oldIdx = _globals._sequenceIndexes[7]; _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[7], 27, 35); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[7], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 216); } break; case 216: { int oldIdx = _globals._sequenceIndexes[7]; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 22); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], oldIdx); _scene->_sequences.addTimer(25, 217); } break; case 217: _pitchFl = false; _counter = 0; _pauseMode = 0; _scene->_sequences.addTimer(1, 196); break; } } void Scene209::handleMonkey2() { switch (_game._trigger) { case 251: _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 60, _game.getQuote(137)); _vm->_sound->command(22); _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 11, 1, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133)); _scene->_sequences.setScale(_globals._sequenceIndexes[12], 79); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[12], 1, 6); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 252); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = false; break; case 252: { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(132)); int oldIdx = _globals._sequenceIndexes[12]; _globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[12], Common::Point(111, 133)); _scene->_sequences.setScale(_globals._sequenceIndexes[12], 79); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[12], oldIdx); _scene->_sequences.addTimer(120, 253); } break; case 253: _scene->_sequences.remove(_globals._sequenceIndexes[12]); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; _game._player._stepEnabled = true; break; } } void Scene209::handleDodge() { switch (_game._trigger) { case 241: _scene->_hotspots.activate(227, true); _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 7); _scene->_sequences.addTimer(6, 242); break; case 242: _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 5); _scene->_sequences.addTimer(25, 243); _vm->_sound->command(24); break; case 243: _vm->_sound->command(18); _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 6); _playingAnimFl = false; _pauseMode = 0; _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 90, _game.getQuote(155)); if (!_shootMissedLastFl) { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(135)); _shootMissedLastFl = true; } else { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(136)); } break; } } void Scene209::enter() { _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('a', 1)); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', -1)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('a', 0)); _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('b', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('m', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('m', 1)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('m', 3)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('m', 6)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('m', 8)); _globals._spriteIndexes[11] = _scene->_sprites.addSprites("*RXMBD_2"); _game.loadQuoteSet(0x82, 0x83, 0x84, 0x9C, 0x97, 0x95, 0x99, 0x9E, 0x98, 0x9B, 0xA0, 0x96, 0x9F, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x91, 0x92, 0x93, 0x94, 0x89, 0x85, 0x8A, 0x86, 0x87, 0x88, 0); _vm->_palette->setEntry(252, 63, 44, 30); _vm->_palette->setEntry(253, 63, 20, 22); if (_game._objects.isInRoom(OBJ_PLANT_STALK)) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); int idx = _scene->_dynamicHotspots.add(271, 13, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(263, 129), FACING_SOUTH); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 13); } if (_scene->_priorSceneId == 208) { _game._player._playerPos = Common::Point(11, 121); _game._player._facing = FACING_EAST; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(28, 121); _game._player._facing = FACING_SOUTH; } if (_game._objects.isInRoom(OBJ_BINOCULARS)) { _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[9], Common::Point(201, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); int idx = _scene->_dynamicHotspots.add(39, 13, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(200, 133), FACING_NORTH); } if (_scene->_roomChanged) { _game._objects.addToInventory(OBJ_POISON_DARTS); _game._objects.addToInventory(OBJ_BLOWGUN); _globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS; } _pitchFl = false; _fallFl = false; _dodgeFl = false; _playingAnimFl = false; _monkeyPosition = 1; _counter = 0; _pauseMode = 0; _forceFallFl = false; _shouldFallFl = false; _forceDodgeFl = false; _binocularsDroppedFl = false; _shouldDodgeFl = false; _startShootingInTimerFl = false; _dialogAbortVal = 5; _playingDialogFl = false; _shootMissedLastFl = false; _removeMonkeyFl = true; _shootReadyFl = false; _scene->_hotspots.activate(227, false); sceneEntrySound(); } void Scene209::step() { if (!_playingAnimFl && !_pitchFl && !_fallFl && !_dodgeFl && (_pauseMode == 0) && (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS)) { int randAction = _vm->getRandomNumber(1,50); switch (randAction) { case 1: if ((_monkeyPosition == 1) && (_counter < 2)) { _scene->_sequences.addTimer(1, 133); _playingAnimFl = true; _scene->_hotspots.activate(227, true); ++_counter; } break; case 2: if ((_monkeyPosition == 1) && (_counter < 2)) { _scene->_sequences.addTimer(1, 140); _scene->_hotspots.activate(227, true); _playingAnimFl = true; ++_counter; } break; case 3: if (_monkeyPosition == 1) { _scene->_sequences.addTimer(1, 145); _scene->_hotspots.activate(227, true); _playingAnimFl = true; _counter = 0; } break; case 4: if ((_monkeyPosition == 2) && (_counter < 2)) { _scene->_sequences.addTimer(1, 151); _scene->_hotspots.activate(227, true); ++_counter; _playingAnimFl = true; } break; case 5: if (_monkeyPosition == 2) { _scene->_sequences.addTimer(1, 161); _scene->_hotspots.activate(227, true); _counter = 0; _playingAnimFl = true; } break; case 6: if (_monkeyPosition == 2) { _scene->_sequences.addTimer(1, 189); _scene->_hotspots.activate(227, true); _counter = 0; _playingAnimFl = true; } break; case 7: if (_monkeyPosition == 3) { _scene->_hotspots.activate(227, true); _scene->_sequences.addTimer(1, 167); _playingAnimFl = true; } break; case 8: if (_monkeyPosition == 3) { _scene->_sequences.addTimer(1, 178); _playingAnimFl = true; _scene->_hotspots.activate(227, true); _counter = 0; } break; case 9: if ((_monkeyPosition == 3) && (_game._player._playerPos.x<120)) { _scene->_sequences.addTimer(1, 182); _scene->_hotspots.activate(227, true); _counter = 0; _playingAnimFl = true; } break; case 10: if (_monkeyPosition == 4) { _scene->_sequences.addTimer(1, 196); _scene->_hotspots.activate(227, true); _playingAnimFl = true; _counter = 0; } break; case 11: if ((_monkeyPosition == 4) && (_counter < 3)) { _scene->_sequences.addTimer(1, 199); _scene->_hotspots.activate(227, true); ++_counter; _playingAnimFl = true; } break; case 30: if (_monkeyPosition == 4) { _scene->_sequences.addTimer(1, 246); _scene->_hotspots.activate(227, true); _counter = 0; _playingAnimFl = true; } break; default: if ((randAction >= 12) && (randAction <= 20) && (_monkeyPosition == 2) && (_counter < 5)) { _scene->_sequences.addTimer(1, 155); ++_counter; _playingAnimFl = true; } if ((randAction >= 21) && (randAction <= 29) && (_monkeyPosition == 3) && (_counter < 3)) { _scene->_sequences.addTimer(1, 171); _playingAnimFl = true; ++_counter; } break; } } if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1)) _scene->_sequences.addTimer(1, 226); if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 2)) handlePause(); if (!_dodgeFl && !_pitchFl && !_fallFl && (_pauseMode == 1)) initPauseCounterThreshold(); handlePeek(); handleVerticalMove(); handleLookStay(); handleLookRight(); handleBlink(); handleGetBinoculars(); handleStandFromPeek(); handleDodge(); handleBinocularBlink(); handleBinocularScan(); handleJumpInTree(); handleTongue(); handleMonkeyFall(); handleJumpAndHide(); handleMonkeyEating(); handleMonkey1(); handleStandBlink(); handleMonkey2(); if ((_monkeyPosition == 1) && !_playingAnimFl && _fallFl) { _scene->_sequences.addTimer(1, 145); _playingAnimFl = true; } if ((_monkeyPosition == 2) && !_playingAnimFl && _fallFl) { _scene->_sequences.addTimer(1, 161); _playingAnimFl = true; } if ((_monkeyPosition == 4) && !_playingAnimFl && _fallFl) { _scene->_sequences.addTimer(1, 196); _playingAnimFl = true; } if ((_monkeyPosition == 3) && !_playingAnimFl && _fallFl && _forceFallFl) { _scene->_sequences.addTimer(1, 219); _playingAnimFl = true; } if ((_monkeyPosition == 1) && !_playingAnimFl && _pitchFl) { _scene->_sequences.addTimer(1, 145); _playingAnimFl = true; } if ((_monkeyPosition == 2) && !_playingAnimFl && _pitchFl) { _scene->_sequences.addTimer(1, 189); _playingAnimFl = true; } if ((_monkeyPosition == 4) && !_playingAnimFl && _pitchFl) { _scene->_sequences.addTimer(1, 212); _playingAnimFl = true; } if ((_monkeyPosition == 3) && !_playingAnimFl && _pitchFl) { _scene->_sequences.addTimer(1, 178); _playingAnimFl = true; } if ((_monkeyPosition == 1) && !_playingAnimFl && _dodgeFl) { _scene->_sequences.addTimer(1, 145); _playingAnimFl = true; } if ((_monkeyPosition == 4) && !_playingAnimFl && _dodgeFl) { _scene->_sequences.addTimer(1, 196); _playingAnimFl = true; } if ((_monkeyPosition == 3) && !_playingAnimFl && _dodgeFl) { _scene->_sequences.addTimer(1, 178); _playingAnimFl = true; } if ((_monkeyPosition == 2) && !_playingAnimFl && _dodgeFl && _forceDodgeFl) { _scene->_sequences.addTimer(1, 241); _playingAnimFl = true; } if (_dodgeFl || _fallFl) { /* if want to dodge or fall */ if (!_playingAnimFl && (_monkeyPosition == 2)) _shouldDodgeFl = true; if (!_playingAnimFl && (_monkeyPosition == 3)) _shouldFallFl = true; switch (_game._trigger) { case 228: _game._player._visible = false; _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 229); break; case 229: { int oldIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx); _scene->_sequences.addTimer(35, 230); } break; case 230: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 231); break; case 231: { int oldIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 8, 10); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 232); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], -1); _game._player._visible = false; } break; case 232: { int oldIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx); _scene->_sequences.addTimer(2, 233); _scene->_kernelMessages.reset(); if (_dodgeFl && (_monkeyPosition != 1) && (_monkeyPosition != 2)) _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138)); if (_fallFl && (_monkeyPosition != 3)) _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 34463, _game.getQuote(138)); } break; case 233: _shootReadyFl = true; break; case 234: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _scene->_kernelMessages.reset(); if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY)) { _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 16, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 12, 239); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235); } else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY)) { _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 11, 12); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 235); _vm->_sound->command(23); } break; case 235: { int oldIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 13); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], oldIdx); _scene->_sequences.addTimer(12, 236); _forceFallFl = true; _forceDodgeFl = true; } break; case 236: _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], 14, 16); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(116, 131)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 237); break; case 237: _game._player._visible = true; _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _scene->_sequences.addTimer(1, 238); break; case 238: _scene->_sequences.remove(_globals._sequenceIndexes[2]); if (_dodgeFl) _game._player._stepEnabled = true; _startShootingInTimerFl = false; if (_fallFl) { _globals[kMonkeyStatus] = MONKEY_IS_GONE; _game._objects.setRoom(OBJ_POISON_DARTS, NOWHERE); } _dodgeFl = false; _fallFl = false; _forceFallFl = false; _forceDodgeFl = false; _shouldFallFl = false; _shouldDodgeFl = false; break; case 239: _vm->_sound->command(23); break; } } if (_game._trigger == 100) _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(134)); if (_shootReadyFl && (_shouldFallFl || _shouldDodgeFl)) { _scene->_sequences.addTimer(4, 234); _shootReadyFl = false; } } void Scene209::preActions() { if (_action.isAction(VERB_WALK_TOWARDS, NOUN_FIELD_TO_WEST)) _game._player._walkOffScreenSceneId = 208; if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) { if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY) && _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) { _game._player._prepareWalkPos = Common::Point(111, 129); _game._player._prepareWalkFacing = FACING_NORTHEAST; _game._player._needToWalk = true; _game._player._readyToWalk = true; } if (_action.isAction(VERB_LOOK, NOUN_MONKEY) || _action.isAction(VERB_TALKTO, NOUN_MONKEY)) { _game._player._prepareWalkPos = Common::Point(111, 129); _game._player._prepareWalkFacing = FACING_NORTHEAST; _game._player._needToWalk = true; _game._player._readyToWalk = true; } } } void Scene209::actions() { if (_action._lookFlag) { _vm->_dialogs->show(20912); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ROCKY_AREA_TO_NORTH)) { _scene->_nextSceneId = 203; _action._inProgress = false; return; } if (_action.isAction(VERB_TALKTO, NOUN_MONKEY) && !_pitchFl && !_playingDialogFl) { _scene->_sequences.addTimer(1, _dialogAbortVal); _playingDialogFl = true; _game._player._stepEnabled = false; _action._inProgress = false; return; } switch (_game._trigger) { case 130: _game._player._stepEnabled = true; _playingDialogFl = false; _action._inProgress = false; return; case 5: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 6, 180, _game.getQuote(139)); _action._inProgress = false; return; case 6: _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151)); _scene->_sequences.addTimer(60, 130); _dialogAbortVal = 7; _action._inProgress = false; return; case 7: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 8, 180, _game.getQuote(140)); _action._inProgress = false; return; case 8: _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(149)); _scene->_sequences.addTimer(60, 130); _dialogAbortVal = 9; _action._inProgress = false; return; case 9: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(141)); _scene->_sequences.addTimer(200, 10); _action._inProgress = false; return; case 10: _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 11, 180, _game.getQuote(142)); _action._inProgress = false; return; case 11: _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(152)); _scene->_sequences.addTimer(60, 130); _dialogAbortVal = 12; _action._inProgress = false; return; case 12: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 130, _game.getQuote(143)); _scene->_sequences.addTimer(150, 13); _action._inProgress = false; return; case 13: _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 14, 180, _game.getQuote(145)); _action._inProgress = false; return; case 14: _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 0, 60, _game.getQuote(151)); _scene->_sequences.addTimer(60, 130); _dialogAbortVal = 15; _action._inProgress = false; return; case 15: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 16, 180, _game.getQuote(146)); _action._inProgress = false; return; case 16: _scene->_kernelMessages.add(Common::Point(180, 21), 0xFDFC, 0, 17, 60, _game.getQuote(154)); _action._inProgress = false; return; case 17: _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 130, 60, _game.getQuote(147)); _dialogAbortVal = 18; _action._inProgress = false; return; case 18: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(148)); _pitchFl = true; _playingDialogFl = false; _dialogAbortVal = 5; _action._inProgress = false; return; } if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) { if ((_action.isAction(VERB_SHOOT) || _action.isAction(VERB_HOSE_DOWN)) && _action.isTarget(NOUN_MONKEY) && _action.isObject(NOUN_BLOWGUN) && _game._objects.isInInventory(OBJ_BLOWGUN) && _game._objects.isInInventory(OBJ_POISON_DARTS)) { if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) { _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 231); _startShootingInTimerFl = true; _game._player._stepEnabled = false; _dodgeFl = true; _action._inProgress = false; return; } if (_action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_MONKEY) && !_startShootingInTimerFl) { _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(1, 228); _game._player._stepEnabled = false; _fallFl = true; _startShootingInTimerFl = true; _action._inProgress = false; return; } } if (_action.isAction(VERB_LOOK, NOUN_MONKEY)) { _pitchFl = true; _game._player._stepEnabled = false; _vm->_dialogs->show(20914); _action._inProgress = false; return; } } if (_action.isAction(VERB_TAKE, NOUN_PLANT_STALK) && (_game._trigger || _game._objects.isInRoom(OBJ_PLANT_STALK))) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 3, 2, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[11]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 4, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _scene->_sequences.remove(_globals._sequenceIndexes[1]); _game._objects.addToInventory(OBJ_PLANT_STALK); break; case 2: _game._player._visible = true; _game._player._stepEnabled = true; _scene->_sequences.addTimer(4, 3); _vm->_dialogs->showItem(OBJ_PLANT_STALK, 0x328); break; case 3: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_BINOCULARS) && (_game._trigger || _game._objects.isInRoom(OBJ_BINOCULARS))) { switch (_game._trigger) { case 0: _globals._spriteIndexes[10] = _scene->_sprites.addSprites("*RXMBD_8"); _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 3, 2, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[10]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_SPRITE, 4, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _scene->_sequences.remove(_globals._sequenceIndexes[9]); _game._objects.addToInventory(OBJ_BINOCULARS); break; case 2: _game._player._visible = true; _game._player._stepEnabled = true; _binocularsDroppedFl = false; _scene->_sequences.addTimer(4, 3); break; case 3: _vm->_dialogs->showItem (OBJ_BINOCULARS, 0x51AF); _scene->_sprites.remove(_globals._spriteIndexes[10]); break; } _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_SKY)) { _vm->_dialogs->show(20901); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_BAMBOO_LIKE_PLANT)) { _vm->_dialogs->show(20902); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINSIDE)) { _vm->_dialogs->show(20903); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_GRASSY_FIELD)) { _vm->_dialogs->show(20904); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_WEST)) { _vm->_dialogs->show(20905); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_ROCKY_AREA_TO_NORTH)) { _vm->_dialogs->show(20906); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_PLANT_STALK) && (_action._savedFields._mainObjectSource == 4)) { _vm->_dialogs->show(20907); _action._inProgress = false; return; } if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_MONKEY) || _action.isAction(VERB_THROW, NOUN_TWINKIFRUIT, NOUN_MONKEY)) { _vm->_dialogs->show(20909); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_TREES)) { _vm->_dialogs->show(20913); _action._inProgress = false; return; } if (_action.isAction(VERB_THROW, NOUN_MONKEY) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) { if (!_action.isObject(NOUN_POISON_DARTS)) { _vm->_dialogs->show(20915); } _action._inProgress = false; return; } if (_action.isAction(VERB_THROW, NOUN_POISON_DARTS, NOUN_MONKEY)) { _vm->_dialogs->show(20916); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) { if (_globals[kMonkeyStatus] == MONKEY_HAS_BINOCULARS) { if (_monkeyPosition == 1) _vm->_dialogs->show(20917); else _vm->_dialogs->show(20918); } else { if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) _vm->_dialogs->show(20917); else _vm->_dialogs->show(20919); } _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_MELON_MUSH)) { _vm->_dialogs->show(20920); _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_MELON_MUSH)) { _vm->_dialogs->show(20921); _action._inProgress = false; return; } } /*****************************************************************************/ Scene210::Scene210(MADSEngine *vm) : Scene2xx(vm) { _curDialogNode = -1; _nextHandsPlace = 0; _twinkleAnimationType = 0; _twinklesCurrentFrame = 0; _shouldTalk = false; _shouldFaceRex = false; _shouldMoveHead = false; _stopWalking = false; _twinklesTalking = false; _twinklesTalk2 = false; _doorway = 0; _subQuote2 = ""; } void Scene210::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsSint32LE(_curDialogNode); s.syncAsSint32LE(_nextHandsPlace); s.syncAsSint32LE(_twinkleAnimationType); s.syncAsSint32LE(_twinklesCurrentFrame); s.syncAsByte(_shouldTalk); s.syncAsByte(_shouldFaceRex); s.syncAsByte(_shouldMoveHead); s.syncAsByte(_stopWalking); s.syncAsByte(_twinklesTalking); s.syncAsByte(_twinklesTalk2); s.syncAsSint32LE(_doorway); s.syncString(_subQuote2); } void Scene210::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_DOORWAY); _scene->addActiveVocab(VERB_WALK_THROUGH); } void Scene210::handleConversations() { if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _game._player._stepEnabled = false; Common::String curQuote = _game.getQuote(_action._activeAction._verbId); if (_scene->_kernelMessages._talkFont->getWidth(curQuote, _scene->_textSpacing) > 200) { Common::String subQuote1; _game.splitQuote(curQuote, subQuote1, _subQuote2); _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 240, subQuote1); _scene->_sequences.addTimer(60, 50); } else { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote); } } else if (_game._trigger == 50) { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 240, _subQuote2); _scene->_sequences.addTimer(180, 1); } else { if (_game._trigger == 1) _scene->_kernelMessages.reset(); switch (_curDialogNode) { case 1: handleConversation1(); break; case 2: handleConversation2(); break; case 3: handleConversation3(); break; case 5: handleConversation5(); break; case 6: handleConversation6(); break; case 7: handleConversation7(); break; case 8: handleConversation8(); break; } } } void Scene210::handleConversation1() { switch (_action._activeAction._verbId) { case 180: setDialogNode(2); break; case 181: setDialogNode(6); break; case 182: setDialogNode(4); break; case 183: setDialogNode(9); break; case 184: setDialogNode(0); break; } } void Scene210::handleConversation2() { switch (_action._activeAction._verbId) { case 187: setDialogNode(3); break; case 188: setDialogNode(4); break; case 189: setDialogNode(0); break; } } void Scene210::handleConversation3() { switch (_action._activeAction._verbId) { case 193: setDialogNode(6); break; case 194: setDialogNode(5); break; case 195: setDialogNode(4); break; case 196: setDialogNode(0); break; } } void Scene210::handleConversation5() { switch (_action._activeAction._verbId) { case 204: setDialogNode(6); break; case 205: case 206: setDialogNode(4); break; case 207: setDialogNode(0); break; } } void Scene210::handleConversation6() { switch (_action._activeAction._verbId) { case 211: setDialogNode(7); break; case 212: setDialogNode(4); break; case 213: setDialogNode(0); break; } } void Scene210::handleConversation7() { switch (_action._activeAction._verbId) { case 216: case 217: case 219: setDialogNode(4); break; case 218: setDialogNode(8); break; case 220: setDialogNode(0); break; } } void Scene210::handleConversation8() { switch (_action._activeAction._verbId) { case 223: case 224: setDialogNode(4); break; case 225: case 226: setDialogNode(9); break; case 227: setDialogNode(0); break; } } void Scene210::setDialogNode(int node) { switch (node) { case 0: _scene->_userInterface.setup(kInputBuildingSentences); _shouldFaceRex = false; _shouldTalk = false; _game._player._stepEnabled = true; _curDialogNode = 0; break; case 2: switch (_game._trigger) { case 1: _nextHandsPlace = 1; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xB9, -1, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: _nextHandsPlace = 0; handleTwinklesSpeech(186, 0, 0); _scene->_sequences.addTimer(180, 3); break; default: _nextHandsPlace = 0; _shouldTalk = false; _game._player._stepEnabled = true; newNode(2); break; } break; case 3: switch (_game._trigger) { case 1: _nextHandsPlace = 0; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xBE, -2, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: _nextHandsPlace = 2; handleTwinklesSpeech(191, -1, 0); _scene->_sequences.addTimer(180, 3); break; case 3: _nextHandsPlace = 0; handleTwinklesSpeech(192, 0, 0); _scene->_sequences.addTimer(180, 4); break; default: _shouldTalk = false; _game._player._stepEnabled = true; newNode(3); break; } break; case 4: if (_game._trigger == 1) { _nextHandsPlace = 1; _shouldTalk = true; _game._player._stepEnabled = false; int quote; if (_game._storyMode == STORYMODE_NAUGHTY) quote = _vm->getRandomNumber(199, 201); else quote = _vm->getRandomNumber(197, 198); if (_twinklesTalking) { handleTwinklesSpeech(quote, 0, 360); _scene->_sequences.addTimer(120, 2); } else { _scene->_sequences.addTimer(6, 1); } } else { _scene->_userInterface.setup(kInputBuildingSentences); _shouldFaceRex = false; _shouldTalk = false; _game._player._stepEnabled = true; } break; case 5: switch (_game._trigger) { case 1: _nextHandsPlace = 2; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xCA, -1, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: _nextHandsPlace = 1; handleTwinklesSpeech(0xCB, 0, 0); _scene->_sequences.addTimer(180, 3); break; default: _nextHandsPlace = 2; _shouldTalk = false; _game._player._stepEnabled = true; newNode(5); break; } break; case 6: switch (_game._trigger) { case 1: _nextHandsPlace = 1; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xD0, -2, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: handleTwinklesSpeech(0xD1, -1, 0); _scene->_sequences.addTimer(180, 3); break; case 3: _nextHandsPlace = 1; handleTwinklesSpeech(0xD2, 0, 0); _scene->_sequences.addTimer(180, 4); break; default: _nextHandsPlace = 0; _shouldTalk = false; _game._player._stepEnabled = true; newNode(6); break; } break; case 7: switch (_game._trigger) { case 1: _nextHandsPlace = 2; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xD6, -1, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: handleTwinklesSpeech(0xD7, 0, 0); _scene->_sequences.addTimer(180, 3); break; default: _shouldTalk = false; _game._player._stepEnabled = true; newNode(7); break; } break; case 8: switch (_game._trigger) { case 1: _nextHandsPlace = 2; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { handleTwinklesSpeech(0xDD, -1, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: handleTwinklesSpeech(0xDE, 0, 0); _scene->_sequences.addTimer(180, 3); break; default: _shouldTalk = false; _game._player._stepEnabled = true; newNode(8); break; } break; case 9: switch (_game._trigger) { case 1: _nextHandsPlace = 0; _shouldTalk = true; _game._player._stepEnabled = false; if (_twinklesTalking) { _scene->_userInterface.emptyConversationList(); _scene->_userInterface.setup(kInputConversation); handleTwinklesSpeech(0xE4, -1, 0); _scene->_sequences.addTimer(180, 2); } else { _scene->_sequences.addTimer(6, 1); } break; case 2: handleTwinklesSpeech(0xE5, 0, 0); _scene->_sequences.addTimer(180, 3); break; case 3: _twinkleAnimationType = 2; _globals[kCurtainOpen] = true; _game._player._visible = false; _vm->_palette->lock(); _scene->_kernelMessages.reset(); _scene->freeAnimation(); _scene->_animation[0] = nullptr; _scene->resetScene(); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1)); _game.loadQuoteSet(0xE6, 0xE9, 0xEA, 0xE7, 0xE8, 0); _scene->loadAnimation(formAnimName('B', -1), 4); break; case 4: { _globals._spriteIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5); _scene->_sequences.setDepth(_globals._spriteIndexes[8], 1); int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 20), 0x1110, 32, 5, 180, _game.getQuote(231)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; case 5: { int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 40), 0xFDFC, 32, 6, 180, _game.getQuote(233)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; case 6: { int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 60), 0x1110, 32, 7, 180, _game.getQuote(232)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; case 7: { int msgIndex = _scene->_kernelMessages.add(Common::Point(160, 80), 0xFDFC, 32, 8, 180, _game.getQuote(234)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; case 8: _globals[kTwinklesStatus] = TWINKLES_GONE; _scene->_nextSceneId = 216; break; } break; } } void Scene210::handleTwinklesSpeech(int quoteId, int shiftX, uint32 delay) { _scene->_kernelMessages.add(Common::Point(10, 70 + (shiftX * 14)), 0xFDFC, 0, 0, (delay == 0) ? INDEFINITE_TIMEOUT : delay, _game.getQuote(quoteId)); } void Scene210::newNode(int node) { _curDialogNode = node; switch (_curDialogNode) { case 1: _conv1.start(); break; case 2: _conv2.start(); break; case 3: _conv3.start(); break; case 5: _conv5.start(); break; case 6: _conv6.start(); break; case 7: _conv7.start(); break; case 8: _conv8.start(); break; default: break; } } void Scene210::restoreDialogNode(int node, int msgId, int posY) { int curQuoteId = msgId; int curY = 1 - posY; for (int count = 0; count < posY; count++) { handleTwinklesSpeech(curQuoteId, curY, 0); curY++; curQuoteId++; } newNode(node); } void Scene210::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1)); if (!_game._visitedScenes._sceneRevisited) _globals[kCurtainOpen] = 0; if (_scene->_priorSceneId == 205) _game._player._playerPos = Common::Point(277, 56); else if (_scene->_priorSceneId == 215) { _game._player._playerPos = Common::Point(168, 128); _game._player._facing = FACING_SOUTH; _globals[kCurtainOpen] = true; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) _game._player._playerPos = Common::Point(308, 132); if (!_globals[kCurtainOpen]) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); } else { int idx = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36)); _doorway = _scene->_dynamicHotspots.setPosition(idx, Common::Point(168, 127), FACING_NORTH); _scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP); } _game.loadQuoteSet(0x5A, 0x73, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xB7, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0); _conv1.setup(0x2E, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0); if (!_game._visitedScenes._sceneRevisited) { _conv1.set(0x2E, 0xB4, 0xB5, 0xB6, 0xB8, 0); if (_game._widepipeCtr >= 2) _conv1.write(0xB7, true); } bool sceneRevisited = _game._visitedScenes._sceneRevisited; _conv2.setup(0x2F, 0xBC, 0xBB, 0xBD, sceneRevisited ? 0 : -1); _conv3.setup(0x30, 0xC3, 0xC2, 0xC1, 0xC4, sceneRevisited ? 0 : -1); _conv5.setup(0x31, 0xCD, 0xCC, 0xCE, 0xCF, sceneRevisited ? 0 : -1); _conv6.setup(0x32, 0xD3, 0xD4, 0xD5, sceneRevisited ? 0 : -1); _conv7.setup(0x33, 0xD8, 0xDA, 0xD9, 0xDB, 0xDC, sceneRevisited ? 0 : -1); _conv8.setup(0x34, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, sceneRevisited ? 0 : -1); _twinkleAnimationType = 0; _twinklesCurrentFrame = 0; if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _shouldMoveHead = false; _shouldFaceRex = false; _shouldTalk = false; _nextHandsPlace = 0; _twinklesTalking = false; _curDialogNode = 0; _stopWalking = false; _twinklesTalk2 = (_globals[kTwinklesApproached] > 0); } if (_globals[kTwinklesStatus] == 0) { _scene->loadAnimation(formAnimName('A', -1)); _twinkleAnimationType = 1; } else _scene->_hotspots.activate(476, false); if (_curDialogNode) { int quote = 0; int number = 0; switch (_curDialogNode) { case 1: quote = 0xB3; number = 1; break; case 2: quote = 0xB9; number = 2; break; case 3: quote = 0xBE; number = 3; break; case 5: quote = 0xCA; number = 2; break; case 6: quote = 0xD0; number = 3; break; case 7: quote = 0xD6; number = 2; break; case 8: quote = 0xDD; number = 2; break; } restoreDialogNode(_curDialogNode, quote, number); if (_scene->_animation[0]) _scene->_animation[0]->setCurrentFrame(131); } _vm->_palette->setEntry(252, 63, 63, 10); _vm->_palette->setEntry(253, 45, 45, 5); sceneEntrySound(); } void Scene210::step() { if ((_twinkleAnimationType == 1) && _scene->_animation[0]) { if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) { _twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame(); int reset_frame = -1; int random = _vm->getRandomNumber(1, 1000); switch (_twinklesCurrentFrame) { case 31: case 58: case 74: case 108: case 190: if (_shouldFaceRex) reset_frame = 108; else if ((random <= 100) || _shouldMoveHead) reset_frame = 74; else if (random <= 300) reset_frame = 58; else if (random <= 500) reset_frame = 31; else reset_frame = 0; break; case 80: case 90: _twinklesTalking = false; if (_shouldMoveHead) { reset_frame = 90; } else if (_twinklesCurrentFrame == 90) { if ((random <= 400) || _shouldFaceRex) reset_frame = 99; else reset_frame = 79; } break; case 98: if (_shouldMoveHead) reset_frame = 91; break; case 99: if ((random <= 400) && !_shouldFaceRex) reset_frame = 79; break; case 124: case 136: case 174: case 143: case 152: if (_nextHandsPlace == 3) reset_frame = 174; else if (!_shouldFaceRex) reset_frame = 174; else if (_nextHandsPlace == 1) reset_frame = 136; else if (_nextHandsPlace == 2) reset_frame = 152; else if (_shouldTalk) reset_frame = 124; else reset_frame = (random <= 200) ? 131 : 143; break; case 131: if (_shouldTalk) { switch (_nextHandsPlace) { case 1: reset_frame = 136; break; case 2: reset_frame = 152; break; default: reset_frame = 124; break; } } break; case 138: case 141: if ((_nextHandsPlace == 0) || !_shouldFaceRex) reset_frame = 141; else if (_nextHandsPlace == 2) reset_frame = 152; else if (!_shouldTalk || (_twinklesCurrentFrame == 141)) reset_frame = 137; break; case 153: case 169: if ((_nextHandsPlace == 0) || !_shouldFaceRex) reset_frame = 169; else if (_nextHandsPlace == 1) reset_frame = 136; else if (_shouldTalk) reset_frame = 153; else reset_frame = 162; break; case 162: if (_shouldTalk) { switch (_nextHandsPlace) { case 0: reset_frame = 124; break; case 1: reset_frame = 136; break; default: reset_frame = 153; break; } } break; } if (reset_frame >= 0) { if (reset_frame != _scene->_animation[0]->getCurrentFrame()) { _scene->_animation[0]->setCurrentFrame(reset_frame); _twinklesCurrentFrame = reset_frame; } if ((reset_frame == 90) || (reset_frame == 91) || (reset_frame == 124) || (reset_frame == 153) || ((reset_frame == 137) && _shouldTalk)) { _twinklesTalking = true; } else { _twinklesTalking = false; } } } } if ((_twinkleAnimationType == 2) && _scene->_animation[0]) { if (_twinklesCurrentFrame != _scene->_animation[0]->getCurrentFrame()) { _twinklesCurrentFrame = _scene->_animation[0]->getCurrentFrame(); int reset_frame = -1; if (_twinklesCurrentFrame == 53) { _scene->_kernelMessages.add(Common::Point(151, 61), 0xFDFC, 32, 70, 180, _game.getQuote(230)); _shouldTalk = true; } else if ((_twinklesCurrentFrame == 75) && _shouldTalk) reset_frame = 60; if ((reset_frame >= 0) && (reset_frame != _scene->_animation[0]->getCurrentFrame())) { _scene->_animation[0]->setCurrentFrame(reset_frame); _twinklesCurrentFrame = reset_frame; } } if (_game._trigger == 70) _shouldTalk = false; } if ((_twinkleAnimationType == 1) && (_scene->_rails.getNext() > 0)) { _game._player.walk(Common::Point(214, 150), FACING_NORTHWEST); _scene->_rails.resetNext(); _stopWalking = true; } } void Scene210::preActions() { _stopWalking = false; if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_EAST)) _game._player._walkOffScreenSceneId = 211; } void Scene210::actions() { if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_HUT_TO_NORTH)) { _vm->_dialogs->show(21017); } else if (_game._screenObjects._inputMode == kInputConversation) { handleConversations(); } else if (_action.isAction(VERB_TALKTO, NOUN_NATIVE_WOMAN) || ((_game._player._playerPos == Common::Point(214, 150)) && (_game._player._facing == FACING_NORTHWEST) && (_twinkleAnimationType == 1) && _stopWalking)) { switch (_game._trigger) { case 0: { _game._player._stepEnabled = false; int quote; if (_globals[kTwinklesApproached] == 0) quote = 90; else if (_globals[kTwinklesApproached] == 1) quote = 115; else quote = 171; _shouldFaceRex = true; _nextHandsPlace = 0; _scene->_kernelMessages.reset(); _scene->_kernelMessages.addQuote(quote, 1, 120); } break; case 1: _shouldTalk = true; if (!_twinklesTalking) { _scene->_sequences.addTimer(6, 1); } else { if (_globals[kTwinklesApproached] == 0) { handleTwinklesSpeech(0xAF, -1, 0); handleTwinklesSpeech(0xB0, 0, 0); } else if (_globals[kTwinklesApproached] == 1) { handleTwinklesSpeech(0xB1, 0, 0); } else { int quote = _twinklesTalk2 ? 0xB3 : 0xB2; _twinklesTalk2 = true; handleTwinklesSpeech(quote, 0, 0); } _scene->_sequences.addTimer(60, 3); } break; case 3: _game._player._stepEnabled = true; _shouldMoveHead = false; _shouldTalk = false; if (_globals[kTwinklesApproached] < 2) _globals[kTwinklesApproached]++; _conv1.start(); _curDialogNode = 1; break; } } else if (_action.isAction(VERB_GIVE, NOUN_NATIVE_WOMAN) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) { switch (_game._trigger) { case 0: { int quote = _vm->getRandomNumber(172, 174); _shouldMoveHead = true; _game._player._stepEnabled = false; handleTwinklesSpeech(quote, 0, 120); _scene->_sequences.addTimer(120, 1); } break; case 1: _game._player._stepEnabled = true; _shouldMoveHead = false; break; } } else if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTH) || _action.isAction(VERB_WALK_TOWARDS, NOUN_HUT_TO_NORTH)) { _scene->_nextSceneId = 205; } else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) { _scene->_nextSceneId = 215; } else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_OPEN, NOUN_CURTAIN)) && !_globals[kCurtainOpen]) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: _game._player._stepEnabled = true; _globals[kCurtainOpen] = true; _doorway = _scene->_dynamicHotspots.add(112, 395, -1, Common::Rect(163, 87, 163 + 19, 87 + 36)); _scene->_dynamicHotspots.setPosition(_doorway, Common::Point(168, 127), FACING_NORTH); _scene->_dynamicHotspots.setCursor(_doorway, CURSOR_GO_UP); break; } } else if ((_action.isAction(VERB_PULL, NOUN_CURTAIN) || _action.isAction(VERB_CLOSE, NOUN_CURTAIN)) && _globals[kCurtainOpen]) { switch (_game._trigger) { case 0: _scene->_sequences.remove(_globals._sequenceIndexes[1]); _game._player._stepEnabled = false; _game._player._facing = FACING_NORTH; _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 0, 0, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); _game._player._stepEnabled = false; break; case 1: _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 5); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.addTimer(48, 2); break; case 2: _scene->_dynamicHotspots.remove(_doorway); _game._player._stepEnabled = true; _globals[kCurtainOpen] = false; break; } } else if (_action.isAction(VERB_LOOK, NOUN_HUT)) { if (_globals[kTwinklesStatus] == TWINKLES_GONE) { if (_game._storyMode == STORYMODE_NAUGHTY) _vm->_dialogs->show(21003); else _vm->_dialogs->show(21002); } else { _vm->_dialogs->show(21001); } } else if (_action.isAction(VERB_LOOK, NOUN_BRA)) { _vm->_dialogs->show(21004); } else if (_action.isAction(VERB_LOOK, NOUN_HOTPANTS)) { _vm->_dialogs->show(21005); } else if (_action.isAction(VERB_TAKE, NOUN_HOTPANTS) || _action.isAction(VERB_TAKE, NOUN_BRA)) { _vm->_dialogs->show(21006); } else if (_action.isAction(VERB_LOOK, NOUN_STREAM)) { _vm->_dialogs->show(21007); } else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN)) { _vm->_dialogs->show(21008); } else if (_action.isAction(VERB_LOOK, NOUN_VILLAGE_PATH)) { _vm->_dialogs->show(21009); } else if (_action.isAction(VERB_LOOK, NOUN_NATIVE_WOMAN)) { _vm->_dialogs->show(21010); } else if (_action.isAction(VERB_SHOOT, NOUN_NATIVE_WOMAN) || _action.isAction(VERB_HOSE_DOWN, NOUN_NATIVE_WOMAN)) { _vm->_dialogs->show(21011); } else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTH)) { _vm->_dialogs->show(21012); } else if (_action.isAction(VERB_LOOK, NOUN_CURTAIN)) { _vm->_dialogs->show(21013); } else if (_action.isAction(VERB_LOOK, NOUN_CLOTHESLINE)) { _vm->_dialogs->show(21014); } else if (_action.isAction(VERB_TAKE, NOUN_CLOTHESLINE)) { _vm->_dialogs->show(21015); } else if (_action.isAction(VERB_LOOK, NOUN_HUT_TO_NORTH)) { _vm->_dialogs->show(21016); } else { // Not handled return; } _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene211::Scene211(MADSEngine *vm) : Scene2xx(vm) { _ambushFl = false; _wakeFl = false; _monkeyFrame = 0; _scrollY = 0; _monkeyTime = 0; } void Scene211::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsByte(_ambushFl); s.syncAsByte(_wakeFl); s.syncAsSint32LE(_monkeyFrame); s.syncAsSint32LE(_scrollY); s.syncAsUint32LE(_monkeyTime); } void Scene211::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_SLITHERING_SNAKE); } void Scene211::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites("*SC002Z2"); _wakeFl = false; if (_scene->_priorSceneId == 210) _game._player._playerPos = Common::Point(25, 148); else if (_scene->_priorSceneId == 205) { _game._player._playerPos = Common::Point(49, 133); _game._player._facing = FACING_WEST; _wakeFl = true; _game._player._stepEnabled = false; _game._player._visible = false; _scene->loadAnimation(formAnimName('A', -1), 100); _scene->_animation[0]->setCurrentFrame(169); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(310, 31); _game._player._facing = FACING_SOUTHWEST; } if (_vm->getRandomNumber(1, 8) == 1) { _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(202, 126)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 8); _scene->_sequences.setMotion(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, -200, 0); _scene->_dynamicHotspots.add(324, 13, _globals._sequenceIndexes[2], Common::Rect(1, 1, 1 + 41, 1 + 10)); } if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_BINOCULARS); _vm->_palette->setEntry(252, 63, 44, 30); _vm->_palette->setEntry(253, 63, 20, 22); _game.loadQuoteSet(0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 1, 0); if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) _scene->_kernelMessages.initRandomMessages(2, Common::Rect(0, 0, 54, 30), 13, 2, 0xFDFC, 60, 151, 152, 153, 154, 0); _monkeyTime = _vm->_game->_scene._frameStartTime; _scrollY = 30; _ambushFl = false; _monkeyFrame = 0; sceneEntrySound(); } void Scene211::step() { if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) { _scene->_kernelMessages.randomServer(); if (!_ambushFl && !_wakeFl && (_vm->_game->_scene._frameStartTime >= _monkeyTime)) { int chanceMinor = _scene->_kernelMessages.checkRandom() * 4 + 1; if (_scene->_kernelMessages.generateRandom(80, chanceMinor)) _vm->_sound->command(18); _monkeyTime = _vm->_game->_scene._frameStartTime + 2; } if ((_game._player._playerPos == Common::Point(52, 132)) && (_game._player._facing == FACING_WEST) && !_game._player._moving && (_game._trigger || !_ambushFl)) { switch (_game._trigger) { case 0: if (_game._objects.isInInventory(OBJ_BINOCULARS)) { _ambushFl = true; _monkeyFrame = 0; _game._player._stepEnabled = false; _game._player._visible = false; _scene->_kernelMessages.reset(); _scene->loadAnimation(formAnimName('A', -1), 90); _vm->_sound->command(19); int count = (int)_game._objects._inventoryList.size(); for (int idx = 0; idx < count; idx++) { if ((_game._objects._inventoryList[idx] == OBJ_BINOCULARS) && (_scene->_userInterface._selectedInvIndex != idx)) _scene->_userInterface.selectObject(idx); } } break; case 90: _vm->_sound->command(10); _game._player._stepEnabled = true; _game._player._visible = true; _game._player._playerPos = Common::Point(49, 133); _ambushFl = false; _globals[kMonkeyStatus] = MONKEY_HAS_BINOCULARS; break; } } } if (_ambushFl && (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame)) { _monkeyFrame = _scene->_animation[0]->getCurrentFrame(); switch (_monkeyFrame) { case 2: { int msgIndex = _scene->_kernelMessages.add(Common::Point(12, 4), 0xFDFC, 0, 0, 60, _game.getQuote(157)); _scene->_kernelMessages.setQuoted(msgIndex, 2, true); } break; case 12: { int msgIndex = _scene->_kernelMessages.add(Common::Point(35, 20), 0xFDFC, 0, 0, 60, _game.getQuote(155)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); } break; case 42: { int msgIndex = _scene->_kernelMessages.add(Common::Point(60, 45), 0xFDFC, 0, 0, 60, _game.getQuote(156)); _scene->_kernelMessages.setQuoted(msgIndex, 6, true); } break; case 73: _scene->_kernelMessages.add(Common::Point(102, 95), 0xFDFC, 32, 0, 75, _game.getQuote(157)); break; case 90: { int msgIndex = _scene->_kernelMessages.add(Common::Point(102, 95), 0xFDFC, 32, 0, 60, _game.getQuote(158)); _scene->_kernelMessages.setQuoted(msgIndex, 6, true); } break; case 97: _scene->_userInterface.selectObject(-1); _game._objects.removeFromInventory(OBJ_BINOCULARS, 1); break; case 177: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(161)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 181: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(162)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 188: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(163)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 200: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(164)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; } } if (_wakeFl) { if (_game._trigger == 100) { _game._player._visible = true; _game._player._stepEnabled = true; _wakeFl = false; } if (_scene->_animation[0]->getCurrentFrame() > _monkeyFrame) { _monkeyFrame = _scene->_animation[0]->getCurrentFrame(); switch (_scene->_animation[0]->getCurrentFrame()) { case 177: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(165)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 181: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(166)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 188: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(167)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; case 200: { int msgIndex = _scene->_kernelMessages.add(Common::Point(63, _scrollY), 0x1110, 0, 0, 180, _game.getQuote(168)); _scene->_kernelMessages.setQuoted(msgIndex, 4, true); _scrollY += 14; } break; } } } } void Scene211::preActions() { if (_action.isAction(VERB_WALK_DOWN, NOUN_JUNGLE_PATH) && _game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) && (_scene->_customDest.x <= 52) && (_scene->_customDest.y >= 132)) _game._player.walk(Common::Point(52, 132), FACING_WEST); if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_WEST)) { if (_game._objects.isInInventory(OBJ_BINOCULARS) && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)) _game._player.walk(Common::Point(52, 132), FACING_WEST); else _game._player._walkOffScreenSceneId = 210; } if (_action.isAction(VERB_WALK_DOWN, NOUN_PATH_TO_NORTHEAST)) _game._player._walkOffScreenSceneId = 207; } void Scene211::actions() { if (_action._lookFlag && (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY)) _vm->_dialogs->show(21111); else if (_action.isAction(VERB_LOOK, NOUN_BINOCULARS, NOUN_PALM_TREE)) _vm->_dialogs->show(21116); else if (_action.isAction(VERB_LOOK, NOUN_BUSHY_FERN)) _vm->_dialogs->show(21101); else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE_PATH)) _vm->_dialogs->show(21102); else if (_action.isAction(VERB_LOOK, NOUN_PALM_TREE)) { if (_globals[kMonkeyStatus] == MONKEY_AMBUSH_READY) { if (_game._storyMode == STORYMODE_NAUGHTY) _vm->_dialogs->show(21103); else _vm->_dialogs->show(21104); } else { _vm->_dialogs->show(21105); } } else if (_action.isAction(VERB_LOOK, NOUN_THICK_UNDERGROWTH)) { if (_game._storyMode == STORYMODE_NAUGHTY) _vm->_dialogs->show(21106); else _vm->_dialogs->show(21107); } else if (_action.isAction(VERB_LOOK, NOUN_JUNGLE)) _vm->_dialogs->show(21108); else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_NORTHEAST)) _vm->_dialogs->show(21109); else if (_action.isAction(VERB_LOOK, NOUN_PATH_TO_WEST)) _vm->_dialogs->show(21110); else if (_action.isAction(VERB_LOOK, NOUN_SLITHERING_SNAKE)) _vm->_dialogs->show(21113); else if (_action.isAction(VERB_TAKE, NOUN_SLITHERING_SNAKE)) _vm->_dialogs->show(21114); else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) _vm->_dialogs->show(21115); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene212::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_BOUNCING_REPTILE); } void Scene212::enter() { // CHECKME: Some useless variables have been remove here if (_scene->_priorSceneId == 208) { _game._player._playerPos = Common::Point(195, 85); _game._player._facing = FACING_SOUTH; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(67, 117); _game._player._facing = FACING_NORTHEAST; } sceneEntrySound(); } void Scene212::step() { // CHECKME: Could we move the dino? } void Scene212::preActions() { if (_action.isAction(VERB_WALK_THROUGH, NOUN_CAVE_ENTRANCE)) _game._player._walkOffScreenSceneId = 111; } void Scene212::actions() { if (_action._lookFlag) _vm->_dialogs->show(21209); else if (_action.isAction(VERB_WALK_TOWARDS) && (_action.isObject(NOUN_FIELD_TO_NORTH) || _action.isObject(NOUN_MOUNTAINS))) _scene->_nextSceneId = 208; else if (_action.isAction(VERB_WALK_TOWARDS, NOUN_CAVE)) _scene->_nextSceneId = 111; else if (_action.isAction(VERB_LOOK, NOUN_GRASS)) _vm->_dialogs->show(21201); else if (_action.isAction(VERB_LOOK, NOUN_ROCKS)) _vm->_dialogs->show(21202); else if (_action.isAction(VERB_LOOK, NOUN_CAVE_ENTRANCE)) _vm->_dialogs->show(21203); else if (_action.isAction(VERB_LOOK, NOUN_SKY)) _vm->_dialogs->show(21204); else if (_action.isAction(VERB_LOOK, NOUN_FIELD_TO_NORTH)) _vm->_dialogs->show(21205); else if (_action.isAction(VERB_LOOK, NOUN_TREES)) _vm->_dialogs->show(21206); else if (_action.isAction(VERB_LOOK, NOUN_PLANTS)) _vm->_dialogs->show(21207); else if (_action.isAction(VERB_LOOK, NOUN_MOUNTAINS)) _vm->_dialogs->show(21208); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene213::setup() { _game._player._spritesPrefix = ""; // The original is calling Scene2xx::setAAName() _game._aaName = Resources::formatAAName(2); } void Scene213::enter() { if (_globals[kMeteorologistWatch] != METEOROLOGIST_NORMAL) _handSpriteId = _scene->_sprites.addSprites("*METHAND"); else if (_globals[kSexOfRex] == REX_MALE) _handSpriteId = _scene->_sprites.addSprites("*REXHAND"); else _handSpriteId = _scene->_sprites.addSprites("*ROXHAND"); teleporterEnter(); // The original is calling Scene2xx::sceneEntrySound() if (_vm->_musicFlag) { if (_globals[kMeteorologistWatch] == METEOROLOGIST_NORMAL) _vm->_sound->command(1); else _vm->_sound->command(9); } else { _vm->_sound->command(2); } } void Scene213::step() { teleporterStep(); } void Scene213::actions() { if (teleporterActions()) { _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_CONTROL_PANEL)) _vm->_dialogs->show(21301); else if (_action.isAction(VERB_LOOK, NOUN_KEYPAD) || _action.isAction (VERB_INSPECT, NOUN_KEYPAD)) _vm->_dialogs->show(21302); else if (_action.isAction(VERB_LOOK, NOUN_DISPLAY)) _vm->_dialogs->show(21303); else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT) || _action.isAction(VERB_PEER_THROUGH, NOUN_VIEWPORT)) _vm->_dialogs->show(21304); else if (_action.isAction(VERB_LOOK, NOUN_DEVICE)) _vm->_dialogs->show(21305); 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_FROWN_KEY) || _action.isAction(VERB_LOOK, NOUN_ENTER_KEY)) _vm->_dialogs->show(21306); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene214::Scene214(MADSEngine *vm) : Scene2xx(vm) { _devilTime = 0; _devilRunningFl = false; } void Scene214::synchronize(Common::Serializer &s) { Scene2xx::synchronize(s); s.syncAsUint32LE(_devilTime); s.syncAsByte(_devilRunningFl); } void Scene214::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_CAPTIVE_CREATURE); _scene->addActiveVocab(VERB_WALKTO); } void Scene214::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('e', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('t', -1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_7"); _devilTime = _game._player._priorTimer; _devilRunningFl = false; if (_game._objects.isInRoom(OBJ_POISON_DARTS)) { _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(103, 86)); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 11); } else { _scene->_hotspots.activate(NOUN_POISON_DARTS, false); } if (_game._objects.isInRoom(OBJ_BLOWGUN)) { _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[2], Common::Point(90, 87)); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 13); } else { _scene->_hotspots.activate(NOUN_BLOWGUN, false); } if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) _game._player._playerPos = Common::Point(191, 152); sceneEntrySound(); } void Scene214::step() { if ((_game._player._priorTimer - _devilTime > 800) && !_devilRunningFl) { _devilRunningFl = true; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 6, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 4); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2); _scene->_dynamicHotspots.add(451, 13, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0)); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); } if (_devilRunningFl) { switch (_game._trigger) { case 71: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 5, 0, 0); _scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]); _scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0)); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 5, 8); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 72); } break; case 72: { int oldIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 9, 1, 0, 0); _scene->_sequences.updateTimeout(oldIdx, _globals._sequenceIndexes[3]); _scene->_dynamicHotspots.add(451, VERB_WALKTO, _globals._sequenceIndexes[3], Common::Rect(0, 0, 0, 0)); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 9, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 2); _devilTime = _game._player._priorTimer; _devilRunningFl = false; } break; } } } void Scene214::actions() { if (_action._lookFlag) _vm->_dialogs->show(21427); else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT)) _scene->_nextSceneId = 207; else if (_action.isAction(VERB_TAKE, NOUN_POISON_DARTS) && (_game._trigger || _game._objects.isInRoom(OBJ_POISON_DARTS))) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], true, 6, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: _globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], true, 6, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); _scene->_sequences.remove(_globals._sequenceIndexes[1]); _game._objects.addToInventory(OBJ_POISON_DARTS); _scene->_hotspots.activate(NOUN_POISON_DARTS, false); break; case 2: _game._player._visible = true; _scene->_sequences.addTimer(48, 3); break; case 3: _game._player._stepEnabled = true; _vm->_dialogs->showItem(OBJ_POISON_DARTS, 0x53A5); break; } } else if (_action.isAction(VERB_TAKE, NOUN_BLOWGUN) && (_game._trigger || _game._objects.isInRoom(OBJ_BLOWGUN))) { 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.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: _globals._sequenceIndexes[4] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[4], false, 6, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); _scene->_sequences.remove(_globals._sequenceIndexes[2]); _game._objects.addToInventory(OBJ_BLOWGUN); _scene->_hotspots.activate(NOUN_BLOWGUN, false); break; case 2: _game._player._visible = true; _scene->_sequences.addTimer(48, 3); break; case 3: _game._player._stepEnabled = true; _vm->_dialogs->showItem(OBJ_BLOWGUN, 0x329); break; } } else if (_action.isAction(VERB_LOOK, NOUN_WINDOW)) _vm->_dialogs->show(21401); else if (_action.isAction(VERB_LOOK, NOUN_EXPERIMENT_CAGE)) _vm->_dialogs->show(21402); else if (_action.isAction(VERB_LOOK, NOUN_CAPTIVE_CREATURE)) _vm->_dialogs->show(21403); else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG)) _vm->_dialogs->show(21404); else if (_action.isAction(VERB_LOOK, NOUN_TROPHY)) _vm->_dialogs->show(21405); else if (_action.isAction(VERB_LOOK, NOUN_LARGE_BOWL)) { if (_game._storyMode == STORYMODE_NAUGHTY) { _vm->_dialogs->show(21406); } else { _vm->_dialogs->show(21407); } } else if (_action.isAction(VERB_LOOK, NOUN_SPECIMEN_JARS)) _vm->_dialogs->show(21408); else if (_action.isAction(VERB_TAKE, NOUN_LARGE_BOWL) || _action.isAction(VERB_TAKE, NOUN_SPECIMEN_JARS)) _vm->_dialogs->show(21409); else if (_action.isAction(VERB_LOOK, NOUN_SHRUNKEN_HEADS)) _vm->_dialogs->show(21410); else if (_action.isAction(VERB_TAKE, NOUN_SHRUNKEN_HEADS) || _action.isAction(VERB_TAKE, NOUN_LARGE_HEADS)) _vm->_dialogs->show(21411); else if (_action.isAction(VERB_LOOK, NOUN_LARGE_HEADS)) _vm->_dialogs->show(21428); else if (_action.isAction(VERB_LOOK, NOUN_POISON_DARTS) && (_action._savedFields._mainObjectSource == 4)) _vm->_dialogs->show(21412); else if (_action.isAction(VERB_OPEN, NOUN_EXPERIMENT_CAGE)) _vm->_dialogs->show(21414); else if (_action.isAction(VERB_TALKTO, NOUN_CAPTIVE_CREATURE)) _vm->_dialogs->show(21415); else if (_action.isAction(VERB_GIVE, NOUN_TWINKIFRUIT, NOUN_CAPTIVE_CREATURE)) _vm->_dialogs->show(21416); else if (_action.isAction(VERB_SHOOT, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE) || _action.isAction(VERB_HOSE_DOWN, NOUN_BLOWGUN, NOUN_CAPTIVE_CREATURE)) _vm->_dialogs->show(21417); else if (_action.isAction(VERB_LOOK, NOUN_BIG_HEADS)) _vm->_dialogs->show(21418); else if (_action.isAction(VERB_TAKE, NOUN_BIG_HEADS)) _vm->_dialogs->show(21419); else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG)) _vm->_dialogs->show(21420); else if (_action.isAction(VERB_LOOK, NOUN_FLOOR_OF_HUT)) _vm->_dialogs->show(21421); else if (_action.isAction(VERB_LOOK, NOUN_BLOWGUN)) _vm->_dialogs->show(21422); else if (_action.isAction(VERB_LOOK, NOUN_TABLE)) { if (_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) { _vm->_dialogs->show(21423); } else if (_game._objects.isInRoom(OBJ_POISON_DARTS) && !_game._objects.isInRoom(OBJ_BLOWGUN)) { _vm->_dialogs->show(21424); } else if (!_game._objects.isInRoom(OBJ_POISON_DARTS) && _game._objects.isInRoom(OBJ_BLOWGUN)) { _vm->_dialogs->show(21425); } else { _vm->_dialogs->show(21426); } } else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene215::setup() { setPlayerSpritesPrefix(); setAAName(); } void Scene215::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('e', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('a', 0)); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle (_globals._spriteIndexes[1], false, 7, 0, 0, 0); _scene->_sequences.setPosition(_globals._sequenceIndexes[1], Common::Point(235, 83)); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 15); if (_globals[kSexOfRex] == REX_MALE) _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9"); else _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*ROXRC_9"); if (_scene->_priorSceneId == 216) { _game._player._playerPos = Common::Point(140, 119); _game._player._facing = FACING_SOUTHWEST; _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1); _scene->_sequences.addTimer(120, 70); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(204, 152); _game._player._facing = FACING_NORTH; } _game.loadQuoteSet(0xA9, 0xAA, 0); sceneEntrySound(); } void Scene215::step() { if (_game._trigger == 70) { _scene->_sequences.remove (_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1, 0, 0); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); } if (_game._trigger == 71) { _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]); _game._player._visible = true; _game._player._stepEnabled = true; } } void Scene215::actions() { if (_action._lookFlag) _vm->_dialogs->show(21509); else if (_action.isAction(VERB_TAKE, NOUN_TWINKIFRUIT)) { if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT) || _game._trigger) { switch (_game._trigger) { case 0: if (_globals[kSexOfRex] == REX_MALE) { _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 6, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 4); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_LOOP, 0, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); } else { _game._objects.addToInventory(OBJ_TWINKIFRUIT); _vm->_dialogs->showItem(OBJ_TWINKIFRUIT, 0x5404); } break; case 1: if (!_game._objects.isInInventory(OBJ_TWINKIFRUIT)) { _game._objects.addToInventory(OBJ_TWINKIFRUIT); _vm->_dialogs->showItem(OBJ_TWINKIFRUIT, 0x5404); } break; case 2: _game._player._visible = true; _game._player._stepEnabled = true; _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]); break; } } else { int idx = _vm->getRandomNumber(169, 170); _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(idx)); } } else if (_action.isAction(VERB_WALK_OUTSIDE, NOUN_HUT)) _scene->_nextSceneId = 210; else if (_action.isAction(VERB_LOOK, NOUN_BEAR_RUG)) _vm->_dialogs->show(21501); else if (_action.isAction(VERB_LOOK, NOUN_BED)) _vm->_dialogs->show(21502); else if (_action.isAction(VERB_LOOK, NOUN_WELCOME_MAT)) _vm->_dialogs->show(21503); else if (_action.isAction(VERB_LOOK, NOUN_LOVE_ALTAR)) _vm->_dialogs->show(21504); else if (_action.isAction(VERB_LOOK, NOUN_WINDOW)) _vm->_dialogs->show(21505); else if (_action.isAction(VERB_LOOK, NOUN_PICTURE)) _vm->_dialogs->show(21506); else if (_action.isAction(VERB_LOOK, NOUN_TWINKIFRUIT) && (_action._savedFields._mainObjectSource == 4)) _vm->_dialogs->show(21507); else if (_action.isAction(VERB_TAKE, NOUN_BEAR_RUG)) _vm->_dialogs->show(21510); else if (_action.isAction(VERB_TAKE, NOUN_LOVE_ALTAR)) _vm->_dialogs->show(21511); else if (_action.isAction(VERB_LOOK, NOUN_BAG_OF_TWINKIFRUITS)) _vm->_dialogs->show(21512); else if (_action.isAction(VERB_TAKE, NOUN_BAG_OF_TWINKIFRUITS)) _vm->_dialogs->show(21513); else if (_action.isAction(VERB_TAKE, NOUN_WELCOME_MAT)) _vm->_dialogs->show(21514); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene216::setup() { setPlayerSpritesPrefix(); setAAName(); } void Scene216::enter() { _game._player._stepEnabled = false; _game._player._visible = false; _scene->_userInterface.emptyConversationList(); _scene->_userInterface.setup(kInputConversation); _scene->loadAnimation(formAnimName('A', -1), 60); sceneEntrySound(); } void Scene216::step() { if (_game._trigger == 60) _scene->_nextSceneId = 215; } /*------------------------------------------------------------------------*/ } // End of namespace Nebular } // End of namespace MADS