/* 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_scenes6.h" namespace MADS { namespace Nebular { void Scene6xx::setAAName() { _game._aaName = Resources::formatAAName(5); } void Scene6xx::setPlayerSpritesPrefix() { _vm->_sound->command(5); Common::String oldName = _game._player._spritesPrefix; if ((_scene->_nextSceneId == 605) || (_scene->_nextSceneId == 620)) _game._player._spritesPrefix = ""; else if (_globals[kSexOfRex] == REX_MALE) _game._player._spritesPrefix = "RXM"; else _game._player._spritesPrefix = "ROX"; if (oldName != _game._player._spritesPrefix) _game._player._spritesChanged = true; _game._player._scalingVelocity = true; _vm->_palette->setEntry(16, 10, 63, 63); _vm->_palette->setEntry(17, 10, 45, 45); } void Scene6xx::sceneEntrySound() { if (!_vm->_musicFlag) { _vm->_sound->command(2); return; } switch (_scene->_nextSceneId) { case 601: case 602: case 603: case 604: case 605: case 607: case 608: case 609: case 610: case 612: case 620: _vm->_sound->command(29); break; case 611: _vm->_sound->command(24); break; default: break; } } /*------------------------------------------------------------------------*/ void Scene601::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_LASER_BEAM); _scene->addActiveVocab(VERB_LOOK_AT); } void Scene601::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_4"); if (_globals[kLaserHoleIsThere]) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2); _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_LOOK_AT, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); } _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); if (_scene->_priorSceneId == 504) { _game._player._playerPos = Common::Point(73, 148); _game._player._facing = FACING_WEST; _game._player._visible = false; _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); _scene->loadAnimation(formAnimName('R', 1), 70); } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(229, 129); _game._player._facing = FACING_SOUTHWEST; } sceneEntrySound(); } void Scene601::step() { switch (_game._trigger) { case 70: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(30, 71); break; case 71: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72); break; case 72: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); _game._player._stepEnabled = true; break; default: break; } } void Scene601::actions() { if (_action.isAction(VERB_WALK_THROUGH, NOUN_ENTRANCE)) _scene->_nextSceneId = 602; else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 3); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { int syncIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx); _scene->_sequences.addTimer(6, 2); } break; case 2: _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: { int syncIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx); _scene->_nextSceneId = 504; } break; default: break; } } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET)) { if (!_globals[kLaserHoleIsThere]) _vm->_dialogs->show(60110); else _vm->_dialogs->show(60111); } else if (_action.isAction(VERB_LOOK, NOUN_CAR)) _vm->_dialogs->show(60112); else if (_action.isAction(VERB_LOOK, NOUN_PAPERS)) _vm->_dialogs->show(60113); else if (_action.isAction(VERB_LOOK, NOUN_BUILDING)) _vm->_dialogs->show(60114); else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET)) _vm->_dialogs->show(60115); else if (_action.isAction(VERB_LOOK, NOUN_BALCONY)) _vm->_dialogs->show(60116); else if (_action.isAction(VERB_LOOK, NOUN_ENTRANCE)) _vm->_dialogs->show(60117); else if (_action.isAction(VERB_LOOK, NOUN_WALL)) _vm->_dialogs->show(60118); else if (_action.isAction(VERB_LOOK, NOUN_CITY)) _vm->_dialogs->show(60119); else if (_action.isAction(VERB_LOOK, NOUN_FOUNTAIN)) _vm->_dialogs->show(60120); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene602::Scene602(MADSEngine *vm) : Scene6xx(vm) { _lastSpriteIdx = -1; _lastSequenceIdx = -1; _cycleIndex = -1; _safeMode = -1; } void Scene602::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_lastSpriteIdx); s.syncAsSint16LE(_lastSequenceIdx); s.syncAsSint16LE(_cycleIndex); s.syncAsSint16LE(_safeMode); } void Scene602::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_SAFE); _scene->addActiveVocab(NOUN_LASER_BEAM); } void Scene602::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('h', -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('l', 0)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9"); if (!_game._visitedScenes._sceneRevisited) _globals[kSafeStatus] = 0; if (_globals[kLaserHoleIsThere]) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 9); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 9); int idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(80, 134), FACING_NORTHEAST); _scene->changeVariant(1); } else _scene->_hotspots.activate(NOUN_HOLE, false); if (_globals[kSafeStatus] == 0) { _lastSpriteIdx = _globals._spriteIndexes[2]; _cycleIndex = -1; } else if (_globals[kSafeStatus] == 1) { _lastSpriteIdx = _globals._spriteIndexes[2]; _cycleIndex = -2; } else if (_globals[kSafeStatus] == 3) { _lastSpriteIdx = _globals._spriteIndexes[3]; _cycleIndex = -2; } else { _lastSpriteIdx = _globals._spriteIndexes[3]; _cycleIndex = -1; } _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex); _scene->_sequences.setDepth(_lastSequenceIdx, 14); int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST); if (_game._objects.isInRoom(OBJ_DOOR_KEY)) { _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('k', -1)); _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 15); if (_globals[kSafeStatus] == 0 || _globals[kSafeStatus] == 2) _scene->_hotspots.activate(NOUN_DOOR_KEY, false); } else _scene->_hotspots.activate(NOUN_DOOR_KEY, false); if (_scene->_priorSceneId == 603) { _game._player._playerPos = Common::Point(228, 126); _game._player._facing = FACING_WEST; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(50, 127); _game._player._facing = FACING_EAST; } sceneEntrySound(); _game.loadQuoteSet(0x2F1, 0x2F2, 0x2F3, 0); if (_scene->_roomChanged) { _game._objects.addToInventory(OBJ_NOTE); _game._objects.addToInventory(OBJ_REARVIEW_MIRROR); _game._objects.addToInventory(OBJ_COMPACT_CASE); } } void Scene602::handleSafeActions() { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: if (_safeMode == 1 || _safeMode == 3) { if (_globals[kSafeStatus] == 0 && _safeMode == 1) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F1)); _scene->_sequences.addTimer(120, 4); } else { _scene->_sequences.remove(_lastSequenceIdx); if (_safeMode == 3) _lastSpriteIdx = _globals._spriteIndexes[2]; else _lastSpriteIdx = _globals._spriteIndexes[3]; _lastSequenceIdx = _scene->_sequences.addSpriteCycle(_lastSpriteIdx, false, 12, 1, 0, 0); _scene->_sequences.setDepth(_lastSequenceIdx, 14); if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId) _scene->_hotspots.activate(NOUN_DOOR_KEY, true); _scene->_sequences.addSubEntry(_lastSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 2); } } else { _scene->_sequences.remove(_lastSequenceIdx); if (_globals[kSafeStatus] == 1) _lastSpriteIdx = _globals._spriteIndexes[2]; else _lastSpriteIdx = _globals._spriteIndexes[3]; _lastSequenceIdx = _scene->_sequences.startPingPongCycle(_lastSpriteIdx, false, 12, 1, 0, 0); _scene->_sequences.setDepth(_lastSequenceIdx, 14); if (_game._objects[OBJ_DOOR_KEY]._roomNumber == _scene->_currentSceneId) _scene->_hotspots.activate(NOUN_DOOR_KEY, false); _scene->_sequences.addSubEntry(_lastSequenceIdx, SEQUENCE_TRIGGER_EXPIRE, 0, 2); } break; case 2: { int synxIdx = _lastSequenceIdx; _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, _cycleIndex); _scene->_sequences.setDepth(_lastSequenceIdx, 14); _scene->_sequences.updateTimeout(_lastSequenceIdx, synxIdx); int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST); if (_safeMode == 3) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F3)); _scene->_sequences.addTimer(120, 4); } else _scene->_sequences.addTimer(60, 4); break; } case 3: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]); _game._player._visible = true; break; case 4: if (_safeMode == 1) { if (_globals[kSafeStatus] == 2) _globals[kSafeStatus] = 3; } else if (_safeMode == 2) { if (_globals[kSafeStatus] == 3) _globals[kSafeStatus] = 2; else _globals[kSafeStatus] = 0; } else _globals[kSafeStatus] = 1; _game._player._stepEnabled = true; break; default: break; } } void Scene602::actions() { if (_action.isAction(VERB_WALK_THROUGH, NOUN_HALLWAY)) _scene->_nextSceneId = 601; else if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) _scene->_nextSceneId = 603; else if (_action.isAction(VERB_OPEN, NOUN_SAFE) && ((_globals[kSafeStatus] == 0) || (_globals[kSafeStatus] == 2))) { _safeMode = 1; _cycleIndex = -2; handleSafeActions(); } else if (_action.isAction(VERB_CLOSE, NOUN_SAFE) && ((_globals[kSafeStatus] == 1) || (_globals[kSafeStatus] == 3))) { _safeMode = 2; _cycleIndex = -1; handleSafeActions(); } else if (_action.isAction(VERB_UNLOCK, NOUN_COMBINATION, NOUN_SAFE)) { if ((_globals[kSafeStatus] == 0) && (_game._difficulty != DIFFICULTY_HARD)) { _safeMode = 3; _cycleIndex = -2; handleSafeActions(); } } else if ((_action.isAction(VERB_PUT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM) || _action.isAction(VERB_PUT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_COMPACT_CASE, NOUN_LASER_BEAM) || _action.isAction(VERB_REFLECT, NOUN_REARVIEW_MIRROR, NOUN_LASER_BEAM)) && (_globals[kSafeStatus] == 0)) { switch (_game._trigger) { case 0: _vm->_dialogs->show(60230); _game._player._stepEnabled = false; _game._player._visible = false; _scene->_sequences.remove(_globals._sequenceIndexes[4]); _scene->_sequences.remove(_lastSequenceIdx); _scene->loadAnimation(formAnimName('L', 1), 1); break; case 1: { _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _lastSpriteIdx = _globals._spriteIndexes[3]; _lastSequenceIdx = _scene->_sequences.startCycle(_lastSpriteIdx, false, -1); _scene->_sequences.setDepth(_lastSequenceIdx, 14); int idx = _scene->_dynamicHotspots.add(NOUN_SAFE, VERB_WALKTO, _lastSequenceIdx, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(185, 113), FACING_NORTHWEST); _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 9); idx = _scene->_dynamicHotspots.add(NOUN_LASER_BEAM, VERB_WALKTO, _globals._sequenceIndexes[4], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(80, 134), FACING_NORTHEAST); _scene->_sequences.addTimer(60, 2); } break; case 2: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F2)); _globals[kSafeStatus] = 2; _game._player._stepEnabled = true; break; default: break; } } else if (_action.isAction(VERB_TAKE, NOUN_DOOR_KEY) && (_game._trigger || _game._objects.isInRoom(OBJ_DOOR_KEY))) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _scene->_sequences.remove(_globals._sequenceIndexes[6]); _scene->_hotspots.activate(NOUN_DOOR_KEY, false); _vm->_sound->command(9); _game._objects.addToInventory(OBJ_DOOR_KEY); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]); _game._player._visible = true; _game._player._stepEnabled = true; _vm->_dialogs->showItem(OBJ_DOOR_KEY, 835); break; default: break; } } else if (_action._lookFlag) _vm->_dialogs->show(60210); else if (_action.isAction(VERB_LOOK, NOUN_FLOOR)) _vm->_dialogs->show(60211); else if (_action.isAction(VERB_LOOK, NOUN_HALLWAY)) _vm->_dialogs->show(60212); else if (_action.isAction(VERB_LOOK, NOUN_TABLE)) _vm->_dialogs->show(60213); else if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || _action.isAction(VERB_LOOK, NOUN_LOUNGE_CHAIR)) _vm->_dialogs->show(60214); else if (_action.isAction(VERB_LOOK, NOUN_NEON_LIGHTS)) _vm->_dialogs->show(60215); else if (_action.isAction(VERB_LOOK, NOUN_FIREPLACE)) _vm->_dialogs->show(60216); else if (_action.isAction(VERB_LOOK, NOUN_PICTURE)) _vm->_dialogs->show(60217); else if (_action.isAction(VERB_LOOK, NOUN_LAMP)) _vm->_dialogs->show(60218); else if (_action.isAction(VERB_LOOK, NOUN_MASKS)) _vm->_dialogs->show(60219); else if (_action.isAction(VERB_LOOK, NOUN_GLASS_BLOCK_WALL)) _vm->_dialogs->show(60220); else if (_action.isAction(VERB_LOOK, NOUN_DOORWAY)) _vm->_dialogs->show(60221); else if (_action.isAction(VERB_LOOK, NOUN_SAFE)) { if (_globals[kSafeStatus] == 0) _vm->_dialogs->show(60222); else if (_globals[kSafeStatus] == 1) { if (!_game._objects.isInRoom(OBJ_DOOR_KEY)) _vm->_dialogs->show(60223); else _vm->_dialogs->show(60224); } else if (_globals[kSafeStatus] == 2) _vm->_dialogs->show(60234); else if (_game._objects.isInRoom(OBJ_DOOR_KEY)) _vm->_dialogs->show(60235); else _vm->_dialogs->show(60236); } else if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_SAFE) || _action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_SAFE)) _vm->_dialogs->show(60225); else if (_action.isAction(VERB_PULL, NOUN_SAFE)) _vm->_dialogs->show(60226); else if (_action.isAction(VERB_PUT, NOUN_FIREPLACE) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) _vm->_dialogs->show(60227); else if (_action.isAction(VERB_LOOK, NOUN_HOLE)) _vm->_dialogs->show(60228); else if (_action.isAction(VERB_LOOK, NOUN_LASER_BEAM)) _vm->_dialogs->show(60229); else if (_action.isAction(VERB_LOOK, NOUN_FLOWER_BOX)) _vm->_dialogs->show(60231); else if (_action.isAction(VERB_THROW, NOUN_BOMB, NOUN_SAFE) || _action.isAction(VERB_THROW, NOUN_BOMBS, NOUN_SAFE)) _vm->_dialogs->show(60232); else if (_action.isAction(VERB_PUT, NOUN_TIMEBOMB)) _vm->_dialogs->show(60233); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene603::Scene603(MADSEngine *vm) : Scene6xx(vm) { _compactCaseHotspotId = -1; _noteHotspotId = -1; } void Scene603::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_compactCaseHotspotId); s.syncAsSint16LE(_noteHotspotId); } void Scene603::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_COMPACT_CASE); _scene->addActiveVocab(NOUN_NOTE); } void Scene603::enter() { if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId) { _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXMRD_3"); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1)); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); _compactCaseHotspotId = _scene->_dynamicHotspots.add(NOUN_COMPACT_CASE, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_compactCaseHotspotId, Common::Point(250, 152), FACING_SOUTHEAST); } if ((_game._difficulty != DIFFICULTY_HARD) && (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId)) { _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9"); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1)); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 14); _noteHotspotId = _scene->_dynamicHotspots.add(NOUN_NOTE, VERB_WALKTO, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_noteHotspotId, Common::Point(242, 118), FACING_NORTHEAST); } if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) _game._player._playerPos = Common::Point(113, 134); sceneEntrySound(); } void Scene603::actions() { if (_action.isAction(VERB_WALK_TOWARDS, NOUN_LIVINGROOM)) _scene->_nextSceneId = 602; else if (_action.isAction(VERB_TAKE, NOUN_COMPACT_CASE)) { if ( _game._trigger || !_game._objects.isInInventory(OBJ_COMPACT_CASE)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 5); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 5, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _vm->_sound->command(9); _scene->_sequences.remove(_globals._sequenceIndexes[1]); _scene->_dynamicHotspots.remove(_compactCaseHotspotId); _game._objects.addToInventory(OBJ_COMPACT_CASE); _vm->_dialogs->showItem(OBJ_COMPACT_CASE, 60330); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]); _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } } } else if (_action.isAction(VERB_TAKE, NOUN_NOTE)) { if ( _game._trigger || !_game._objects.isInInventory(OBJ_NOTE)) { if (_game._trigger == 0) { _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 1); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addTimer(15, 1); } else if (_game._trigger == 1) { _vm->_sound->command(9); _scene->_sequences.remove(_globals._sequenceIndexes[2]); _scene->_dynamicHotspots.remove(_noteHotspotId); _game._objects.addToInventory(OBJ_NOTE); _scene->_sequences.remove(_globals._sequenceIndexes[3]); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; _game._player._stepEnabled = true; } } else _vm->_dialogs->show(60323); } else if (_action._lookFlag) _vm->_dialogs->show(60310); else if (_action.isAction(VERB_LOOK, NOUN_BED)) _vm->_dialogs->show(60311); else if (_action.isAction(VERB_LOOK, NOUN_WIG_STAND)) _vm->_dialogs->show(60312); else if (_action.isAction(VERB_TAKE, NOUN_WIG_STAND)) _vm->_dialogs->show(60313); else if (_action.isAction(VERB_LOOK, NOUN_REVIEW)) _vm->_dialogs->show(60314); else if (_action.isAction(VERB_LOOK, NOUN_SOUVENIR_TICKETS)) _vm->_dialogs->show(60315); else if (_action.isAction(VERB_LOOK, NOUN_PHOTOGRAPH)) _vm->_dialogs->show(60316); else if (_action.isAction(VERB_LOOK, NOUN_LAMP)) _vm->_dialogs->show(60317); else if (_action.isAction(VERB_LOOK, NOUN_DIRECTORS_SLATE) || _action.isAction(VERB_LOOK, NOUN_CROP) || _action.isAction(VERB_LOOK, NOUN_MEGAPHONE)) _vm->_dialogs->show(60318); else if (_action.isAction(VERB_LOOK, NOUN_SNAPSHOT)) _vm->_dialogs->show(60319); else if (_action.isAction(VERB_TAKE, NOUN_SNAPSHOT)) _vm->_dialogs->show(60320); else if (_action.isAction(VERB_LOOK, NOUN_PERFUME)) _vm->_dialogs->show(60321); else if (_action.isAction(VERB_TAKE, NOUN_PERFUME)) _vm->_dialogs->show(60322); else if (_action.isAction(VERB_LOOK, NOUN_NOTE)) { if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(60324); } else if (_action.isAction(VERB_LOOK, NOUN_CORNER_TABLE)) { if (_game._objects[OBJ_NOTE]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(60326); else _vm->_dialogs->show(60325); } else if (_action.isAction(VERB_LOOK, NOUN_VANITY)) { if (_game._objects[OBJ_COMPACT_CASE]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(60327); else _vm->_dialogs->show(60328); } else if (_action.isAction(VERB_LOOK, NOUN_COMPACT_CASE) && (_action._mainObjectSource == 4)) _vm->_dialogs->show(60329); // For the next two checks, the second part of the check wasn't surrounded par parenthesis, which was obviously wrong else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP))) _vm->_dialogs->show(60331); else if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_BRA) || _action.isObject(NOUN_BOA) || _action.isObject(NOUN_SLIP))) _vm->_dialogs->show(60332); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene604::Scene604(MADSEngine *vm) : Scene6xx(vm) { _timebombHotspotId = -1; _bombMode = -1; _monsterFrame = -1; _monsterTimer = 0; _monsterActive = false; _animationActiveFl = false; } void Scene604::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_timebombHotspotId); s.syncAsSint16LE(_bombMode); s.syncAsSint16LE(_monsterFrame); s.syncAsUint32LE(_monsterTimer); s.syncAsByte(_monsterActive); s.syncAsByte(_animationActiveFl); } void Scene604::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_SEA_MONSTER); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_TIMEBOMB); } void Scene604::enter() { _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9"); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(Resources::formatName(620, 'b', 0, EXT_SS, "")); _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9"); if (_globals[kTimebombStatus] == 1) { _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1); _timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST); } if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_TIMEBOMB); _vm->_palette->setEntry(252, 63, 37, 26); _vm->_palette->setEntry(253, 45, 24, 17); _animationActiveFl = false; if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(72, 149); _game._player._facing = FACING_NORTHEAST; _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->loadAnimation(formAnimName('R', 1), 70); _animationActiveFl = true; } else { _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); } _monsterTimer = _scene->_frameStartTime; _monsterActive = false; sceneEntrySound(); _game.loadQuoteSet(0x2E7, 0x2E8, 0x2E9, 0x2EA, 0x2EB, 0x2EC, 0x2ED, 0x2EE, 0x2EF, 0x2F0, 0); } void Scene604::step() { switch (_game._trigger) { case 70: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(30, 71); break; case 71: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 72); break; case 72: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _game._player._stepEnabled = true; _animationActiveFl = false; break; default: break; } if (_monsterActive && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _monsterFrame) { _monsterFrame = _scene->_activeAnimation->getCurrentFrame(); int nextMonsterFrame = -1; switch (_monsterFrame) { case 50: case 137: case 174: { int randVal = _vm->getRandomNumber(1, 1000); if ((randVal <= 450) && (_game._player._special)) { if (_game._player._special == 1) nextMonsterFrame = 50; else if (_game._player._special == 2) nextMonsterFrame = 84; else nextMonsterFrame = 137; } else if (randVal <= 150) nextMonsterFrame = 50; else if (randVal <= 300) nextMonsterFrame = 84; else if (randVal <= 450) nextMonsterFrame = 137; else if (randVal < 750) nextMonsterFrame = 13; else nextMonsterFrame = 114; } break; case 84: nextMonsterFrame = 14; break; default: break; } if ((nextMonsterFrame >= 0) && (nextMonsterFrame != _monsterFrame)) { _scene->_activeAnimation->setCurrentFrame(nextMonsterFrame); _monsterFrame = nextMonsterFrame; } } } if ((!_monsterActive && !_animationActiveFl) && (_scene->_frameStartTime > (_monsterTimer + 4))) { _monsterTimer = _scene->_frameStartTime; if ((_vm->getRandomNumber(1, 1000) < 25) || !_game._visitedScenes._sceneRevisited) { _monsterActive = true; _scene->freeAnimation(); _scene->loadAnimation(formAnimName('m', -1)); } } } void Scene604::handleBombActions() { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 9, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 3); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); if (_bombMode == 1) _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 1); else _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 3, 2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, -1); _timebombHotspotId = _scene->_dynamicHotspots.add(NOUN_TIMEBOMB, VERB_WALKTO, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_timebombHotspotId, Common::Point(166, 118), FACING_NORTHEAST); _game._objects.setRoom(OBJ_TIMEBOMB, _scene->_currentSceneId); break; case 2: _scene->_sequences.remove(_globals._sequenceIndexes[6]); _scene->_dynamicHotspots.remove(_timebombHotspotId); _game._objects.addToInventory(OBJ_TIMEBOMB); break; case 3: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]); _game._player._visible = true; _game._player._stepEnabled = true; if (_bombMode == 1) { _vm->_dialogs->show(60421); _globals[kTimebombStatus] = TIMEBOMB_ACTIVATED; _globals[kTimebombTimer] = 0; } else { _vm->_dialogs->show(60423); _globals[kTimebombStatus] = TIMEBOMB_DEACTIVATED; _globals[kTimebombTimer] = 0; } break; default: break; } } void Scene604::actions() { if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { int syncIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx); _scene->_sequences.addTimer(6, 2); } break; case 2: _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: { int syncIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx); _scene->_nextSceneId = 504; } break; default: break; } } else if ((_action.isAction(VERB_PUT, NOUN_LEDGE) || _action.isAction(VERB_PUT, NOUN_VIEWPORT) || _action.isAction(VERB_THROW, NOUN_VIEWPORT)) && (_action.isObject(NOUN_BOMB) || _action.isObject(NOUN_BOMBS))) _vm->_dialogs->show(60420); else if (_action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_LEDGE) || _action.isAction(VERB_PUT, NOUN_TIMEBOMB, NOUN_VIEWPORT)) { _bombMode = 1; if ((_game._difficulty == DIFFICULTY_HARD) || _globals[kWarnedFloodCity]) handleBombActions(); else if ((_game._objects.isInInventory(OBJ_POLYCEMENT) && _game._objects.isInInventory(OBJ_CHICKEN)) && ((_globals[kLineStatus] == LINE_TIED) || ((_game._difficulty == DIFFICULTY_EASY) && (!_globals[kBoatRaised])))) handleBombActions(); else if (_game._difficulty == DIFFICULTY_EASY) _vm->_dialogs->show(60424); else { _vm->_dialogs->show(60425); _globals[kWarnedFloodCity] = true; } } else if (_action.isAction(VERB_TAKE, NOUN_TIMEBOMB)) { if (_game._trigger || !_game._objects.isInInventory(OBJ_TIMEBOMB)) { _bombMode = 2; handleBombActions(); } } else if (_action._lookFlag) _vm->_dialogs->show(60411); else if (_action.isAction(VERB_LOOK, NOUN_VIEWPORT)) { if (_monsterActive) { _vm->_dialogs->show(60413); } else { _vm->_dialogs->show(60412); } } else if (_action.isAction(VERB_LOOK, NOUN_WALL)) _vm->_dialogs->show(60414); else if (_action.isAction(VERB_LOOK, NOUN_VENT)) _vm->_dialogs->show(60415); else if (_action.isAction(VERB_LOOK, NOUN_INDICATOR)) _vm->_dialogs->show(60416); else if (_action.isAction(VERB_LOOK, NOUN_SCULPTURE)) _vm->_dialogs->show(60417); else if (_action.isAction(VERB_LOOK, NOUN_CAR)) _vm->_dialogs->show(60418); else if (_action.isAction(VERB_LOOK, NOUN_FOUNTAIN)) _vm->_dialogs->show(60419); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene605::setup() { _game._player._spritesPrefix = ""; setAAName(); } void Scene605::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('r', -1)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('b', -1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('l', -1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('p', -1)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('n', -1)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('f', -1)); _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 15, 0, 0, 0); _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 17, 0, 0, 0); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 14, 0, 0, 0); _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 13, 0, 0, 0); _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 17, 0, 0, 0); _globals._sequenceIndexes[6] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[6], false, 18, 0, 0, 0); _game._player._visible = false; _game._player._stepEnabled = false; _scene->_sequences.addTimer(600, 70); _scene->_userInterface.setup(kInputLimitedSentences); sceneEntrySound(); _vm->_sound->command(22); } void Scene605::step() { if (_game._trigger == 70) { _vm->_sound->command(23); if (_globals[kResurrectRoom] >= 700) _vm->_dialogs->show(60598); else _vm->_dialogs->show(60599); _scene->_nextSceneId = _globals[kResurrectRoom]; } } void Scene605::actions() { return; } /*------------------------------------------------------------------------*/ Scene607::Scene607(MADSEngine *vm) : Scene6xx(vm) { _dogTimer = 0; _lastFrameTime = 0; _dogLoop = false; _dogEatsRex = false; _dogBarking = false; _shopAvailable = false; _animationMode = -1; _animationActive = -1; _counter = -1; } void Scene607::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsUint32LE(_dogTimer); s.syncAsUint32LE(_lastFrameTime); s.syncAsByte(_dogLoop); s.syncAsByte(_dogEatsRex); s.syncAsByte(_dogBarking); s.syncAsByte(_shopAvailable); s.syncAsSint16LE(_animationMode); s.syncAsSint16LE(_animationActive); s.syncAsSint16LE(_counter); } void Scene607::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_OBNOXIOUS_DOG); _scene->addActiveVocab(VERB_WALKTO); } void Scene607::enter() { _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('c', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3"); if (!_game._visitedScenes._sceneRevisited && (_scene->_priorSceneId != 608)) _globals[kDogStatus] = DOG_PRESENT; if ((_scene->_priorSceneId == 608) && (_globals[kDogStatus] < DOG_GONE)) _globals[kDogStatus] = DOG_GONE; _animationActive = 0; if ((_globals[kDogStatus] == DOG_PRESENT) && (_game._difficulty != DIFFICULTY_EASY)) { _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7)); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0)); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); _dogBarking = false; _dogLoop = false; _shopAvailable = false; _dogEatsRex = false; _dogTimer = 0; } else _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); if (_scene->_priorSceneId == 608) { _game._player._playerPos = Common::Point(297, 50); _game._player._facing = FACING_SOUTHEAST; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(40, 104); _game._player._facing = FACING_SOUTHEAST; _game._player._visible = false; _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->loadAnimation(formAnimName('R', 1), 80); } else if (_globals[kDogStatus] == DOG_LEFT) { _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 3)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 7)); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', 0)); } sceneEntrySound(); if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_BONES); _vm->_palette->setEntry(252, 63, 44, 30); _vm->_palette->setEntry(253, 63, 20, 22); _game.loadQuoteSet(0x2F8, 0x2F7, 0x2F6, 0x2F9, 0x2FA, 0); } void Scene607::step() { if (_globals[kDogStatus] == DOG_LEFT) { int32 diff = _scene->_frameStartTime - _lastFrameTime; if ((diff >= 0) && (diff <= 4)) _dogTimer += diff; else _dogTimer++; _lastFrameTime = _scene->_frameStartTime; } if ((_dogTimer >= 480) && !_dogLoop && !_shopAvailable && (_globals[kDogStatus] == DOG_LEFT) && !_game._player._special) { _vm->_sound->command(14); _dogLoop = true; _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 91); _dogLoop = false; _dogTimer = 0; } if (_game._trigger == 91) { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); _dogBarking = false; _globals[kDogStatus] = DOG_PRESENT; _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, true); } if (!_dogEatsRex && (_game._difficulty != DIFFICULTY_EASY) && !_animationActive && (_globals[kDogStatus] == DOG_PRESENT) && !_dogBarking && (_vm->getRandomNumber(1, 50) == 10)) { _dogBarking = true; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 5, 8, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); _scene->_kernelMessages.reset(); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_SPRITE, 2, 100); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 70); _counter = 0; } if ((_game._trigger == 70) && !_dogEatsRex && (_globals[kDogStatus] == DOG_PRESENT) && !_animationActive) { int syncIdx = _globals._sequenceIndexes[1]; _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx); _scene->_kernelMessages.reset(); _dogBarking = false; } if (_game._trigger == 100) { _counter++; _vm->_sound->command(12); if ((_counter >= 1) && (_counter <= 4)) { Common::Point pos(0, 0); switch (_counter) { case 1: pos = Common::Point(237, 5); break; case 2: pos = Common::Point(270, 15); break; case 3: pos = Common::Point(237, 25); break; case 4: pos = Common::Point(270, 36); break; default: break; } _scene->_kernelMessages.add(pos, 0xFDFC, 0, 0, 120, _game.getQuote(0x2F9)); } } if (_game._player._moving && (_game._difficulty != DIFFICULTY_EASY) && !_shopAvailable && (_globals[kDogStatus] == DOG_PRESENT) && (_scene->_rails.getNext() > 0)) { _game._player.cancelCommand(); _game._player.startWalking(Common::Point(268, 72), FACING_NORTHEAST); _scene->_rails.resetNext(); } if ((_game._player._special > 0) && (_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == DOG_PRESENT) && _game._player._stepEnabled) _game._player._stepEnabled = false; if ((_game._difficulty != DIFFICULTY_EASY) && (_globals[kDogStatus] == DOG_PRESENT) && (_game._player._playerPos == Common::Point(268, 72)) && (_game._trigger || !_dogEatsRex)) { _dogEatsRex = true; switch (_game._trigger) { case 91: case 0: _animationActive = 1; _game._player._visible = false; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], -1, 7); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FA)); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 60); _scene->_sequences.addTimer(10, 64); break; case 60: { int syncIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 5, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 8, 45); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 61); } break; case 61: { int syncIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 15, 3, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 46, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 62); } break; case 62: { int syncIdx = _globals._sequenceIndexes[4]; _animationActive = 2; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx); _scene->_sequences.addTimer(60, 63); } break; case 63: _vm->_dialogs->show(60729); _animationActive = 0; _dogEatsRex = false; _scene->_reloadSceneFlag = true; _game._player._stepEnabled = true; break; case 64: if (_dogEatsRex && (_animationActive == 1)) { _vm->_sound->command(12); _scene->_sequences.addTimer(10, 64); } break; default: break; } } switch (_game._trigger) { case 80: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 81); break; case 81: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 82); break; case 82: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _game._player._stepEnabled = true; break; default: break; } } void Scene607::handleThrowingBone() { _animationActive = -1; switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _game._player._visible = false; _scene->loadAnimation(formAnimName('D', _animationMode), 1); break; case 1: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; if (_animationMode != 1) _scene->_hotspots.activate(NOUN_OBNOXIOUS_DOG, false); else { _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); } _dogBarking = false; if (_game._objects.isInInventory(OBJ_BONE)) { _game._objects.setRoom(OBJ_BONE, 1); if (_animationMode == 1) _globals[kBone202Status] = 0; } else { _game._objects.setRoom(OBJ_BONES, 1); _game._objects.addToInventory(OBJ_BONE); } _scene->_sequences.addTimer(60, 2); break; case 2: { int quoteId = 0x2F8; if (_animationMode == 1) quoteId = 0x2F7; if (_animationMode == 2) { _globals[kDogStatus] = DOG_LEFT; _dogTimer = 0; } _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(quoteId)); _scene->_sequences.addTimer(60, 3); } break; case 3: _game._player._stepEnabled = true; _animationActive = 0; break; default: break; } } void Scene607::preActions() { if (_action.isAction(VERB_TALKTO, NOUN_OBNOXIOUS_DOG)) _game._player._needToWalk = false; if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE) && (_globals[kDogStatus] == DOG_LEFT) && (_game._difficulty != DIFFICULTY_EASY)) { _shopAvailable = true; _dogTimer = 0; } if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) _game._player.walk(Common::Point(193, 100), FACING_NORTHEAST); if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_FENCE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FENCE)) _game._player.walk(Common::Point(201, 107), FACING_SOUTHEAST); } void Scene607::actions() { if (_action.isAction(VERB_WALK_THROUGH, NOUN_SIDE_ENTRANCE)) _scene->_nextSceneId = 608; else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { int syncIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx); _scene->_sequences.addTimer(6, 2); } break; case 2: _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 10, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: { int syncIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, -2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx); _scene->_nextSceneId = 504; } break; default: break; } } else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) { if (_game._difficulty != DIFFICULTY_EASY) { _animationMode = 1; _scene->_kernelMessages.reset(); if (_game._trigger == 0) _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6)); handleThrowingBone(); } } else if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_FENCE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FENCE)) && (_game._difficulty != DIFFICULTY_EASY) && ((_globals[kDogStatus] == DOG_PRESENT) || _game._trigger)) { _animationMode = 2; if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F6)); } handleThrowingBone(); } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_STREET)) { if ((_globals[kDogStatus] == DOG_PRESENT) || (_game._difficulty == DIFFICULTY_EASY)) _vm->_dialogs->show(60710); else _vm->_dialogs->show(60711); } else if (_action.isAction(VERB_LOOK, NOUN_WALL)) _vm->_dialogs->show(60712); else if (_action.isAction(VERB_LOOK, NOUN_FENCE)) _vm->_dialogs->show(60713); else if (_action.isAction(VERB_LOOK, NOUN_CAR)) _vm->_dialogs->show(60714); else if (_action.isAction(VERB_LOOK, NOUN_MANHOLE)) _vm->_dialogs->show(60715); else if (_action.isAction(VERB_LOOK, NOUN_FIRE_HYDRANT) && (_globals[kDogStatus] == DOG_PRESENT)) _vm->_dialogs->show(60716); else if (_action.isAction(VERB_LOOK, NOUN_SIGN)) _vm->_dialogs->show(60717); else if (_action.isAction(VERB_LOOK, NOUN_BROKEN_WINDOW)) _vm->_dialogs->show(60718); else if (_action.isAction(VERB_LOOK, NOUN_GARAGE_DOOR)) _vm->_dialogs->show(60719); else if (_action.isAction(VERB_LOOK, NOUN_SIDEWALK)) _vm->_dialogs->show(60720); else if (_action.isAction(VERB_LOOK, NOUN_AIR_HOSE)) _vm->_dialogs->show(60721); else if (_action.isAction(VERB_LOOK, NOUN_AUTO_SHOP)) { if (_globals[kDogStatus] == DOG_PRESENT) _vm->_dialogs->show(60723); else _vm->_dialogs->show(60722); } else if (_action.isAction(VERB_LOOK, NOUN_SIDE_ENTRANCE)) { if (_globals[kDogStatus] == DOG_PRESENT) _vm->_dialogs->show(60725); else _vm->_dialogs->show(60724); } else if (_action.isAction(VERB_LOOK, NOUN_OBNOXIOUS_DOG)) _vm->_dialogs->show(60726); else if (_action.isAction(VERB_TALKTO, NOUN_OBNOXIOUS_DOG)) _vm->_dialogs->show(60727); else if (_action.isAction(VERB_LOOK, NOUN_BARRICADE)) _vm->_dialogs->show(60728); else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET)) _vm->_dialogs->show(60730); else if (_action.isObject(NOUN_GARAGE_DOOR) && (_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL))) _vm->_dialogs->show(60731); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene608::Scene608(MADSEngine *vm) : Scene6xx(vm) { _carMode = -1; _carFrame = -1; _carMoveMode = -1; _dogDeathMode = -1; _carHotspotId = -1; _barkCount = -1; _polycementHotspotId = -1; _animationMode = -1; _nextTrigger = -1; _throwMode = -1; _resetPositionsFl = false; _dogActiveFl = false; _dogBarkingFl = false; _dogFirstEncounter = false; _rexBeingEaten = false; _dogHitWindow = false; _checkFl = false; _dogSquashFl = false; _dogSafeFl = false; _buttonPressedonTimeFl = false; _dogUnderCar = false; _dogYelping = false; _dogWindowTimer = -1; _dogRunTimer = -1; _dogTimer1 = 0; _dogTimer2 = 0; } void Scene608::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_carMode); s.syncAsSint16LE(_carFrame); s.syncAsSint16LE(_carMoveMode); s.syncAsSint16LE(_dogDeathMode); s.syncAsSint16LE(_carHotspotId); s.syncAsSint16LE(_barkCount); s.syncAsSint16LE(_polycementHotspotId); s.syncAsSint16LE(_animationMode); s.syncAsSint16LE(_nextTrigger); s.syncAsSint16LE(_throwMode); s.syncAsByte(_resetPositionsFl); s.syncAsByte(_dogActiveFl); s.syncAsByte(_dogBarkingFl); s.syncAsByte(_dogFirstEncounter); s.syncAsByte(_rexBeingEaten); s.syncAsByte(_dogHitWindow); s.syncAsByte(_checkFl); s.syncAsByte(_dogSquashFl); s.syncAsByte(_dogSafeFl); s.syncAsByte(_buttonPressedonTimeFl); s.syncAsByte(_dogUnderCar); s.syncAsByte(_dogYelping); s.syncAsSint32LE(_dogWindowTimer); s.syncAsSint32LE(_dogRunTimer); s.syncAsUint32LE(_dogTimer1); s.syncAsUint32LE(_dogTimer2); } void Scene608::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(VERB_WALKTO); _scene->addActiveVocab(NOUN_POLYCEMENT); _scene->addActiveVocab(NOUN_CAR); _scene->addActiveVocab(NOUN_OBNOXIOUS_DOG); } void Scene608::resetDogVariables() { _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1); int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); _dogBarkingFl = false; _dogFirstEncounter = false; } void Scene608::restoreAnimations() { _scene->freeAnimation(); _carMode = 0; _game._player._stepEnabled = true; if (_throwMode == 6) _dogSquashFl = true; if (_globals[kCarStatus] == CAR_UP) { _scene->_sequences.remove(_globals._sequenceIndexes[6]); _scene->_sequences.remove(_globals._sequenceIndexes[7]); _scene->loadAnimation(formAnimName('A', -1)); } else { _scene->_sequences.remove(_globals._sequenceIndexes[8]); _scene->_sequences.remove(_globals._sequenceIndexes[6]); _scene->_sequences.remove(_globals._sequenceIndexes[7]); _scene->loadAnimation(formAnimName('A', -1)); _scene->_activeAnimation->setCurrentFrame(6); } } void Scene608::setCarAnimations() { _scene->freeAnimation(); if (_globals[kCarStatus] == CAR_UP) { _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(143, 98)); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[7], Common::Point(141, 67)); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15); } else { _globals._sequenceIndexes[6] = _scene->_sequences.startCycle(_globals._spriteIndexes[6], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[6], Common::Point(143, 128)); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); _globals._sequenceIndexes[7] = _scene->_sequences.startCycle(_globals._spriteIndexes[7], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[7], Common::Point(141, 97)); _scene->_sequences.setDepth(_globals._sequenceIndexes[7], 15); _globals._sequenceIndexes[8] = _scene->_sequences.startCycle(_globals._spriteIndexes[8], false, 1); _scene->_sequences.setPosition(_globals._sequenceIndexes[8], Common::Point(144, 126)); _scene->_sequences.setDepth(_globals._sequenceIndexes[8], 5); } } void Scene608::handleThrowingBone() { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; setCarAnimations(); _scene->_sequences.remove(_globals._sequenceIndexes[5]); _animationMode = -1; _game._player._visible = false; _carMode = _throwMode; if (_throwMode == 4) _scene->loadAnimation(formAnimName('X', 2), 1); else if (_throwMode == 5) _scene->loadAnimation(formAnimName('X', 1), 1); else _scene->loadAnimation(formAnimName('X', 3), 1); break; case 1: _nextTrigger = 1; _scene->_sequences.addTimer(1, 2); break; case 2: if (_nextTrigger != 2) _scene->_sequences.addTimer(1, 2); else { if (_game._objects.isInInventory(OBJ_BONE)) _game._objects.setRoom(OBJ_BONE, 1); else { _game._objects.setRoom(OBJ_BONES, 1); _game._objects.addToInventory(OBJ_BONE); } _scene->_sequences.addTimer(60, 3); } break; case 3: if (_throwMode != 6) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x304)); _scene->_sequences.addTimer(120, 4); } else restoreAnimations(); break; case 4: restoreAnimations(); break; default: break; } } void Scene608::enter() { _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRD_7"); _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXMRC_9"); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('c', 2)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('c', 0)); _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('c', 1)); if (_game._objects.isInRoom(OBJ_POLYCEMENT)) { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('g', -1)); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, 1); int idx = _scene->_dynamicHotspots.add(NOUN_POLYCEMENT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _polycementHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(249, 129), FACING_NORTHEAST); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 6); } if (_game._objects.isInRoom(OBJ_REARVIEW_MIRROR)) { _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('m', -1)); _globals._sequenceIndexes[12] = _scene->_sequences.startCycle(_globals._spriteIndexes[12], false, 1); int idx = _scene->_dynamicHotspots.add(NOUN_REARVIEW_MIRROR, VERB_WALKTO, _globals._sequenceIndexes[12], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(71, 113), FACING_NORTHEAST); _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 15); } if (_game._difficulty == DIFFICULTY_HARD) { _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('g', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('g', 1)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('g', 2)); _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('h', 2)); _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('h', 3)); _rexBeingEaten = false; if (!_game._visitedScenes._sceneRevisited) { _globals[kDogStatus] = DOG_GONE; _dogActiveFl = true; } else _dogActiveFl = (_globals[kDogStatus] != DOG_DEAD); } else { _globals[kDogStatus] = DOG_DEAD; _dogActiveFl = false; } _dogSquashFl = false; _buttonPressedonTimeFl = false; _dogWindowTimer = 0; _dogRunTimer = 0; _dogHitWindow = false; _checkFl = false; _dogUnderCar = false; _dogYelping = false; if (!_game._visitedScenes._sceneRevisited) _globals[kCarStatus] = CAR_UP; _animationMode = 0; _carMoveMode = 0; _carFrame = -1; if (_globals[kCarStatus] == CAR_UP) { _carMode = 0; _dogDeathMode = 0; _resetPositionsFl = false; int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('A', -1)); } else if (_globals[kCarStatus] == CAR_DOWN) { _carMode = 0; _dogDeathMode = 0; _resetPositionsFl = false; int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('A', -1)); _scene->_activeAnimation->setCurrentFrame(6); } else if (_globals[kCarStatus] == CAR_SQUASHES_DOG) { _carMode = 2; _dogDeathMode = 0; _resetPositionsFl = false; int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('C', -1)); } else if (_globals[kCarStatus] == CAR_SQUASHES_DOG_AGAIN) { _carMode = 1; _dogDeathMode = 2; _resetPositionsFl = true; int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('B', -1)); } else { _carMode = 3; _dogDeathMode = 2; _resetPositionsFl = true; int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _scene->loadAnimation(formAnimName('D', -1)); } _vm->_palette->setEntry(252, 63, 44, 30); _vm->_palette->setEntry(253, 63, 20, 22); if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(46, 132); _game._player._facing = FACING_EAST; if (_game._difficulty == DIFFICULTY_HARD) { if (!_game._visitedScenes._sceneRevisited) _dogFirstEncounter = true; else if (_dogActiveFl) resetDogVariables(); } } else if ((_game._difficulty == DIFFICULTY_HARD) && !_dogFirstEncounter && _dogActiveFl) { if (!_dogUnderCar) resetDogVariables(); else { _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); } } sceneEntrySound(); if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_BONES); _game.loadQuoteSet(0x2FB, 0x2FC, 0x2FE, 0x2FD, 0x2FF, 0x300, 0x301, 0x302, 0x303, 0x304, 0); } void Scene608::step() { if (_dogFirstEncounter) { long diff = _scene->_frameStartTime - _dogTimer1; if ((diff >= 0) && (diff <= 1)) _dogWindowTimer += diff; else _dogWindowTimer++; _dogTimer1 = _scene->_frameStartTime; } if (_dogActiveFl && (_dogWindowTimer >= 2) && !_dogHitWindow) { _dogHitWindow = true; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 11, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 1); _vm->_sound->command(14); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 70); _dogWindowTimer = 0; } if (_game._trigger == 70) resetDogVariables(); if ((_game._difficulty == DIFFICULTY_HARD) && !_animationMode && _dogActiveFl && !_dogFirstEncounter && !_dogUnderCar) { if (!_dogBarkingFl) { if (_vm->getRandomNumber(1, 50) == 10) { _dogBarkingFl = true; _scene->_sequences.remove(_globals._sequenceIndexes[5]); _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], false, 5, 8, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); int idx = _scene->_dynamicHotspots.add(NOUN_OBNOXIOUS_DOG, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(194, 142), FACING_EAST); _barkCount = 0; _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_SPRITE, 2, 100); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 60); } } else if (_game._trigger == 60) { int syncIdx = _globals._sequenceIndexes[5]; _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[5], syncIdx); _scene->_kernelMessages.reset(); _dogBarkingFl = false; } } if ((_game._trigger == 100) && _dogBarkingFl) { _vm->_sound->command(12); _barkCount++; if ((_barkCount >= 1) && (_barkCount <= 4)) { Common::Point _barkPos(0, 0); switch (_barkCount) { case 1: _barkPos = Common::Point(197, 66); break; case 2: _barkPos = Common::Point(230, 76); break; case 3: _barkPos = Common::Point(197, 86); break; case 4: _barkPos = Common::Point(230, 97); break; default: break; } _scene->_kernelMessages.add(_barkPos, 0xFDFC, 0, 0, 120, _game.getQuote(0x2FB)); } } if (_dogSquashFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) { long diff = _scene->_frameStartTime - _dogTimer2; if ((diff >= 0) && (diff <= 4)) _dogRunTimer += diff; else _dogRunTimer++; _dogTimer2 = _scene->_frameStartTime; } if (_dogRunTimer >= 480 && !_checkFl && !_buttonPressedonTimeFl && !_dogFirstEncounter && _dogUnderCar && _dogActiveFl) { _checkFl = true; _dogSquashFl = false; _dogSafeFl = true; _checkFl = false; _dogRunTimer = 0; } else { _dogSafeFl = false; if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0) && _dogUnderCar) _dogSafeFl = true; } if (_dogActiveFl && _dogSafeFl && !_buttonPressedonTimeFl) { _dogDeathMode = 0; _globals[kCarStatus] = CAR_UP; _carMode = 0; _scene->_sequences.remove(_globals._sequenceIndexes[10]); _dogUnderCar = false; _dogYelping = false; _scene->_kernelMessages.reset(); _globals._sequenceIndexes[11] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[11], false, 6, 1, 0, 0); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 92); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FF)); } if (_game._trigger == 92) { resetDogVariables(); _animationMode = 0; } if ((_carMode == 4) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); if (_carFrame == 10) { _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 56) { resetDogVariables(); _animationMode = 0; _nextTrigger = 2; } } } if ((_carMode == 5) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); if (_carFrame == 10) { _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 52) { resetDogVariables(); _animationMode = 0; _nextTrigger = 2; } } } if ((_carMode == 6) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); if (_carFrame == 11) { _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; } else if (_carFrame == 41) { _globals._sequenceIndexes[10] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[10], false, 9, 0, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 10, 11); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _dogUnderCar = true; _nextTrigger = 2; } } } if (_dogUnderCar) { if (!_dogYelping) { if (_vm->getRandomNumber(1, 50) == 10) { _dogYelping = true; _barkCount = 0; _scene->_sequences.addTimer(12, 110); _scene->_sequences.addTimer(22, 111); _scene->_sequences.addTimer(120, 112); } _scene->_kernelMessages.reset(); } } else _dogYelping = false; if (_game._trigger == 110) { _vm->_sound->command(12); _scene->_kernelMessages.add(Common::Point(150, 97), 0xFDFC, 0, 0, 60, _game.getQuote(0x303)); } if (_game._trigger == 111) { _vm->_sound->command(12); _scene->_kernelMessages.add(Common::Point(183, 93), 0xFDFC, 0, 0, 60, _game.getQuote(0x303)); } if (_game._trigger == 112) _dogYelping = false; if ((_carMode == 0) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); int nextFrame = -1; if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_DOWN)) { switch (_carMoveMode) { case 0: if (_globals[kCarStatus] == CAR_UP) nextFrame = 0; else nextFrame = 6; break; case 1: if (_scene->_activeAnimation->getCurrentFrame() >= 12) { nextFrame = 0; _carMoveMode = 0; _globals[kCarStatus] = CAR_UP; } break; case 2: if (_scene->_activeAnimation->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; _globals[kCarStatus] = CAR_DOWN; } break; default: break; } } if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { _scene->_activeAnimation->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } if ((_carMode == 2) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); int nextFrame = -1; if (_carMoveMode == 0) nextFrame = 28; else if (_scene->_activeAnimation->getCurrentFrame() >= 28) { nextFrame = 28; _carMoveMode = 0; } if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { _scene->_activeAnimation->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } if ((_carMode == 3) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); int nextFrame = -1; if (_resetPositionsFl) { nextFrame = 0; _carMoveMode = 0; } else if (_carMoveMode == 0) nextFrame = 6; else if (_scene->_activeAnimation->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; } if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { _scene->_activeAnimation->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } if ((_carMode == 1) && (_scene->_activeAnimation != nullptr)) { if (_scene->_activeAnimation->getCurrentFrame() != _carFrame) { _carFrame = _scene->_activeAnimation->getCurrentFrame(); int nextFrame = -1; if (_resetPositionsFl) { nextFrame = 0; _carMoveMode = 0; } else if (_carMoveMode == 0) nextFrame = 6; else if (_scene->_activeAnimation->getCurrentFrame() >= 6) { nextFrame = 6; _carMoveMode = 0; } if ((nextFrame >= 0) && (nextFrame != _scene->_activeAnimation->getCurrentFrame())) { _scene->_activeAnimation->setCurrentFrame(nextFrame); _carFrame = nextFrame; } } } if (_game._player._moving && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_scene->_rails.getNext() > 0)) { _game._player.cancelCommand(); _game._player.startWalking(Common::Point(194, 142), FACING_EAST); _scene->_rails.resetNext(); if (_dogUnderCar) _dogSafeFl = true; } if (_game._player._special > 0 && (_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && _game._player._stepEnabled) _game._player._stepEnabled = false; if ((_game._difficulty == DIFFICULTY_HARD) && _dogActiveFl && (_game._player._playerPos == Common::Point(194, 142)) && (_game._trigger || !_rexBeingEaten)) { _rexBeingEaten = true; switch (_game._trigger) { case 0: _scene->_sequences.remove(_globals._sequenceIndexes[5]); _animationMode = 1; _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 2); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 80); _scene->_sequences.addTimer(10, 85); break; case 80: _game._player._visible = false; _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 3, 5); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], -1); _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FC)); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 81); break; case 81: { int syncIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 5, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 6, 38); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 82); } break; case 82: { int syncIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[9], false, 15, 5, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 39, 40); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 83); } break; case 83: { _animationMode = 2; int syncIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.startCycle(_globals._spriteIndexes[9], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[9], syncIdx); _scene->_sequences.addTimer(60, 84); } break; case 84: _rexBeingEaten = false; _animationMode = 0; _scene->_reloadSceneFlag = true; _game._player._stepEnabled = true; break; case 85: if (_rexBeingEaten && (_animationMode == 1)) { _vm->_sound->command(12); _scene->_sequences.addTimer(10, 85); } break; default: break; } } } void Scene608::preActions() { _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; if ((_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) && _dogActiveFl) { _game._player._stepEnabled = false; _game._player.walk(Common::Point(56, 146), FACING_EAST); } if ((_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) && _dogActiveFl) { _game._player._stepEnabled = false; _game._player.walk(Common::Point(75, 136), FACING_EAST); } if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON) && _dogUnderCar) { _buttonPressedonTimeFl = true; _dogDeathMode = 1; } else _buttonPressedonTimeFl = false; } void Scene608::actions() { if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)) _scene->_nextSceneId = 607; else if (_action.isAction(VERB_PUSH, NOUN_DOWN_BUTTON)) { _game._player._stepEnabled = true; switch (_game._trigger) { case 0: if ((_globals[kCarStatus] == CAR_UP) || (_globals[kCarStatus] == CAR_SQUASHES_DOG) || (_globals[kCarStatus] == CAR_SQUASHES_DOG_AGAIN)) { _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], true, 6, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); } else _vm->_dialogs->show(60839); break; case 1: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]); _game._player._visible = true; if (_dogDeathMode == 0) _carMode = 0; else if (_dogDeathMode == 1) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x300)); _globals[kCarStatus] = CAR_SQUASHES_DOG; _carMode = 2; _globals[kDogStatus] = DOG_DEAD; _dogActiveFl = false; _dogUnderCar = false; _scene->_sequences.remove(_globals._sequenceIndexes[10]); _scene->freeAnimation(); _scene->loadAnimation(formAnimName('C', -1)); } else { _resetPositionsFl = false; _carMode = 1; _scene->freeAnimation(); _scene->loadAnimation(formAnimName('B', -1)); } _carMoveMode = 2; _scene->_sequences.addTimer(1, 2); break; case 2: if (_carMoveMode != 0) _scene->_sequences.addTimer(1, 2); else { _scene->_dynamicHotspots.remove(_carHotspotId); int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(100, 100, 100 + 82, 100 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); if (_globals[kCarStatus] == CAR_SQUASHES_DOG) _scene->_sequences.addTimer(120, 3); else { if (_dogDeathMode == 0) _globals[kCarStatus] = CAR_DOWN; else { _globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG; _carMode = 3; _dogDeathMode = 2; } _game._player._stepEnabled = true; } } break; case 3: _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x302)); _globals[kCarStatus] = CAR_DOWN_ON_SQUASHED_DOG; _carMode = 3; _dogDeathMode = 2; _game._player._stepEnabled = true; break; default: break; } } else if (_action.isAction(VERB_PUSH, NOUN_UP_BUTTON)) { switch (_game._trigger) { case 0: if ((_globals[kCarStatus] == CAR_DOWN) || (_globals[kCarStatus] == CAR_DOWN_ON_SQUASHED_DOG)) { _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], true, 6, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 3); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 1); } else _vm->_dialogs->show(60840); break; case 1: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[3]); _game._player._visible = true; if (_dogDeathMode == 0) _carMode = 0; else { _carMode = 3; _resetPositionsFl = false; _scene->freeAnimation(); _scene->loadAnimation(formAnimName('D', -1)); } _carMoveMode = 1; _scene->_sequences.addTimer(1, 2); break; case 2: { if (_carMoveMode != 0) _scene->_sequences.addTimer(1, 2); else if (_dogDeathMode == 0) _globals[kCarStatus] = CAR_UP; else if (_dogDeathMode == 2) { _globals[kCarStatus] = CAR_SQUASHES_DOG_AGAIN; _carMode = 3; _dogDeathMode = 2; } _scene->_dynamicHotspots.remove(_carHotspotId); int idx = _scene->_dynamicHotspots.add(NOUN_CAR, VERB_WALKTO, -1, Common::Rect(99, 69, 99 + 82, 69 + 25)); _carHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(96, 132), FACING_NORTHEAST); _game._player._stepEnabled = true; } break; default: break; } } else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_REAR_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_OBNOXIOUS_DOG) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_OBNOXIOUS_DOG)) { _game._player._stepEnabled = true; if (_dogActiveFl) { if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FE)); } _throwMode = 4; handleThrowingBone(); } else _vm->_dialogs->show(60841); } else if (_action.isAction(VERB_THROW, NOUN_BONE, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_FRONT_OF_GARAGE)) { _game._player._stepEnabled = true; if (_dogActiveFl) { if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2FD)); } _throwMode = 5; handleThrowingBone(); } else _vm->_dialogs->show(60841); } else if (_action.isAction(VERB_THROW, NOUN_BONES, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_AREA_BEHIND_CAR) || _action.isAction(VERB_THROW, NOUN_BONES, NOUN_DANGER_ZONE) || _action.isAction(VERB_THROW, NOUN_BONE, NOUN_DANGER_ZONE)) { _game._player._stepEnabled = true; if ((_globals[kCarStatus] == CAR_UP) && _dogActiveFl) { if (_dogActiveFl) { if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x301)); } _throwMode = 6; handleThrowingBone(); } else _vm->_dialogs->show(60841); } else _vm->_dialogs->show(60842); } else if (_action.isAction(VERB_TAKE, NOUN_POLYCEMENT) && (_game._trigger || !_game._objects.isInInventory(OBJ_POLYCEMENT))) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 6, 2, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 4, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _vm->_sound->command(9); _scene->_sequences.remove(_globals._sequenceIndexes[1]); _scene->_dynamicHotspots.remove(_polycementHotspotId); break; case 2: _game._objects.addToInventory(OBJ_POLYCEMENT); _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]); _game._player._visible = true; _game._player._stepEnabled = true; _vm->_dialogs->showItem(OBJ_POLYCEMENT, 60833); break; default: break; } } else if (_action.isAction(VERB_TAKE, NOUN_REARVIEW_MIRROR) && (_game._trigger || !_game._objects.isInInventory(OBJ_REARVIEW_MIRROR))) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 6, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _vm->_sound->command(9); _scene->_sequences.remove(_globals._sequenceIndexes[12]); _game._objects.addToInventory(OBJ_REARVIEW_MIRROR); _vm->_dialogs->showItem(OBJ_REARVIEW_MIRROR, 60827); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]); _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } } else if (_action._lookFlag) { if (_game._difficulty != DIFFICULTY_HARD) _vm->_dialogs->show(60810); else if (_globals[kDogStatus] == DOG_DEAD) _vm->_dialogs->show(60812); else _vm->_dialogs->show(60811); } else if (_action.isAction(VERB_LOOK) && (_action.isObject(NOUN_MUFFLER) || _action.isObject(NOUN_CAR_SEAT) || _action.isObject(NOUN_HUBCAP) || _action.isObject(NOUN_COILS) || _action.isObject(NOUN_QUARTER_PANEL))) _vm->_dialogs->show(60813); else if (_action.isAction(VERB_TAKE) && (_action.isObject(NOUN_MUFFLER) || _action.isObject(NOUN_CAR_SEAT) || _action.isObject(NOUN_HUBCAP) || _action.isObject(NOUN_COILS) || _action.isObject(NOUN_QUARTER_PANEL))) _vm->_dialogs->show(60814); else if (_action.isAction(VERB_LOOK, NOUN_GARAGE_FLOOR) || _action.isAction(VERB_LOOK, NOUN_FRONT_OF_GARAGE) || _action.isAction(VERB_LOOK, NOUN_REAR_OF_GARAGE)) { if (_dogActiveFl) _vm->_dialogs->show(60815); else _vm->_dialogs->show(60816); } else if (_action.isAction(VERB_LOOK, NOUN_SPARE_RIBS)) _vm->_dialogs->show(60817); else if (_action.isAction(VERB_TAKE, NOUN_SPARE_RIBS)) { if (_game._difficulty == DIFFICULTY_HARD) _vm->_dialogs->show(60818); else _vm->_dialogs->show(60819); } else if (_action.isAction(VERB_LOOK, NOUN_UP_BUTTON)) _vm->_dialogs->show(60820); else if (_action.isAction(VERB_LOOK, NOUN_DOWN_BUTTON)) _vm->_dialogs->show(60821); else if (_action.isAction(VERB_LOOK, NOUN_TRASH_CAN)) _vm->_dialogs->show(60822); else if (_action.isAction(VERB_LOOK, NOUN_CALENDAR)) _vm->_dialogs->show(60823); else if (_action.isAction(VERB_LOOK, NOUN_STORAGE_BOX)) { if (_game._objects[OBJ_REARVIEW_MIRROR]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(60825); else _vm->_dialogs->show(60824); } else if (_action.isAction(VERB_OPEN, NOUN_STORAGE_BOX)) _vm->_dialogs->show(60826); else if (_action.isAction(VERB_LOOK, NOUN_REARVIEW_MIRROR) && (_action._mainObjectSource == 4)) _vm->_dialogs->show(60828); else if (_action.isAction(VERB_LOOK, NOUN_TOOL_BOX)) { if (_game._objects[OBJ_POLYCEMENT]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(60829); else _vm->_dialogs->show(60830); } else if (_action.isAction(VERB_OPEN, NOUN_TOOL_BOX)) _vm->_dialogs->show(60831); else if ((_action.isAction(VERB_LOOK, NOUN_POLYCEMENT)) && (_game._objects.isInRoom(OBJ_POLYCEMENT))) _vm->_dialogs->show(60832); else if (_action.isAction(VERB_LOOK, NOUN_GREASE_CAN) || _action.isAction(VERB_LOOK, NOUN_OIL_CAN)) _vm->_dialogs->show(60834); else if (_action.isAction(VERB_LOOK, NOUN_CAR_LIFT)) _vm->_dialogs->show(60835); else if (_action.isAction(VERB_LOOK, NOUN_CHAIR) || _action.isAction(VERB_LOOK, NOUN_HAT)) _vm->_dialogs->show(60836); else if (_action.isAction(VERB_LOOK, NOUN_DANGER_ZONE)) _vm->_dialogs->show(60838); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene609::Scene609(MADSEngine *vm) : Scene6xx(vm) { _videoDoorMode = -1; } void Scene609::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_videoDoorMode); } void Scene609::setup() { setPlayerSpritesPrefix(); setAAName(); } void Scene609::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('h', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXCD_9"); _globals._spriteIndexes[5] = _scene->_sprites.addSprites("*RXMRC_9"); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); if (!_game._visitedScenes._sceneRevisited) _globals[kBeenInVideoStore] = false; if (_scene->_priorSceneId == 611) { _game._player._playerPos = Common::Point(264, 69); _game._player._facing = FACING_SOUTHWEST; } else if (_scene->_priorSceneId == 610) { _game._player._playerPos = Common::Point(23, 90); _game._player._facing = FACING_EAST; _scene->_sequences.addTimer(60, 60); _game._player._stepEnabled = false; } else if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(86, 136); _game._player._facing = FACING_NORTHEAST; _game._player._visible = false; _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->loadAnimation(formAnimName('R', 1), 70); } if (_scene->_roomChanged) { _game._objects.addToInventory(OBJ_DOOR_KEY); if (_game._difficulty != DIFFICULTY_EASY) _game._objects.addToInventory(OBJ_PENLIGHT); } sceneEntrySound(); _game.loadQuoteSet(0x305, 0x306, 0x307, 0x308, 0x309, 0); } void Scene609::step() { switch (_game._trigger) { case 60: _game._player._stepEnabled = false; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 61); break; case 61: _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, false); _game._player.walk(Common::Point(101, 100), FACING_EAST); _scene->_sequences.addTimer(180, 62); break; case 62: _scene->_sequences.remove( _globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0); _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, true); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 63); break; case 63: if (!_globals[kHasTalkedToHermit] && (_game._difficulty != DIFFICULTY_HARD)) { _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(287, 73)); _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47); } _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _game._player._stepEnabled = true; break; default: break; } switch (_game._trigger) { case 70: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; case 71: if (!_globals[kHasTalkedToHermit]) { _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 26, 2, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 7); _scene->_sequences.setPosition(_globals._sequenceIndexes[3], Common::Point(287, 73)); _scene->_sequences.setScale(_globals._sequenceIndexes[3], 47); } _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72); break; case 72: _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _game._player._stepEnabled = true; break; default: break; } } void Scene609::enterStore() { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; if (_videoDoorMode == 2) _scene->_sequences.addTimer(1, 4); else { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x305)); _scene->_sequences.addTimer(120, 1); } break; case 1: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x306)); _scene->_sequences.addTimer(60, 2); break; case 2: _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[5], true, 11, 2, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[5]); _game._player._visible = true; _game._objects.setRoom(OBJ_DOOR_KEY, 1); _scene->_sequences.addTimer(15, 4); break; case 4: _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.addTimer(15, 5); break; case 5: _scene->_sequences.remove(_globals._sequenceIndexes[5]); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 6); break; case 6: _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, false); if (_videoDoorMode == 1) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 180, _game.getQuote(0x307)); } _game._player.walk(Common::Point(23, 90), FACING_WEST); _scene->_sequences.addTimer(180, 7); break; case 7: _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[2], false, 7, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 8); break; case 8: _scene->_hotspots.activate(NOUN_VIDEO_STORE_DOOR, true); _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 9); _globals[kBeenInVideoStore] = true; _game._player._stepEnabled = true; _scene->_nextSceneId = 610; break; default: break; } } void Scene609::preActions() { if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR)) _game._player.walk(Common::Point(78, 99), FACING_NORTHWEST); } void Scene609::actions() { if (_action.isAction(VERB_WALK_TOWARDS, NOUN_ALLEY)) _scene->_nextSceneId = 611; else if (_action.isAction(VERB_WALK_THROUGH, NOUN_VIDEO_STORE_DOOR)) { if (!_globals[kBeenInVideoStore]) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x308)); _scene->_sequences.addTimer(120, 1); break; case 1: _game._player._visible = false; _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], true, 1); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[5]); _scene->_sequences.addTimer(30, 2); break; case 2: _scene->_sequences.remove(_globals._sequenceIndexes[5]); _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; _scene->_sequences.addTimer(60, 3); break; case 3: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x309)); _scene->_sequences.addTimer(120, 4); break; case 4: _game._player._stepEnabled = true; break; default: break; } } else { _videoDoorMode = 2; enterStore(); } } else if (_action.isAction(VERB_UNLOCK, NOUN_DOOR_KEY, NOUN_VIDEO_STORE_DOOR)) { _videoDoorMode = 1; enterStore(); } else if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) { 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, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { int syncIdx = _globals._sequenceIndexes[1]; _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 5); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx); _scene->_sequences.addTimer(6, 2); } break; case 2: _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: { int syncIdx = _globals._sequenceIndexes[4]; _globals._sequenceIndexes[4] = _scene->_sequences.startCycle(_globals._spriteIndexes[4], false, -2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[4], syncIdx); _scene->_nextSceneId = 504; } break; default: break; } } else if (_action._lookFlag) _vm->_dialogs->show(60910); else if (_action.isAction(VERB_LOOK, NOUN_STREET)) _vm->_dialogs->show(60911); else if (_action.isAction(VERB_LOOK, NOUN_SPOT_A_POT)) _vm->_dialogs->show(60912); else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE)) _vm->_dialogs->show(60913); else if (_action.isAction(VERB_LOOK, NOUN_BILLBOARD)) _vm->_dialogs->show(60914); else if (_action.isAction(VERB_LOOK, NOUN_STATUE)) _vm->_dialogs->show(60915); else if (_action.isAction(VERB_LOOK, NOUN_CAR)) _vm->_dialogs->show(60916); else if (_action.isAction(VERB_LOOK, NOUN_NEWSSTAND)) _vm->_dialogs->show(60917); else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE_DOOR)) { if (!_globals[kBeenInVideoStore]) _vm->_dialogs->show(60918); else _vm->_dialogs->show(60919); } else if (_action.isAction(VERB_WALK_DOWN, NOUN_STREET)) _vm->_dialogs->show(60730); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene610::Scene610(MADSEngine *vm) : Scene6xx(vm) { _handsetHotspotId = -1; _checkVal = -1; _cellCharging = false; _cellChargingTimer = -1; _lastFrameTimer = 0; } void Scene610::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_handsetHotspotId); s.syncAsSint16LE(_checkVal); s.syncAsByte(_cellCharging); s.syncAsSint32LE(_cellChargingTimer); s.syncAsUint32LE(_lastFrameTimer); } void Scene610::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_PHONE_HANDSET); _scene->addActiveVocab(VERB_WALKTO); } void Scene610::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', -1)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites("*RXMRC_9"); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 60, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[4], 13); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 30, 0, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 9); if (!_game._visitedScenes._sceneRevisited) _cellCharging = false; if (_game._objects[OBJ_PHONE_HANDSET]._roomNumber == _scene->_currentSceneId) { _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0); _handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST); if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged]) _globals[kHandsetCellStatus] = 1; } if (_scene->_roomChanged && _game._difficulty != DIFFICULTY_EASY) _game._objects.addToInventory(OBJ_PENLIGHT); if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(175, 152); _game._player._facing = FACING_NORTHWEST; } sceneEntrySound(); } void Scene610::step() { if (_cellCharging) { long diff = _scene->_frameStartTime - _lastFrameTimer; if ((diff >= 0) && (diff <= 60)) _cellChargingTimer += diff; else _cellChargingTimer++; _lastFrameTimer = _scene->_frameStartTime; } // CHECKME: _checkVal is always false, could be removed if ((_cellChargingTimer >= 60) && !_checkVal) { _checkVal = true; _globals[kHandsetCellStatus] = 1; _cellCharging = false; _checkVal = false; _cellChargingTimer = 0; } } void Scene610::actions() { if (_action.isAction(VERB_EXIT_FROM, NOUN_VIDEO_STORE)) _scene->_nextSceneId = 609; else if (_action.isAction(VERB_TAKE, NOUN_PHONE_HANDSET)) { if ( _game._trigger || !_game._objects.isInInventory(OBJ_PHONE_HANDSET)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _vm->_sound->command(9); _scene->_sequences.remove(_globals._sequenceIndexes[1]); _scene->_dynamicHotspots.remove(_handsetHotspotId); _game._objects.addToInventory(OBJ_PHONE_HANDSET); _vm->_dialogs->showItem(OBJ_PHONE_HANDSET, 61017); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]); _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } } } else if (_action.isAction(VERB_PUT, NOUN_PHONE_HANDSET, NOUN_PHONE_CRADLE)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], true, 8, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[2]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 9, 0, 0, 0); _handsetHotspotId = _scene->_dynamicHotspots.add(NOUN_PHONE_HANDSET, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_handsetHotspotId, Common::Point(132, 121), FACING_NORTHWEST); _game._objects.setRoom(OBJ_PHONE_HANDSET, _scene->_currentSceneId); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[2]); _game._player._visible = true; _game._player._stepEnabled = true; if ((_globals[kHandsetCellStatus] == 2) && (_game._difficulty == DIFFICULTY_HARD) && !_globals[kDurafailRecharged]) _cellCharging = true; _vm->_dialogs->show(61032); break; default: break; } } else if (_action.isAction(VERB_LOOK, NOUN_PIPPY_BILLBOARD)) _vm->_dialogs->show(61010); else if (_action.isAction(VERB_LOOK, NOUN_CIVILIZATION_AD)) _vm->_dialogs->show(61011); else if (_action.isAction(VERB_LOOK, NOUN_MARX_BROS_POSTER)) _vm->_dialogs->show(61012); else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_MONITOR)) _vm->_dialogs->show(61013); else if (_action.isAction(VERB_LOOK, NOUN_VIDEO_STORE)) _vm->_dialogs->show(61014); else if (_action._lookFlag) _vm->_dialogs->show(61015); else if (_action.isAction(VERB_LOOK, NOUN_LOGO)) _vm->_dialogs->show(61018); else if (_action.isAction(VERB_LOOK, NOUN_CEMENT)) { if (_game._visitedScenes.exists(601)) _vm->_dialogs->show(61020); else _vm->_dialogs->show(61019); } else if (_action.isAction(VERB_LOOK, NOUN_COUNTER)) _vm->_dialogs->show(61021); else if (_action.isAction(VERB_LOOK, NOUN_PHONE_ANTENNA)) _vm->_dialogs->show(61022); else if (_action.isAction(VERB_LOOK, NOUN_SMELLY_SNEAKER)) _vm->_dialogs->show(61023); else if (_action.isAction(VERB_TAKE, NOUN_SMELLY_SNEAKER)) _vm->_dialogs->show(61024); else if (_action.isAction(VERB_LOOK, NOUN_SPOTLIGHT)) _vm->_dialogs->show(61025); else if (_action.isAction(VERB_LOOK, NOUN_PHONE_HANDSET) && (_action._mainObjectSource == 4)) _vm->_dialogs->show(61026); else if (_action.isAction(VERB_LOOK, NOUN_PHONE_CRADLE)) _vm->_dialogs->show(61027); else if (_action.isAction(VERB_LOOK, NOUN_RETURN_SLOT)) _vm->_dialogs->show(61028); else if (_action.isAction(VERB_PUT, NOUN_RETURN_SLOT) && _game._objects.isInInventory(_game._objects.getIdFromDesc(_action._activeAction._objectNameId))) _vm->_dialogs->show(61029); else if ( _action.isObject(NOUN_CLASSIC_VIDEOS) || _action.isObject(NOUN_MORE_CLASSIC_VIDEOS) || _action.isObject(NOUN_DRAMA_VIDEOS) || _action.isObject(NOUN_NEW_RELEASE_VIDEOS) || _action.isObject(NOUN_PORNO_VIDEOS) || _action.isObject(NOUN_EDUCATIONAL_VIDEOS) || _action.isObject(NOUN_INSTRUCTIONAL_VIDEOS) || _action.isObject(NOUN_WORKOUT_VIDEOS) || _action.isObject(NOUN_FOREIGN_VIDEOS) || _action.isObject(NOUN_ADVENTURE_VIDEOS) || _action.isObject(NOUN_COMEDY_VIDEOS)) { if (_action.isAction(VERB_LOOK)) _vm->_dialogs->show(61030); else if (_action.isAction(VERB_TAKE)) _vm->_dialogs->show(61031); else return; } else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene611::Scene611(MADSEngine *vm) : Scene6xx(vm), _defaultDialogPos(0, 0) { _seenRatFl = false; _eyesRunningFl = false; _shouldRemoveEyes = false; _ratPresentFl = false; _duringDialogFl = false; _resetBatterieText = false; _hermitTalkingFl = false; _hermitMovingFl = false; _alreadyTalkingFl = false; _giveBatteriesFl = false; _startTradingFl = false; _check1Fl = false; _stickFingerFl = false; _randVal = -1; _ratHotspotId = -1; _hermitDialogNode = -1; _hermitDisplayedQuestion = -1; _nextFrame = -1; _hermitMode = -1; _ratTimer = 0; } void Scene611::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsByte(_seenRatFl); s.syncAsByte(_eyesRunningFl); s.syncAsByte(_shouldRemoveEyes); s.syncAsByte(_ratPresentFl); s.syncAsByte(_duringDialogFl); s.syncAsByte(_resetBatterieText); s.syncAsByte(_hermitTalkingFl); s.syncAsByte(_hermitMovingFl); s.syncAsByte(_alreadyTalkingFl); s.syncAsByte(_giveBatteriesFl); s.syncAsByte(_startTradingFl); s.syncAsByte(_check1Fl); s.syncAsByte(_stickFingerFl); s.syncAsSint16LE(_randVal); s.syncAsSint16LE(_ratHotspotId); s.syncAsSint16LE(_hermitDialogNode); s.syncAsSint16LE(_hermitDisplayedQuestion); s.syncAsSint16LE(_nextFrame); s.syncAsSint16LE(_hermitMode); s.syncAsUint32LE(_ratTimer); s.syncAsSint16LE(_defaultDialogPos.x); s.syncAsSint16LE(_defaultDialogPos.y); } void Scene611::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_RAT); _scene->addActiveVocab(VERB_WALKTO); } void Scene611::handleRatMoves() { _ratPresentFl = false; _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 11, -2); _ratTimer = _game._player._priorTimer; _scene->_dynamicHotspots.remove(_ratHotspotId); } void Scene611::handleTrading() { if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) _game._objects.setRoom(OBJ_DURAFAIL_CELLS, 1); if (_game._objects.isInInventory(OBJ_PHONE_CELLS)) _game._objects.setRoom(OBJ_PHONE_CELLS, 1); _game._objects.addToInventory(OBJ_FAKE_ID); } void Scene611::setDialogNode(int node) { if (node > 0) _hermitDialogNode = node; _game._player._stepEnabled = true; switch (node) { case 0: _scene->_userInterface.setup(kInputBuildingSentences); _duringDialogFl = false; _hermitDialogNode = 0; break; case 1: _dialog1.start(); _duringDialogFl = true; _hermitDialogNode = 1; break; case 2: _dialog2.start(); _duringDialogFl = true; _hermitDialogNode = 2; break; default: break; } } bool Scene611::check2ChargedBatteries() { if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && !_game._objects.isInInventory(OBJ_PHONE_CELLS)) || (!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS))) return true; return false; } bool Scene611::check4ChargedBatteries() { if (_game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS) && _globals[kDurafailRecharged]) return true; return false; } void Scene611::handleTalking(int delay) { if (_hermitTalkingFl) _alreadyTalkingFl = true; _hermitTalkingFl = true; _game._triggerSetupMode = SEQUENCE_TRIGGER_DAEMON; _scene->_sequences.addTimer(delay, 100); } void Scene611::handleSubDialog1() { switch (_action._activeAction._verbId) { case 0x287: _stickFingerFl = true; _nextFrame = 34; _hermitMovingFl = false; _hermitMode = 5; displayHermitQuestions(5); _dialog1.write(0x287, false); if (!_dialog1.read(0x288)) _dialog1.write(0x28E, true); _dialog2.write(0x29C, true); _dialog2.write(0x29D, true); _dialog2.write(0x29E, true); setDialogNode(2); break; case 0x288: handleTalking(500); displayHermitQuestions(6); _dialog1.write(0x288, false); _dialog1.write(0x289, true); if (!_dialog1.read(0x287)) _dialog1.write(0x28E, true); setDialogNode(1); break; case 0x289: handleTalking(500); displayHermitQuestions(10); _dialog1.write(0x289, false); _dialog1.write(0x28A, true); _dialog1.write(0x28B, true); setDialogNode(1); break; case 0x28A: handleTalking(500); displayHermitQuestions(11); _dialog1.write(0x28A, false); setDialogNode(1); break; case 0x28B: handleTalking(500); displayHermitQuestions(12); _dialog1.write(0x28C, true); _dialog1.write(0x28D, true); _dialog1.write(0x28B, false); setDialogNode(1); break; case 0x28C: handleTalking(500); displayHermitQuestions(13); _dialog1.write(0x28C, false); setDialogNode(1); break; case 0x28D: handleTalking(500); displayHermitQuestions(14); _dialog1.write(0x290, true); _dialog1.write(0x28D, false); _dialog1.write(0x28F, true); setDialogNode(1); break; case 0x28E: handleTalking(500); displayHermitQuestions(15); _dialog1.write(0x295, true); _dialog1.write(0x28E, false); setDialogNode(1); break; case 0x290: handleTalking(500); displayHermitQuestions(17); _dialog1.write(0x290, false); _dialog1.write(0x28e, false); if (!_dialog1.read(0x28F)) _dialog1.write(0x291, true); setDialogNode(1); break; case 0x291: handleTalking(500); displayHermitQuestions(18); _dialog1.write(0x291, false); if ((!_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) && (!_game._objects.isInInventory(OBJ_PHONE_CELLS))) { _dialog1.write(0x292, true); _dialog1.write(0x293, true); } if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS))) _dialog1.write(0x294, true); // WORKAROUND: Fix bug in the original where the option to give Hermit batteries // would be given before the player even has any batteries _globals[kHermitWantsBatteries] = true; setDialogNode(1); break; case 0x28F: handleTalking(500); displayHermitQuestions(16); _dialog1.write(0x28F, false); if (!_dialog1.read(0x290)) _dialog1.write(0x291, true); setDialogNode(1); break; case 0x295: handleTalking(500); displayHermitQuestions(20); _dialog1.write(0x295, false); setDialogNode(1); break; case 0x292: handleTalking(500); displayHermitQuestions(19); _dialog1.write(0x292, false); _dialog1.write(0x293, false); setDialogNode(1); break; case 0x293: { handleTalking(200); _scene->_kernelMessages.reset(); Common::String curQuote = _game.getQuote(0x2D1); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote); curQuote = _game.getQuote(0x2D2); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote); _dialog1.write(0x293, false); setDialogNode(0); } break; case 0x294: { bool hermitPleasedFl = false; switch (_game._difficulty) { case DIFFICULTY_EASY: hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) || _game._objects.isInInventory(OBJ_PHONE_CELLS); break; case DIFFICULTY_MEDIUM: hermitPleasedFl = _game._objects.isInInventory(OBJ_DURAFAIL_CELLS) && _game._objects.isInInventory(OBJ_PHONE_CELLS); break; default: // HARD hermitPleasedFl = check4ChargedBatteries(); break; } if (hermitPleasedFl) { _hermitDisplayedQuestion = 21; if (!_giveBatteriesFl) setDialogNode(0); else _giveBatteriesFl = false; } else if (((_game._difficulty == DIFFICULTY_MEDIUM) || (_game._difficulty == DIFFICULTY_HARD)) && check2ChargedBatteries()) { _hermitDisplayedQuestion = 22; if (!_giveBatteriesFl) setDialogNode(0); else _giveBatteriesFl = false; } else { _hermitDisplayedQuestion = 23; if (!_giveBatteriesFl) setDialogNode(0); else _giveBatteriesFl = false; } _startTradingFl = true; } break; case 0x296: { _scene->_kernelMessages.reset(); Common::String curQuote = _game.getQuote(0x2E6); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote); setDialogNode(0); handleTalking(200); } break; default: break; } } void Scene611::handleSubDialog2() { switch (_action._activeAction._verbId) { case 0x29C: displayHermitQuestions(7); setDialogNode(1); handleTalking(500); break; case 0x29D: displayHermitQuestions(8); setDialogNode(1); handleTalking(500); break; case 0x29E: displayHermitQuestions(9); setDialogNode(1); handleTalking(500); break; case 0x29F: { _scene->_kernelMessages.reset(); Common::String curQuote = _game.getQuote(0x2A7); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote); setDialogNode(0); _dialog2.write(0x29F, false); } break; default: break; } } void Scene611::handleDialog() { if (_game._trigger == 0) { _scene->_kernelMessages.reset(); _game._player._stepEnabled = false; Common::String curQuote = _game.getQuote(_action._activeAction._verbId); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); if (width > 200) { Common::String subQuote1, subQuote2; _game.splitQuote(curQuote, subQuote1, subQuote2); _scene->_kernelMessages.add(Common::Point(0, -14), 0x1110, 34, 0, 150, subQuote1); if (_action._activeAction._verbId == 0x29D) _scene->_kernelMessages.add(Common::Point(-18, 0), 0x1110, 34, 1, 150, subQuote2); else if (_action._activeAction._verbId == 0x28A) _scene->_kernelMessages.add(Common::Point(-10, 0), 0x1110, 34, 1, 150, subQuote2); else _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 150, subQuote2); _scene->_sequences.addTimer(170, 50); } else { _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 1, 120, curQuote); _scene->_sequences.addTimer(140, 50); } } else if (_game._trigger == 50) { if (_hermitDialogNode == 1) handleSubDialog1(); else if (_hermitDialogNode == 2) handleSubDialog2(); } } void Scene611::displayHermitQuestions(int question) { _scene->_kernelMessages.reset(); _hermitDisplayedQuestion = question; switch (question) { case 1: { Common::String curQuote = _game.getQuote(0x281); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x282); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 2: { Common::String curQuote = _game.getQuote(0x283); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x284); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 3: { Common::String curQuote = _game.getQuote(0x285); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 4: { Common::String curQuote = _game.getQuote(0x286); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 5: { Common::String curQuote = _game.getQuote(0x297); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y - 14), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x298); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x299); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 6: { Common::String curQuote = _game.getQuote(0x29A); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x29B); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 7: { Common::String curQuote = _game.getQuote(0x2A0); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2A1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 8: { Common::String curQuote = _game.getQuote(0x2A2); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2A3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2A4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 9: { Common::String curQuote = _game.getQuote(0x2A5); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2A6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 10: { Common::String curQuote = _game.getQuote(0x2A8); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2A9); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2AA); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 11: { Common::String curQuote = _game.getQuote(0x2AB); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2AC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2AD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2AE); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 12: { Common::String curQuote = _game.getQuote(0x2AF); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B2); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 13: { Common::String curQuote = _game.getQuote(0x2B3); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2B6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B7)); _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 73), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B8)); _scene->_kernelMessages.add(Common::Point(11, _defaultDialogPos.y + 87), 0xFDFC, 0, 0, 9999999, _game.getQuote(0x2B9)); } break; case 14: { Common::String curQuote = _game.getQuote(0x2BA); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2BB); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2BC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2BD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 15: { Common::String curQuote = _game.getQuote(0x2BE); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2BF); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C1); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 16: { Common::String curQuote = _game.getQuote(0x2C2); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 17: { Common::String curQuote = _game.getQuote(0x2C7); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C8); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2C0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2CA); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 18: { Common::String curQuote = _game.getQuote(0x2CB); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2CC); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2CD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 19: { Common::String curQuote = _game.getQuote(0x2CE); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2CF); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2D0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 20: { Common::String curQuote = _game.getQuote(0x2E1); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2E2); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2E3); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2E4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 9999999, curQuote); curQuote = _game.getQuote(0x2E5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 9999999, curQuote); } break; case 21: { Common::String curQuote = _game.getQuote(0x2D3); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 800, curQuote); curQuote = _game.getQuote(0x2D4); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 800, curQuote); curQuote = _game.getQuote(0x2D5); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 800, curQuote); curQuote = _game.getQuote(0x2D6); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 800, curQuote); curQuote = _game.getQuote(0x2D7); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 800, curQuote); } break; case 22: { Common::String curQuote = _game.getQuote(0x2D8); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2D9); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2DA); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2DB); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote); } break; case 23: { Common::String curQuote = _game.getQuote(0x2DC); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 3), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2DD); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 17), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2DE); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 31), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2DF); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 45), 0xFDFC, 0, 0, 700, curQuote); curQuote = _game.getQuote(0x2E0); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 59), 0xFDFC, 0, 0, 700, curQuote); } break; default: break; } } void Scene611::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("*RXMRC_9"); _game.loadQuoteSet(0x279, 0x27A, 0x27B, 0x27C, 0x27D, 0x27E, 0x27F, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299, 0x29A, 0x29B, 0x29C, 0x29D, 0x29E, 0x29F, 0x2A0, 0x2A1, 0x2A2, 0x2A3, 0x2A4, 0x2A5, 0x2A6, 0x2A7, 0x2A8, 0x2A9, 0x2AA, 0x2AB, 0x2AC, 0x2AD, 0x2AE, 0x2AF, 0x2B0, 0x2B1, 0x2B2, 0x2B3, 0x2B4, 0x2B5, 0x2B6, 0x2B7, 0x2B8, 0x2B9, 0x2BA, 0x2BB, 0x2BC, 0x2BD, 0x2BE, 0x2BF, 0x2C0, 0x2C1, 0x2C2, 0x2C3, 0x2C4, 0x2C5, 0x2C6, 0x2C7, 0x2C8, 0x2C9, 0x2CA, 0x2CB, 0x2CC, 0x2CD, 0x2CE, 0x2CF, 0x2D0, 0x2D1, 0x2D2, 0x2D3, 0x2D4, 0x2D5, 0x2D6, 0x2D7, 0x2D8, 0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6, 0x323, 0x324, 0); _dialog1.setup(kConvHermit1, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0); _dialog2.setup(kConvHermit2, 0x29C, 0x29D, 0x29E, 0x29F, 0); if (!_game._visitedScenes._sceneRevisited) { _dialog1.set(kConvHermit1, 0x287, 0x288, 0x296, 0); _dialog2.set(kConvHermit2, 0x29F, 0); } _vm->_palette->setEntry(252, 51, 51, 47); _vm->_palette->setEntry(253, 37, 37, 37); _ratPresentFl = false; _seenRatFl = true; _eyesRunningFl = false; _shouldRemoveEyes = false; _randVal = 0; _defaultDialogPos = Common::Point(264, 43); _giveBatteriesFl = false; _resetBatterieText = false; _alreadyTalkingFl = false; _startTradingFl = false; if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(22, 132); _game._player._facing = FACING_EAST; _duringDialogFl = false; } if (!_globals[kHasTalkedToHermit]) { _scene->loadAnimation(Resources::formatName(611, 'h', -1, EXT_AA, ""), 0); _nextFrame = 47; _hermitMode = 1; _hermitTalkingFl = false; _hermitMovingFl = true; _check1Fl = true; _stickFingerFl = false; } else { _hermitMode = 0; _scene->_hotspots.activate(NOUN_HERMIT, false); } // WORKAROUND: Fix original adding 'give batteries' option even if you don't have them if (_globals[kHermitWantsBatteries]) { if ((_game._objects.isInInventory(OBJ_DURAFAIL_CELLS)) || (_game._objects.isInInventory(OBJ_PHONE_CELLS))) _dialog1.write(0x294, true); } if (_duringDialogFl) { _game._player._playerPos = Common::Point(237, 129); _game._player._facing = FACING_NORTHEAST; switch (_hermitDialogNode) { case 0: _scene->_userInterface.setup(kInputBuildingSentences); _hermitDialogNode = 1; break; case 1: _dialog1.start(); break; case 2: _dialog2.start(); break; default: break; } displayHermitQuestions(_hermitDisplayedQuestion); } sceneEntrySound(); } void Scene611::step() { if (_seenRatFl && (_vm->getRandomNumber(1, 100) == 10)) { _seenRatFl = false; _scene->_sequences.addTimer(1, 80); } if (_game._trigger == 80) { _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 12, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 1, 8); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); _ratPresentFl = true; _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 81); } else if (_game._trigger == 81) { int syncId = _globals._sequenceIndexes[1]; _globals._sequenceIndexes[1] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[1], false, 20, 0, 0, 0); int idx = _scene->_dynamicHotspots.add(NOUN_RAT, VERB_WALKTO, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _ratHotspotId = _scene->_dynamicHotspots.setPosition(idx, Common::Point(272, 154), FACING_SOUTHEAST); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[1], 9, 10); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncId); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 1); _ratTimer = _game._player._priorTimer; } if (_ratPresentFl && ((_game._player._priorTimer - _ratTimer) > 1200)) handleRatMoves(); if (!_eyesRunningFl) { _randVal = _vm->getRandomNumber(1, 30); _eyesRunningFl = true; _scene->_sequences.addTimer(1, 70); } if (_game._trigger == 70) { switch (_randVal) { case 2: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 6: _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 12, 3, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 2, 4); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 7: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 5); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 9: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 13: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 7); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 14: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 8); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 15: _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 24, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 5, 8); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 17: _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 20, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[2], 9, 11); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 21: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 9); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 25: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 10); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 27: _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, 11); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _shouldRemoveEyes = true; _scene->_sequences.addTimer(60, 71); break; case 29: _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 20, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; default: _scene->_sequences.addTimer(1, 71); break; } } if (_game._trigger == 71) { if (_shouldRemoveEyes) { _scene->_sequences.remove(_globals._sequenceIndexes[2]); _shouldRemoveEyes = false; } _eyesRunningFl = false; _randVal = 0; } if (_game._trigger == 100) { if (_alreadyTalkingFl) _alreadyTalkingFl = false; else _hermitMovingFl = true; } if (_stickFingerFl && (_scene->_activeAnimation->getCurrentFrame() == 47)) { _stickFingerFl = false; _hermitMovingFl = true; _hermitMode = 1; } if (_scene->_activeAnimation != nullptr && (_scene->_activeAnimation->getCurrentFrame() == 240) && _check1Fl) { _check1Fl = false; _scene->_kernelMessages.add(Common::Point(33, 88), 0xFDFC, 0, 0, 90, _game.getQuote(0x27E)); _scene->_sequences.addTimer(120, 120); } if (_game._trigger == 120) { int msgIdx = _scene->_kernelMessages.add(Common::Point(28, 102), 0xFDFC, 0, 0, 90, _game.getQuote(0x27F)); _scene->_kernelMessages.setQuoted(msgIdx, 4, true); _scene->_sequences.addTimer(100, 121); } if (_game._trigger == 121) { int msgIdx = _scene->_kernelMessages.add(Common::Point(23, 116), 0xFDFC, 0, 0, 90, _game.getQuote(0x280)); _scene->_kernelMessages.setQuoted(msgIdx, 4, true); } if (_hermitMode == 1) { if (_startTradingFl) { _hermitMode = 6; _hermitMovingFl = false; _hermitTalkingFl = false; _scene->_sequences.addTimer(1, 110); } else if (_hermitTalkingFl) { _hermitMode = 2; _nextFrame = 18; _hermitMovingFl = false; } else { switch (_vm->getRandomNumber(1, 5)) { case 1: _nextFrame = 46; break; case 2: _nextFrame = 47; break; case 3: _nextFrame = 48; break; case 4: _nextFrame = 49; break; case 5: _nextFrame = 50; break; default: break; } } } if (_hermitMode == 2) { if (_startTradingFl) { _hermitMode = 6; _hermitMovingFl = false; _hermitTalkingFl = false; _scene->_sequences.addTimer(1, 110); } else if (_hermitMovingFl) { _hermitMode = 1; _nextFrame = 47; _hermitTalkingFl = false; } else { switch (_vm->getRandomNumber(1, 4)) { case 1: _nextFrame = 18; break; case 2: _nextFrame = 20; break; case 3: _nextFrame = 22; break; case 4: _nextFrame = 24; break; default: break; } } } if (_scene->_activeAnimation != nullptr && _scene->_activeAnimation->getCurrentFrame() == 254) _game._player._stepEnabled = true; if (_game._trigger == 110) { _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 111); } if (_game._trigger == 111) { int syncIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], false, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx); _nextFrame = 1; } if (_game._trigger == 112) { _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; } if (_hermitMode == 6) { if ((_scene->_activeAnimation->getCurrentFrame() == 9) && _check1Fl) { _scene->_sequences.remove(_globals._sequenceIndexes[3]); _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 112); _check1Fl = false; } if ((_scene->_activeAnimation->getCurrentFrame() == 17) && !_check1Fl) { _nextFrame = 26; _hermitMode = 4; _check1Fl = true; } } if (_hermitMode == 4) { if ((_scene->_activeAnimation->getCurrentFrame() == 33) && _check1Fl) { displayHermitQuestions(_hermitDisplayedQuestion); _nextFrame = 1; _check1Fl = false; } if ((_scene->_activeAnimation->getCurrentFrame() == 9) && !_check1Fl) { _nextFrame = 8; _scene->_sequences.addTimer(1, 113); _check1Fl = true; } } if (_game._trigger == 113) { _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 114); } if (_game._trigger == 114) { _resetBatterieText = true; int syncIdx = _globals._sequenceIndexes[3]; _nextFrame = 10; _globals._sequenceIndexes[3] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[3], false, 7, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 2); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 115); } if ((_nextFrame >= 0) && (_nextFrame != _scene->_activeAnimation->getCurrentFrame())) { _scene->_activeAnimation->setCurrentFrame(_nextFrame); _nextFrame = -1; } if (_game._trigger == 115) { _game._player._priorTimer = _scene->_frameStartTime - _game._player._ticksAmount; _game._player._visible = true; if (_hermitDisplayedQuestion == 21) { _game._player._stepEnabled = false; handleTrading(); _hermitMode = 0; _startTradingFl = false; _nextFrame = 52; _globals[kHasTalkedToHermit] = true; _scene->_hotspots.activate(NOUN_HERMIT, false); } else { _game._player._stepEnabled = true; _hermitMode = 1; _nextFrame = 47; _hermitTalkingFl = false; _startTradingFl = false; _check1Fl = true; } } } void Scene611::preActions() { if (_action.isAction(VERB_WALK_DOWN, NOUN_ALLEY)) _game._player._walkOffScreenSceneId = 609; if (_resetBatterieText) _scene->_kernelMessages.reset(); } void Scene611::actions() { if (_game._screenObjects._inputMode == kInputConversation) handleDialog(); else if ((_action.isAction(VERB_GIVE, NOUN_PHONE_CELLS, NOUN_HERMIT)) || (_action.isAction(VERB_GIVE, NOUN_DURAFAIL_CELLS, NOUN_HERMIT))) { _action._activeAction._verbId = 0x294; _giveBatteriesFl = true; handleSubDialog1(); } else if (_action.isAction(VERB_GIVE, NOUN_HERMIT)) { _scene->_kernelMessages.reset(); Common::String curQuote = _game.getQuote(0x323); int width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); int quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y), 0xFDFC, 0, 0, 120, curQuote); curQuote = _game.getQuote(0x324); width = _vm->_font->getWidth(curQuote, _scene->_textSpacing); quotePosX = _defaultDialogPos.x - (width / 2); _scene->_kernelMessages.add(Common::Point(quotePosX, _defaultDialogPos.y + 14), 0xFDFC, 0, 0, 120, curQuote); } else if (_game._trigger == 90) { if (_dialog2.read(0x29C) && _dialog2.read(0x29D) && _dialog2.read(0x29E)) { handleTalking(180); if (_vm->getRandomNumber(1, 2) == 1) displayHermitQuestions(1); else displayHermitQuestions(2); } else { handleTalking(180); if (_vm->getRandomNumber(1, 2) == 1) displayHermitQuestions(3); else displayHermitQuestions(4); } _duringDialogFl = true; if (_dialog2.read(0x29F)) { _hermitDialogNode = 1; _dialog1.start(); _duringDialogFl = true; } else { _hermitDialogNode = 2; _dialog2.write(0x29F, true); _dialog2.start(); _duringDialogFl = true; } } else if (_action.isAction(VERB_TALKTO, NOUN_HERMIT)) { if (!_dialog1.read(0x287)) { _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x27A)); _scene->_sequences.addTimer(120, 90); } else { int nextQuote = 0; switch (_vm->getRandomNumber(1, 3)) { case 1: nextQuote = 0x27B; break; case 2: nextQuote = 0x27C; break; case 3: nextQuote = 0x27D; break; } _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(nextQuote)); _scene->_sequences.addTimer(120, 90); } } else if ((_action.isAction(VERB_WALKTO) || _action.isAction(VERB_LOOK)) && _action.isObject(NOUN_RAT)) { switch (_game._trigger) { case 0: _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x279)); _scene->_sequences.addTimer(60, 1); break; case 1: handleRatMoves(); _game._player._stepEnabled = true; break; default: break; } } else if (_action._lookFlag) { if (_globals[kHasTalkedToHermit]) _vm->_dialogs->show(61111); else _vm->_dialogs->show(61110); } else if (_action.isAction(VERB_LOOK, NOUN_HERMIT)) _vm->_dialogs->show(61112); else if (_action.isAction(VERB_LOOK, NOUN_TRASH)) _vm->_dialogs->show(61113); else if (_action.isAction(VERB_TAKE, NOUN_TRASH)) _vm->_dialogs->show(61114); else if (_action.isAction(VERB_LOOK, NOUN_CARDBOARD_BOX)) _vm->_dialogs->show(61115); else if (_action.isAction(VERB_TAKE, NOUN_CARDBOARD_BOX)) _vm->_dialogs->show(61116); else if (_action.isAction(VERB_OPEN, NOUN_CARDBOARD_BOX)) _vm->_dialogs->show(61117); else if (_action.isAction(VERB_LOOK, NOUN_REFRIGERATOR)) _vm->_dialogs->show(61118); else if (_action.isAction(VERB_OPEN, NOUN_REFRIGERATOR)) _vm->_dialogs->show(61119); else if (_action.isAction(VERB_TAKE, NOUN_REFRIGERATOR)) _vm->_dialogs->show(61120); else if (_action.isAction(VERB_LOOK, NOUN_BUILDING)) _vm->_dialogs->show(61121); else if (_action.isAction(VERB_LOOK, NOUN_GRAFFITI)) _vm->_dialogs->show(61122); else if (_action.isAction(VERB_LOOK, NOUN_METAL_PIPE)) _vm->_dialogs->show(61123); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ Scene612::Scene612(MADSEngine *vm) : Scene6xx(vm) { _actionMode = -1; _cycleIndex = -1; } void Scene612::synchronize(Common::Serializer &s) { Scene6xx::synchronize(s); s.syncAsSint16LE(_actionMode); s.syncAsSint16LE(_cycleIndex); } void Scene612::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_FISHING_LINE); _scene->addActiveVocab(VERB_WALKTO); } void Scene612::handleWinchMovement() { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 10, 1, 0, 0); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[4], 1, 5); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[4]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 5, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: // CHECKME: Is the "else" block useful as action is always equal to 1 at this point? // Or is it a missing bit of code we could fix? if (_actionMode == 1) { _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 17, 7, 0, 0); _vm->_sound->command(19); _game._objects.setRoom(OBJ_PADLOCK_KEY, 1); _globals[kBoatRaised] = false; } else { _scene->_sequences.remove(_globals._sequenceIndexes[2]); _globals._sequenceIndexes[2] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[2], false, 17, 9, 0, 0); _vm->_sound->command(18); } _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[2], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 2: _scene->_sequences.updateTimeout(-1, _globals._sequenceIndexes[4]); _game._player._visible = true; break; case 3: { int syncIdx = _globals._sequenceIndexes[2]; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[2], syncIdx); _scene->_kernelMessages.reset(); _scene->_kernelMessages.add(Common::Point(0, 0), 0x1110, 34, 0, 120, _game.getQuote(0x2F4)); _game._player._stepEnabled = true; _vm->_dialogs->show(61217); } break; default: break; } } void Scene612::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('c', -1)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', -1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites("*RXCD_3"); _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*RXRC_6"); if ((_globals[kLineStatus] == 2) || (_globals[kLineStatus] == 3)) { _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('f', -1)); _globals._sequenceIndexes[5] = _scene->_sequences.startCycle(_globals._spriteIndexes[5], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); int idx = _scene->_dynamicHotspots.add(NOUN_FISHING_LINE, VERB_WALKTO, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(idx, Common::Point(34, 117), FACING_SOUTHEAST); } if (_globals[kBoatRaised]) _cycleIndex = -2; else _cycleIndex = -1; _globals._sequenceIndexes[2] = _scene->_sequences.startCycle(_globals._spriteIndexes[2], false, _cycleIndex); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 1); if (_scene->_priorSceneId != RETURNING_FROM_DIALOG) { _game._player._playerPos = Common::Point(280, 75); _game._player._facing = FACING_SOUTHWEST; _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3); _scene->loadAnimation(formAnimName('R', 1), 70); } sceneEntrySound(); if (_scene->_roomChanged) _game._objects.addToInventory(OBJ_PADLOCK_KEY); _game.loadQuoteSet(0x2F5, 0x2F4, 0); } void Scene612::step() { switch (_game._trigger) { case 70: _game._player._visible = true; _game._player._priorTimer = _scene->_activeAnimation->getNextFrameTimer() - _game._player._ticksAmount; _scene->_sequences.addTimer(6, 71); break; case 71: _scene->_sequences.remove(_globals._sequenceIndexes[1]); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 72); break; case 72: _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2); _game._player._stepEnabled = true; break; default: break; } } void Scene612::actions() { if (_action.isAction(VERB_GET_INSIDE, NOUN_CAR)) { 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, 6, 1, 0, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[1], SEQUENCE_TRIGGER_EXPIRE, 0, 1); break; case 1: { int syncIdx = _globals._sequenceIndexes[1]; _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 3); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[1], syncIdx); _scene->_sequences.addTimer(6, 2); } break; case 2: _game._player._visible = false; _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], true, 10, 1, 0, 0); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 3: { int syncIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.startCycle(_globals._spriteIndexes[3], true, -2); _scene->_sequences.setMsgLayout(_globals._sequenceIndexes[3]); _scene->_sequences.updateTimeout(_globals._sequenceIndexes[3], syncIdx); _scene->_nextSceneId = 504; } break; default: break; } } else if (_action.isAction(VERB_UNLOCK, NOUN_PADLOCK_KEY, NOUN_CONTROL_BOX)) { _cycleIndex = -2; _actionMode = 1; handleWinchMovement(); } else if (_action._lookFlag || _action.isAction(VERB_LOOK, NOUN_EXPRESSWAY)) _vm->_dialogs->show(61210); else if (_action.isAction(VERB_LOOK, NOUN_ROPE) || _action.isAction(VERB_LOOK, NOUN_ARMATURE)) { if (_globals[kBoatRaised]) _vm->_dialogs->show(61211); else _vm->_dialogs->show(61212); } else if (_action.isAction(VERB_TAKE, NOUN_ROPE)) _vm->_dialogs->show(61213); else if (_action.isAction(VERB_LOOK, NOUN_CONTROL_BOX)) { if (_globals[kBoatRaised]) _vm->_dialogs->show(61214); else _vm->_dialogs->show(61216); } else if (_action.isAction(VERB_OPEN, NOUN_CONTROL_BOX)) _vm->_dialogs->show(61215); else if (_action.isAction(VERB_LOOK, NOUN_BUILDINGS)) _vm->_dialogs->show(61218); else if (_action.isAction(VERB_LOOK, NOUN_DOME)) _vm->_dialogs->show(61219); else if (_action.isAction(VERB_LOOK, NOUN_STATUE)) _vm->_dialogs->show(61220); else if (_action.isAction(VERB_LOOK, NOUN_MAINTENANCE_BUILDING)) _vm->_dialogs->show(61221); else if (_action.isAction(VERB_OPEN, NOUN_MAINTENANCE_BUILDING)) _vm->_dialogs->show(61222); else if (_action.isAction(VERB_LOOK, NOUN_WALL)) _vm->_dialogs->show(61223); else if (_action.isAction(VERB_LOOK, NOUN_SUPPORT)) _vm->_dialogs->show(61224); else if (_action.isAction(VERB_WALK_DOWN, NOUN_EXPRESSWAY_TO_EAST) || _action.isAction(VERB_WALK_DOWN, NOUN_EXPRESSWAY_TO_WEST)) _vm->_dialogs->show(61225); else return; _action._inProgress = false; } /*------------------------------------------------------------------------*/ void Scene620::setup() { _game._player._spritesPrefix = ""; setAAName(); } void Scene620::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('b', 0)); _globals._sequenceIndexes[1] = _scene->_sequences.startCycle(_globals._spriteIndexes[1], false, -1); _game._player._stepEnabled = false; _game._player._visible = false; _scene->_sequences.addTimer(30, 70); _scene->_userInterface.setup(kInputLimitedSentences); sceneEntrySound(); } void Scene620::step() { switch (_game._trigger) { case 70: _scene->_sequences.remove(_globals._sequenceIndexes[1]); _scene->loadAnimation(formAnimName('E', -1), 71); break; case 71: if (_scene->_priorSceneId == 751) { _globals[kCityFlooded] = true; _globals[kTeleporterRoom + 5] = 0; _scene->_nextSceneId = 701; } else if (_scene->_priorSceneId == 752) { _globals[kCityFlooded] = true; _globals[kTeleporterRoom + 5] = 0; _scene->_nextSceneId = 702; } else if (_scene->_priorSceneId < 501 || _scene->_priorSceneId > 752) { _globals[kCityFlooded] = true; _globals[kTeleporterRoom + 5] = 0; _scene->_nextSceneId = _scene->_priorSceneId; } else if (_scene->_priorSceneId >= 501 && _scene->_priorSceneId <= 612) { _globals[kResurrectRoom] = _globals[kHoverCarLocation]; _game._objects.addToInventory(OBJ_TIMEBOMB); _globals[kTimebombStatus] = 0; _globals[kTimebombTimer] = 0; _scene->_nextSceneId = 605; } _game._player._stepEnabled = true; break; default: break; } } /*------------------------------------------------------------------------*/ } // End of namespace Nebular } // End of namespace MADS