/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "common/scummsys.h" #include "mads/mads.h" #include "mads/conversations.h" #include "mads/scene.h" #include "mads/dragonsphere/dragonsphere_scenes.h" #include "mads/dragonsphere/dragonsphere_scenes1.h" namespace MADS { namespace Dragonsphere { void Scene1xx::setAAName() { int idx; switch (_scene->_nextSceneId) { case 108: case 109: idx = 3; break; case 110: idx = 5; break; case 113: case 114: case 115: case 117: case 119: idx = 1; break; case 116: idx = 2; break; case 120: idx = 8; break; default: idx = 0; break; } _game._aaName = Resources::formatAAName(idx); _vm->_palette->setEntry(254, 56, 47, 32); } void Scene1xx::sceneEntrySound() { if (!_vm->_musicFlag) return; switch (_scene->_nextSceneId) { case 104: if (_globals[kPlayerPersona] == 1) _vm->_sound->command(44); else _vm->_sound->command(16); break; case 106: if (_globals[kEndOfGame]) _vm->_sound->command(47); else _vm->_sound->command(16); break; case 108: if (_game._visitedScenes.exists(109)) _vm->_sound->command(32); else _vm->_sound->command(33); break; case 109: _vm->_sound->command(32); break; case 110: _vm->_sound->command(37); break; case 111: _vm->_sound->command(34); break; case 112: _vm->_sound->command(38); break; case 113: _vm->_sound->command(5); if (_globals[kPlayerIsSeal]) _vm->_sound->command(35); else _vm->_sound->command(36); break; case 114: _vm->_sound->command(36); break; case 115: _vm->_sound->command(39); break; case 116: _vm->_sound->command(40); break; case 117: _vm->_sound->command(35); break; case 119: _vm->_sound->command(41); break; case 120: _vm->_sound->command(46); break; default: _vm->_sound->command(16); break; } } void Scene1xx::setPlayerSpritesPrefix() { int darkSceneFl = false; int noPlayerFl = false; _vm->_sound->command(5); Common::String oldName = _game._player._spritesPrefix; _globals[kPerformDisplacements] = true; switch (_scene->_nextSceneId) { case 106: if (_scene->_currentSceneId == 120) noPlayerFl = true; break; case 108: case 109: case 114: case 115: darkSceneFl = true; break; case 111: case 112: case 117: case 120: case 119: noPlayerFl = true; break; case 113: if (!_globals[kPlayerPersona]) noPlayerFl = true; darkSceneFl = true; break; } if (noPlayerFl || _globals[kNoLoadWalker]) { _game._player._spritesPrefix = ""; } else if (!_game._player._forcePrefix) { if (!_globals[kPlayerPersona] || _scene->_nextSceneId == 108 || _scene->_nextSceneId == 109) { if (_scene->_nextSceneId == 113 || _scene->_nextSceneId == 114 || _scene->_nextSceneId == 115 || _scene->_nextSceneId == 116) _game._player._spritesPrefix = "PD"; else _game._player._spritesPrefix = "KG"; } else _game._player._spritesPrefix = "PD"; if (darkSceneFl) _game._player._spritesPrefix += "D"; } if (oldName != _game._player._spritesPrefix) _game._player._spritesChanged = true; _game._player._scalingVelocity = true; } /*------------------------------------------------------------------------*/ Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) { } void Scene101::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); } void Scene101::setup() { setPlayerSpritesPrefix(); setAAName(); } void Scene101::enter() { sceneEntrySound(); } void Scene101::step() { } void Scene101::actions() { if (_action.isObject(NOUN_BED)) { int sprIdx = _scene->_sprites.addSprites("*ob001i"); int seqIdx = _scene->_sequences.addStampCycle(sprIdx, false, 1); _scene->_sequences.setDepth(seqIdx, 0); _scene->_sequences.setPosition(seqIdx, Common::Point(10, 50)); _action._inProgress = false; } } void Scene101::preActions() { } /*------------------------------------------------------------------------*/ Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) { _diaryHotspotIdx1 = -1; _diaryHotspotIdx2 = -1; _diaryFrame = -1; _animRunning = -1; } void Scene102::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); s.syncAsSint16LE(_diaryHotspotIdx1); s.syncAsSint16LE(_diaryHotspotIdx2); s.syncAsSint16LE(_diaryFrame); s.syncAsSint16LE(_animRunning); } void Scene102::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_DIARIES); _scene->addActiveVocab(VERB_WALK_TO); } void Scene102::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6"); _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2)); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0); _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); if (_scene->_priorSceneId == 103) { _game._player._playerPos = Common::Point(170, 152); _game._player._facing = FACING_NORTHWEST; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); _game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false); _game._player.setWalkTrigger(70); } else { _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); } sceneEntrySound(); } void Scene102::step() { if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); switch (_diaryFrame) { case 6: _scene->deleteSequence(_globals._sequenceIndexes[1]); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_ANIM, _globals._animationIndexes[0]); break; case 10: _vm->_sound->command(65); break; case 26: _vm->_dialogs->show(10210); _vm->_dialogs->show(10211); _vm->_dialogs->show(10212); break; default: break; } } } if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) { if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) { _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); switch (_diaryFrame) { case 6: _scene->deleteSequence(_globals._sequenceIndexes[2]); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_ANIM, _globals._animationIndexes[0]); break; case 26: _vm->_dialogs->show(10213); _vm->_dialogs->show(10214); break; default: break; } } } if (_game._trigger >= 70) { switch (_game._trigger) { case 70: _scene->deleteSequence(_globals._sequenceIndexes[6]); _vm->_sound->command(25); _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 71: { int idx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); _game._player._stepEnabled = true; } break; default: break; } } } void Scene102::actions() { if (_action._lookFlag) { _vm->_dialogs->show(10201); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _scene->deleteSequence(_globals._sequenceIndexes[6]); _vm->_sound->command(24); _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int idx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); _game._player.walk(Common::Point(0, 130), FACING_WEST); _game._player._walkOffScreenSceneId = 101; break; default: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { _scene->_nextSceneId = 103; _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _animRunning = 1; _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1); _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); break; case 1: _globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12); _diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST); _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); _scene->_sequences.addTimer(6, 2); break; case 2: _game._player.walk(Common::Point(51, 121), FACING_NORTHWEST); _game._player.setWalkTrigger(3); break; case 3: _game._player._visible = false; _animRunning = 2; _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4); _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0); break; case 4: _globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12); _diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST); _game._player._visible = true; _game._player._stepEnabled = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); break; default: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_FIREPLACE)) { _vm->_dialogs->show(10202); _action._inProgress = false; return; } if (_action.isObject(NOUN_BED)) { _vm->_dialogs->show(10203); _action._inProgress = false; return; } if (_action.isObject(NOUN_SHUTTERS)) { _vm->_dialogs->show(10204); _action._inProgress = false; return; } if (_action.isObject(NOUN_RUG)) { _vm->_dialogs->show(10206); _action._inProgress = false; return; } if (_action.isObject(NOUN_BOOKCASE)) { _vm->_dialogs->show(10208); _action._inProgress = false; return; } if (_action.isObject(NOUN_DIARIES)) { _vm->_dialogs->show(10209); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { _vm->_dialogs->show(10215); _action._inProgress = false; return; } if (_action.isObject(NOUN_FLOWERS)) { _vm->_dialogs->show(10216); _action._inProgress = false; return; } if (_action.isObject(NOUN_WINDOW)) { _vm->_dialogs->show(10217); _action._inProgress = false; return; } if (_action.isObject(NOUN_WOOD_BASKET)) { _vm->_dialogs->show(10219); _action._inProgress = false; return; } if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { _vm->_dialogs->show(10220); _action._inProgress = false; return; } if (_action.isObject(NOUN_NIGHTSTAND)) { _vm->_dialogs->show(10222); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { _vm->_dialogs->show(10223); _action._inProgress = false; return; } if (_action.isObject(NOUN_CHEST)) { _vm->_dialogs->show(10224); _action._inProgress = false; return; } if (_action.isObject(NOUN_TAPESTRY)) { _vm->_dialogs->show(10226); _action._inProgress = false; return; } if (_action.isObject(NOUN_SCONCE)) { _vm->_dialogs->show(10227); _action._inProgress = false; return; } if (_action.isObject(NOUN_FLOOR)) { _vm->_dialogs->show(10228); _action._inProgress = false; return; } if (_action.isObject(NOUN_WALL)) { _vm->_dialogs->show(10229); _action._inProgress = false; return; } if (_action.isObject(NOUN_DECORATION)) { _vm->_dialogs->show(10230); _action._inProgress = false; return; } if (_action.isObject(NOUN_CEILING)) { _vm->_dialogs->show(10231); _action._inProgress = false; return; } } if (_action.isAction(VERB_OPEN, NOUN_CHEST)) { _vm->_dialogs->show(10224); _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) { _vm->_dialogs->show(10225); _action._inProgress = false; return; } if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) { _vm->_dialogs->show(10218); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { _vm->_dialogs->show(10221); _action._inProgress = false; return; } if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) { _vm->_dialogs->show(10205); _action._inProgress = false; return; } if (_action.isAction(VERB_PULL, NOUN_RUG)) { _vm->_dialogs->show(10207); _action._inProgress = false; return; } } void Scene102::preActions() { } /*------------------------------------------------------------------------*/ Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) { } void Scene103::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); } void Scene103::setup() { setPlayerSpritesPrefix(); setAAName(); } void Scene103::enter() { _vm->_disableFastwalk = true; _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2)); _globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7)); _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6)); _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9"); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 4); _globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 0); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 3); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 2); _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 0, 0); _globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 0, 5); if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId == 105)) { _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8); } if (_scene->_priorSceneId == 102) { _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); _scene->setCamera(Common::Point(320, 0)); _game._player.walk(Common::Point(482, 128), FACING_SOUTH); _game._player.firstWalk(Common::Point(471, 108), FACING_SOUTH, Common::Point(482, 128), FACING_SOUTH, false); _game._player.setWalkTrigger(72); } else if (_scene->_priorSceneId == 104) { _game._player._playerPos = Common::Point(130, 152); _game._player._facing = FACING_NORTHEAST; } else if (_scene->_priorSceneId == 105) { _game._player._playerPos = Common::Point(517, 152); _game._player._facing = FACING_NORTHWEST; _scene->setCamera(Common::Point(320, 0)); } else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) { _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); _game._player.firstWalk(Common::Point(173, 108), FACING_SOUTH, Common::Point(162, 127), FACING_SOUTH, false); _game._player.setWalkTrigger(70); } else { _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); } sceneEntrySound(); } void Scene103::step() { switch (_game._trigger) { case 70: _scene->deleteSequence(_globals._sequenceIndexes[9]); _vm->_sound->command(25); _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 3); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 71: { int tmpIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); _game._player._stepEnabled = true; } break; case 72: _scene->deleteSequence(_globals._sequenceIndexes[10]); _vm->_sound->command(25); _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 3); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 73); break; case 73: { int tmpIdx = _globals._sequenceIndexes[10]; _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); _game._player._stepEnabled = true; } break; default: break; } } void Scene103::actions() { if (_action._lookFlag) { _vm->_dialogs->show(10301); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _scene->deleteSequence(_globals._sequenceIndexes[9]); _vm->_sound->command(24); _globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int tmpIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]); _scene->_sequences.addTimer(1, 4); break; case 4: _game._player.walk(Common::Point(173, 108), FACING_NORTH); _game._player.setWalkTrigger(5); break; case 5: _scene->deleteSequence(_globals._sequenceIndexes[9]); _vm->_sound->command(25); _globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 6); break; case 6: { int tmpIdx = _globals._sequenceIndexes[9]; _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx); _scene->_sequences.addTimer(6, 7); } break; case 7: _scene->_nextSceneId = 101; break; default: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_QUEENS_ROOM)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _scene->deleteSequence(_globals._sequenceIndexes[10]); _vm->_sound->command(24); _globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int tmpIdx = _globals._sequenceIndexes[10]; _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]); _scene->_sequences.addTimer(1, 4); break; case 4: _game._player.walk(Common::Point(471, 108), FACING_NORTH); _game._player.setWalkTrigger(5); break; case 5: _scene->deleteSequence(_globals._sequenceIndexes[10]); _vm->_sound->command(25); _globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 6); break; case 6: { int tmpIdx = _globals._sequenceIndexes[10]; _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx); _scene->_sequences.addTimer(6, 7); } break; case 7: _scene->_nextSceneId = 102; break; default: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_MEETING_ROOM)) { _scene->_nextSceneId = 104; _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_BALLROOM)) { _scene->_nextSceneId = 105; _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_TAPESTRY)) { if ((_scene->_customDest.x <= 75) && (_scene->_customDest.y <= 130)) _vm->_dialogs->show(10302); else _vm->_dialogs->show(10303); _action._inProgress = false; return; } if (_action.isObject(NOUN_COAT_OF_ARMS)) { _vm->_dialogs->show(10305); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_QUEENS_ROOM)) { _vm->_dialogs->show(10307); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) { _vm->_dialogs->show(10308); _action._inProgress = false; return; } if (_action.isObject(NOUN_CEDAR_CHEST)) { _vm->_dialogs->show(10309); _action._inProgress = false; return; } if (_action.isObject(NOUN_TABLE)) { _vm->_dialogs->show(10311); _action._inProgress = false; return; } if (_action.isObject(NOUN_SMALL_WINDOW)) { _vm->_dialogs->show(10312); _action._inProgress = false; return; } if (_action.isObject(NOUN_LARGE_WINDOW)) { _vm->_dialogs->show(10314); _action._inProgress = false; return; } if (_action.isObject(NOUN_BATTLE_AXES)) { _vm->_dialogs->show(10315); _action._inProgress = false; return; } if (_action.isObject(NOUN_BUST_ON_WALL)) { _vm->_dialogs->show(10317); _action._inProgress = false; return; } if (_action.isObject(NOUN_DECORATION)) { _vm->_dialogs->show(10320); _action._inProgress = false; return; } if (_action.isObject(NOUN_WALL_PLAQUE)) { _vm->_dialogs->show(10322); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_BALLROOM)) { _vm->_dialogs->show(10323); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_MEETING_ROOM)) { _vm->_dialogs->show(10324); _action._inProgress = false; return; } } if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_BATTLE_AXES)) { _vm->_dialogs->show(10316); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) { _vm->_dialogs->show(10304); _action._inProgress = false; return; } if (_action.isAction(VERB_PULL, NOUN_COAT_OF_ARMS)) { _vm->_dialogs->show(10306); _action._inProgress = false; return; } if (_action.isAction(VERB_OPEN, NOUN_CEDAR_CHEST)) { _vm->_dialogs->show(10310); _action._inProgress = false; return; } if (_action.isAction(VERB_OPEN, NOUN_SMALL_WINDOW) || _action.isAction(VERB_OPEN, NOUN_LARGE_WINDOW)) { _vm->_dialogs->show(10313); _action._inProgress = false; return; } } void Scene103::preActions() { } /*------------------------------------------------------------------------*/ Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) { _anim0ActvFl = false; _anim1ActvFl = false; _anim2ActvFl = false; _anim3ActvFl = false; _anim4ActvFl = false; _anim5ActvFl = false; _activateTimerFl = false; _wasBearFl = false; _amuletWorksFl = false; _pidDrawnSword = false; _anim6ActvFl = false; _animationRunning = -1; _deathTimer = -1; _deathFrame = -1; _doorwayHotspotId = -1; _kingStatus = -1; _kingFrame = -1; _kingCount = -1; _macCount = -1; _macFrame = -1; _macStatus = -1; _queenStatus = -1; _queenFrame = -1; _queenCount = -1; _pidStatus = -1; _pidFrame = -1; _pidCount = -1; _twinklesFrame = -1; _twinklesStatus = -1; _twinklesCount = -1; _tapestryFrame = -1; _clock = -1; } void Scene104::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); s.syncAsByte(_anim0ActvFl); s.syncAsByte(_anim1ActvFl); s.syncAsByte(_anim2ActvFl); s.syncAsByte(_anim3ActvFl); s.syncAsByte(_anim4ActvFl); s.syncAsByte(_anim5ActvFl); s.syncAsByte(_activateTimerFl); s.syncAsByte(_wasBearFl); s.syncAsByte(_amuletWorksFl); s.syncAsByte(_pidDrawnSword); s.syncAsByte(_anim6ActvFl); s.syncAsSint16LE(_animationRunning); s.syncAsSint16LE(_deathTimer); s.syncAsSint16LE(_deathFrame); s.syncAsSint16LE(_doorwayHotspotId); s.syncAsSint16LE(_kingStatus); s.syncAsSint16LE(_kingFrame); s.syncAsSint16LE(_kingCount); s.syncAsSint16LE(_queenStatus); s.syncAsSint16LE(_queenFrame); s.syncAsSint16LE(_queenCount); s.syncAsSint16LE(_macStatus); s.syncAsSint16LE(_macFrame); s.syncAsSint16LE(_macCount); s.syncAsSint16LE(_pidStatus); s.syncAsSint16LE(_pidFrame); s.syncAsSint16LE(_pidCount); s.syncAsSint16LE(_twinklesStatus); s.syncAsSint16LE(_twinklesFrame); s.syncAsSint16LE(_twinklesCount); s.syncAsSint16LE(_tapestryFrame); s.syncAsSint32LE(_clock); } void Scene104::setup() { if (_scene->_currentSceneId == 119) _globals[kNoLoadWalker] = true; setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_DOORWAY); _scene->addActiveVocab(NOUN_QUEEN_MOTHER); _scene->addActiveVocab(NOUN_KING); } void Scene104::enter() { _vm->_gameConv->load(1); if (_globals[kPlayerPersona] == 1) { _scene->_sprites.addSprites(formAnimName('e', 8)); _scene->_sprites.addSprites(formAnimName('b', 5)); } _scene->_hotspots.activate(NOUN_MACMORN, false); if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { _animationRunning = 0; _anim0ActvFl = false; _anim1ActvFl = false; _anim2ActvFl = false; _anim3ActvFl = false; _anim4ActvFl = false; _anim5ActvFl = false; _kingCount = 0; _macCount = 0; _queenCount = 0; _twinklesCount = 0; _deathTimer = 0; _clock = 0; _activateTimerFl = false; _wasBearFl = false; _amuletWorksFl = false; _pidDrawnSword = false; } _anim6ActvFl = false; _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3)); _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5)); _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4)); if (_globals[kNoLoadWalker]) { _scene->drawToBackground(_globals._spriteIndexes[6], 5, Common::Point(-32000, -32000), 0, 100); _scene->_sprites.remove(_globals._spriteIndexes[6]); } if (_globals[kPlayerPersona] == 0) { _scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(139, 132)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8"); _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8"); _globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5)); _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4)); _globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1)); if (_globals[kTapestryStatus] == 0 || _globals[kTapestryStatus] == 2) { _scene->_hotspots.activate(NOUN_WALL_PANEL, false); _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6); } else { _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); } if (_globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) { if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); } else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) { _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) { _scene->_hotspots.activate(NOUN_WALL_PANEL, false); _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); } } } else { _globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5)); _scene->_sprites.addSprites(formAnimName('b', 0)); _globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3)); _scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(140, 107)); _scene->_hotspots.activateAtPos(NOUN_TABLE, true, Common::Point(139, 132)); _globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4)); if (_globals[kNoLoadWalker]) { _scene->drawToBackground(_globals._spriteIndexes[10], 1, Common::Point(-32000, -32000), 0, 100); _scene->_sprites.remove(_globals._spriteIndexes[10]); } _globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3)); _globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8); _doorwayHotspotId = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, SYNTAX_SINGULAR, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots.setPosition(_doorwayHotspotId, Common::Point(295, 145), FACING_NORTHEAST); _globals[kBooksStatus] = 0; _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); } if (_globals[kBooksStatus] == 0) _scene->_hotspots.activate(NOUN_BOOKS, false); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 5); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3); _globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0); if (_globals[kPlayerPersona] == 0) { _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); } if (_scene->_priorSceneId == 106) { _game._player._playerPos = Common::Point(201, 152); _game._player._facing = FACING_NORTHWEST; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); } else if ((_scene->_priorSceneId == 119) || (_scene->_priorSceneId == 104)) { _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4); _scene->_sequences.addTimer(60, 77); _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0); _anim0ActvFl = true; _kingStatus = 2; _scene->setAnimFrame(_globals._animationIndexes[0], 22); _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0); _anim2ActvFl = true; _queenStatus = 0; _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6); _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 79); int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; _scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0); _scene->_hotspots.activate(NOUN_MACMORN, true); idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); _game._player.firstWalk(Common::Point(77, 93), FACING_SOUTH, Common::Point(74, 107), FACING_SOUTH, false); _game._player.setWalkTrigger(70); } else if (_globals[kNoLoadWalker]) { _game._player._visible = false; _game._player._stepEnabled = false; _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0); _anim0ActvFl = true; _kingStatus = 0; _scene->setAnimFrame(_globals._animationIndexes[0], 14); _globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0); _anim2ActvFl = true; _queenStatus = 0; _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0); _anim4ActvFl = true; _pidStatus = 0; if (_amuletWorksFl) _scene->setAnimFrame(_globals._animationIndexes[4], 89); _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0); _anim1ActvFl = true; _macStatus = 0; _scene->setAnimFrame(_globals._animationIndexes[1], 25); int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; _scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0); _scene->_hotspots.activate(NOUN_MACMORN, true); idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0)); _scene->_dynamicHotspots[idx]._articleNumber = PREP_ON; _scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0); if (_vm->_gameConv->restoreRunning() == 1) { _game._player._stepEnabled = false; _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); } else { _activateTimerFl = true; _deathTimer = 0; _clock = 0; _game._player._stepEnabled = true; } } else { _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 12); } sceneEntrySound(); } void Scene104::step() { if (_anim0ActvFl) handleKingAnimation(); if (_anim1ActvFl) handleMacAnimation1(); if (_anim2ActvFl) handleQueenAnimation(); if (_anim3ActvFl) handleTwinklesAnimation(); if (_anim4ActvFl) handlePidAnimation(); if (_anim5ActvFl) handleMacAnimation2(); if (_anim6ActvFl) handleDeathAnimation(); if ((_animationRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) { if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _tapestryFrame) { _tapestryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); if (_tapestryFrame == 13) { _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); } } } switch (_game._trigger) { case 70: _scene->deleteSequence(_globals._sequenceIndexes[6]); _vm->_sound->command(25); _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 71: { int idx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx); _game._player._stepEnabled = true; } break; } if (_game._trigger == 77) _kingStatus = 0; if (_game._trigger == 79) { _scene->freeAnimation(_globals._animationIndexes[4]); _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0); _anim4ActvFl = true; _pidStatus = 0; _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0); _scene->deleteSequence(_globals._sequenceIndexes[14]); _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0); _anim1ActvFl = true; _macStatus = 0; _game._player._stepEnabled = false; _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); } if (_game._trigger == 85) { _vm->_sound->command(100); _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); } if (_activateTimerFl) { long clockDiff = _scene->_frameStartTime - _clock; if ((clockDiff >= 0) && (clockDiff <= 4)) _deathTimer += clockDiff; else _deathTimer += 1; _clock = _scene->_frameStartTime; if (_deathTimer >= 1300) { _activateTimerFl = false; if (_pidDrawnSword) { _pidStatus = 6; _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(1); _vm->_gameConv->exportValue(0); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); _vm->_gameConv->hold(); } else _pidStatus = 8; _game._player._stepEnabled = false; } } if ((_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) && (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4)) _globals[kCanViewCrownHole] = true; if (_game._trigger == 95) { _vm->_gameConv->reset(1); _vm->_dialogs->show(10466); _globals[kNoLoadWalker] = false; _scene->_nextSceneId = 119; } } void Scene104::actions() { if (_vm->_gameConv->activeConvId() == 1) { handleFinalConversation(); _action._inProgress = false; return; } if (_action._lookFlag) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10401); else _vm->_dialogs->show(10437); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) { if (_globals[kPlayerPersona] == 0) _scene->_nextSceneId = 106; else _vm->_dialogs->show(10434); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { if (_globals[kPlayerPersona] == 0) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 8, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _scene->deleteSequence(_globals._sequenceIndexes[6]); _vm->_sound->command(24); _globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int tmpIdx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); _scene->_sequences.addTimer(1, 4); break; case 4: _game._player.walk(Common::Point(77, 93), FACING_NORTH); _game._player.setWalkTrigger(5); break; case 5: _scene->deleteSequence(_globals._sequenceIndexes[6]); _vm->_sound->command(25); _globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 6); break; case 6: { int tmpIdx = _globals._sequenceIndexes[6]; _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx); _scene->_sequences.addTimer(6, 7); } break; case 7: _scene->_nextSceneId = 103; break; default: break; } } else _vm->_dialogs->show(10434); _action._inProgress = false; return; } if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE) || _action.isAction(VERB_OPEN)) && _action.isObject(NOUN_BOOKS)) { if ((_globals[kBooksStatus] == 1) || (_globals[kBooksStatus] == 3) || _game._trigger) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int tmpIdx = _globals._sequenceIndexes[12]; _globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, tmpIdx); _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) { _scene->_hotspots.activate(NOUN_WALL_PANEL, false); _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); } } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); _scene->_sequences.addTimer(5, 4); break; case 4: if (_globals[kBooksStatus] == 1) { _globals[kPlayerScore] += 2; _globals[kBooksStatus] = 2; if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) _vm->_dialogs->show(10428); else { _vm->_sound->command(94); _vm->_sound->command(67); _vm->_dialogs->show(10427); } } else { _vm->_sound->command(94); _vm->_sound->command(67); _globals[kBooksStatus] = 4; } _game._player._stepEnabled = true; break; default: break; } _action._inProgress = false; return; } } if (_action.isAction(VERB_PUSH, NOUN_BOOKS)) { if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _vm->_sound->command(94); _vm->_sound->command(67); _scene->deleteSequence(_globals._sequenceIndexes[12]); _globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8); _scene->_sequences.addTimer(6, 2); break; case 2: if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) { _scene->_hotspots.activate(NOUN_WALL_PANEL, true); _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); _scene->_sequences.addTimer(5, 4); break; case 4: if (_globals[kBooksStatus] == 2) _vm->_dialogs->show(10429); _globals[kBooksStatus] = 3; _game._player._stepEnabled = true; break; default: break; } _action._inProgress = false; return; } } if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) { if (_globals[kPlayerPersona] == 0) { if (_scene->_customDest.x >= 279) { if ((_globals[kTapestryStatus] == 0) || (_globals[kTapestryStatus] == 2)) { switch (_game._trigger) { case 0: _scene->deleteSequence(_globals._sequenceIndexes[11]); _game._player._stepEnabled = false; _game._player._visible = false; _animationRunning = 1; _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', -1), 1); break; case 1: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); _globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6); _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(290, 20)); _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70)); if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) { _scene->_hotspots.activate(NOUN_WALL_PANEL, false); _scene->_hotspots.activate(NOUN_SECRET_DOOR, true); } else { _scene->_hotspots.activate(NOUN_WALL_PANEL, true); _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); } _scene->_sequences.addTimer(6, 2); break; case 2: if (_globals[kTapestryStatus] == 0) { _globals[kTapestryStatus] = 1; _globals[kPlayerScore] += 2; if (_globals[kBooksStatus] == 0 || _globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) _vm->_dialogs->show(10424); else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) _vm->_dialogs->show(10425); } else _globals[kTapestryStatus] = 3; _game._player._stepEnabled = true; break; default: break; } } } else _vm->_dialogs->show(10404); } else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) { if (_globals[kPlayerPersona] == 0) { if (_scene->_customDest.x >= 279) { if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _scene->deleteSequence(_globals._sequenceIndexes[10]); _animationRunning = 2; _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', -1), 1); break; case 1: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]); _globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6); _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(290, 20)); _scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(310, 70)); _scene->_hotspots.activate(NOUN_SECRET_DOOR, false); _scene->_hotspots.activate(NOUN_WALL_PANEL, false); _scene->_sequences.addTimer(6, 2); break; case 2: _globals[kTapestryStatus] = 2; _game._player._stepEnabled = true; break; default: break; } _action._inProgress = false; return; } } } else { _vm->_dialogs->show(10445); _action._inProgress = false; return; } } if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_BOOKS) || _action.isObject(NOUN_BOOKSHELF)) { if (_globals[kPlayerPersona] == 0) { switch (_globals[kBooksStatus]) { case 0: _scene->_hotspots.activate(NOUN_BOOKS, true); _globals[kBooksStatus] = 1; _vm->_dialogs->show(10418); _action._inProgress = false; return; case 1: _vm->_dialogs->show(10418); _action._inProgress = false; return; case 2: case 4: _vm->_dialogs->show(10419); _action._inProgress = false; return; case 3: _vm->_dialogs->show(10420); _action._inProgress = false; return; default: break; } } else { _vm->_dialogs->show(10439); _action._inProgress = false; return; } } if (_action.isObject(NOUN_FIREPLACE)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10402); else _vm->_dialogs->show(10438); _action._inProgress = false; return; } if (_action.isObject(NOUN_TAPESTRY)) { if (_globals[kPlayerPersona] == 0) { if (_scene->_customDest.x >= 209 && _scene->_customDest.x <= 278) _vm->_dialogs->show(10403); else if (_scene->_customDest.x >= 107 && _scene->_customDest.x <= 190) _vm->_dialogs->show(10422); else if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) _vm->_dialogs->show(10460); else _vm->_dialogs->show(10423); } else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_RUG)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10405); else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_FIREPLACE_SCREEN)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10407); else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10409); else _vm->_dialogs->show(10434); _action._inProgress = false; return; } if (_action.isObject(NOUN_SCONCE)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10410); else _vm->_dialogs->show(10440); _action._inProgress = false; return; } if (_action.isObject(NOUN_WOOD_BASKET)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10411); else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_TROPHY)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10412); else _vm->_dialogs->show(10441); _action._inProgress = false; return; } if (_action.isObject(NOUN_READING_BENCH)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10414); else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_LOVESEAT)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10416); else _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10421); else _vm->_dialogs->show(10434); _action._inProgress = false; return; } if (_action.isObject(NOUN_SECRET_DOOR)) { _vm->_dialogs->show(10430); _action._inProgress = false; return; } if ((_action.isObject(NOUN_DOORWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_OPEN, NOUN_DOORWAY)) && (_globals[kPlayerPersona] == 1)) { _vm->_dialogs->show(10432); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK, NOUN_WALL_PANEL)) { if ((_globals[kBooksStatus] == 0) || (_globals[kBooksStatus] == 1)) _vm->_dialogs->show(10435); else _vm->_dialogs->show(10436); _action._inProgress = false; return; } if (_action.isObject(NOUN_KING) && _globals[kPlayerPersona] == 1) { _vm->_dialogs->show(10443); _action._inProgress = false; return; } if (_action.isObject(NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) { _vm->_dialogs->showItem(OBJ_MAGIC_MUSIC_BOX, 843, 0); _action._inProgress = false; return; } if (_action.isObject(NOUN_MACMORN) && (_globals[kPlayerPersona] == 1)) { _vm->_dialogs->show(10444); _action._inProgress = false; return; } if (_action.isObject(NOUN_TABLE)) { if (_globals[kPlayerPersona] == 1) _vm->_dialogs->show(10455); else if (_scene->_customDest.x < 174) _vm->_dialogs->show(10451); else _vm->_dialogs->show(10448); _action._inProgress = false; return; } if (_action.isObject(NOUN_DECORATION)) { if (_globals[kPlayerPersona] == 1) _vm->_dialogs->show(10439); else _vm->_dialogs->show(10449); _action._inProgress = false; return; } if (_action.isObject(NOUN_SWORD)) { if (_globals[kPlayerPersona] == 1) _vm->_dialogs->show(10439); else _vm->_dialogs->show(10450); _action._inProgress = false; return; } if (_action.isObject(NOUN_FLOOR) && (_globals[kPlayerPersona] == 1)) { _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_WALL) && (_globals[kPlayerPersona] == 1)) { _vm->_dialogs->show(10439); _action._inProgress = false; return; } if (_action.isObject(NOUN_CANDLESTICK)) { if (_globals[kPlayerPersona] == 1) _vm->_dialogs->show(10439); else _vm->_dialogs->show(10461); _action._inProgress = false; return; } if (_action.isObject(NOUN_QUEEN_MOTHER)) { _vm->_dialogs->show(10456); _action._inProgress = false; return; } if (_action.isObject(NOUN_MACMORN)) { _vm->_dialogs->show(10444); _action._inProgress = false; return; } } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_RUG)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10406); else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10408); else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TROPHY)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10413); else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if (_action.isAction(VERB_OPEN, NOUN_READING_BENCH)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10415); else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_LOVESEAT)) { if (_globals[kPlayerPersona] == 0) _vm->_dialogs->show(10417); else _vm->_dialogs->show(10445); _action._inProgress = false; return; } if ((_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_SECRET_DOOR) || _action.isObject(NOUN_WALL_PANEL))) { _vm->_dialogs->show(10431); _action._inProgress = false; return; } if (_action.isAction(VERB_INVOKE, NOUN_SIGNET_RING) && (_globals[kPlayerPersona] == 1)) { _vm->_dialogs->show(10433); _action._inProgress = false; return; } if (_action.isAction(VERB_PUT, NOUN_TENTACLE_PARTS, NOUN_WALL_PANEL) && (_globals[kPlayerPersona] == 0)) { _vm->_dialogs->show(10446); _action._inProgress = false; return; } if (_action.isAction(VERB_SHIFT_INTO_BEAR) && _anim0ActvFl) { if (_wasBearFl) _vm->_dialogs->show(10457); else if (_amuletWorksFl) _vm->_dialogs->show(10459); else { _wasBearFl = true; _globals[kPlayerScore] += 2; _vm->_gameConv->run(1); _vm->_gameConv->exportValue(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); } _action._inProgress = false; return; } if ((_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_TAKE, NOUN_SWORD)) && _anim0ActvFl) { _activateTimerFl = false; _pidStatus = 6; if (!_amuletWorksFl) { _globals[kPlayerScore] += 5; _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(1); _vm->_gameConv->exportValue(0); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); _vm->_gameConv->hold(); } else { _macStatus = 6; _game._player._stepEnabled = false; } _amuletWorksFl = true; _action._inProgress = false; return; } if (_action.isAction(VERB_INVOKE, NOUN_AMULET) && _anim0ActvFl) { if (_amuletWorksFl) { _activateTimerFl = false; _pidStatus = 5; _globals[kPlayerScore] += 15; _globals[kAmuletStatus] = 2; _game._player._stepEnabled = false; _scene->freeAnimation(_globals._animationIndexes[1]); _globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_CLOCK, 0); _globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST); _globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0); _anim1ActvFl = false; _anim5ActvFl = true; } else _vm->_dialogs->showItem(OBJ_AMULET, 945, 0); _action._inProgress = false; return; } if (_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_QUEEN_MOTHER)) { _vm->_dialogs->show(10458); _action._inProgress = false; return; } if (_action.isAction(VERB_TALK_TO, NOUN_MACMORN)) { _vm->_dialogs->show(10464); _action._inProgress = false; return; } if (_action.isAction(VERB_TALK_TO, NOUN_QUEEN_MOTHER)) { _vm->_dialogs->show(10463); _action._inProgress = false; return; } if (_action.isAction(VERB_TALK_TO, NOUN_KING)) { _vm->_dialogs->show(10465); _action._inProgress = false; return; } if (_action.isAction(VERB_POUR_CONTENTS_OF, NOUN_MACMORN)) { _vm->_dialogs->show(10462); _action._inProgress = false; return; } if (_anim2ActvFl && (_action.isAction(VERB_WALK_ACROSS) || _action.isAction(VERB_WALK_TO))) { _vm->_dialogs->show(10445); _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_CANDLESTICK)) { _vm->_dialogs->show(10468); _action._inProgress = false; return; } if (_action.isAction(VERB_OPEN, NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) { _vm->_dialogs->show(10470); _action._inProgress = false; return; } } void Scene104::preActions() { if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY) && (_scene->_customDest.x > 280)) _game._player.walk(Common::Point(295, 145), FACING_NORTHEAST); if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) || ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_RUG) || _action.isObject(NOUN_FIREPLACE_SCREEN) || _action.isObject(NOUN_TROPHY) || _action.isObject(NOUN_LOVESEAT))) || _action.isAction(VERB_OPEN, NOUN_READING_BENCH)) { if (_globals[kPlayerPersona] == 1) _game._player.cancelWalk(); } if (_globals[kNoLoadWalker]) _game._player._needToWalk = false; } void Scene104::handleFinalConversation() { bool interlocutorFl = false; bool heroFl = false; switch (_action._activeAction._verbId) { case 11: _deathTimer = 0; _clock = 0; _activateTimerFl = true; interlocutorFl = true; heroFl = true; break; case 14: if (!_game._trigger) _macStatus = 3; interlocutorFl = true; heroFl = true; break; case 17: _pidStatus = 3; _vm->_gameConv->hold(); interlocutorFl = true; heroFl = true; break; case 20: if (!_game._trigger) _macStatus = 2; interlocutorFl = true; heroFl = true; break; case 30: _vm->_gameConv->setStartNode(31); _vm->_gameConv->stop(); if (_globals[kLlanieStatus] == 2) { _globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('l', 1), 0); _anim3ActvFl = true; _twinklesStatus = 1; } break; case 38: _globals[kEndOfGame] = true; _scene->_nextSceneId = 106; break; default: break; } switch (_game._trigger) { case 81: switch (_action._activeAction._verbId) { case 0: case 2: case 4: case 5: case 7: case 8: case 11: case 17: if (_macStatus == 0) _macStatus = 1; _pidStatus = 0; if (_queenStatus != 2) _queenStatus = 0; _kingStatus = 0; break; case 1: case 3: case 6: case 20: case 22: case 24: case 26: case 28: case 32: case 34: case 39: case 41: case 43: _kingStatus = 1; _pidStatus = 0; if (_queenStatus != 2) _queenStatus = 0; if (_macStatus == 1) _macStatus = 0; break; case 21: case 23: case 25: case 27: case 35: case 40: case 42: if (_queenStatus != 2) _queenStatus = 1; _pidStatus = 0; if (_macStatus == 1) _macStatus = 0; _kingStatus = 0; break; case 31: case 33: _twinklesStatus = 1; _pidStatus = 0; if (_queenStatus != 2) _queenStatus = 0; if (_macStatus == 1) _macStatus = 0; _kingStatus = 0; break; default: break; } break; case 83: if ((_action._activeAction._verbId == 8) || (_action._activeAction._verbId == 11)) _pidStatus = 2; else _pidStatus = 1; if (_macStatus == 1) _macStatus = 0; if (_queenStatus != 2) _queenStatus = 0; _kingStatus = 0; break; default: break; } if (!heroFl) _vm->_gameConv->setHeroTrigger(83); if (!interlocutorFl) _vm->_gameConv->setInterlocutorTrigger(81); _kingCount = 0; _queenCount = 0; _macCount = 0; _twinklesCount = 0; _pidCount = 0; } void Scene104::handleKingAnimation() { if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _kingFrame) return; _kingFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); int resetFrame = -1; switch (_kingFrame) { case 14: case 21: switch (_kingStatus) { case 0: if (_kingCount > _vm->getRandomNumber(40, 50)) { _kingCount = 0; if (_vm->getRandomNumber(1,2) == 1) resetFrame = 13; else resetFrame = 14; } else { ++_kingCount; resetFrame = 13; } break; case 1: resetFrame = 14; break; default: break; } break; case 16: case 17: case 18: case 19: switch (_kingStatus) { case 0: if (_kingCount > _vm->getRandomNumber(40, 50)) { _kingCount = 0; if (_vm->getRandomNumber(1,2) == 1) resetFrame = 15; else resetFrame = 19; } else { ++_kingCount; resetFrame = 15; } break; case 1: resetFrame = _vm->getRandomNumber(16, 18); ++_kingCount; if (_kingCount > 15) { _kingStatus = 0; _kingCount = 0; resetFrame = 15; } break; default: break; } break; case 22: if (_kingStatus == 2) resetFrame = 21; else resetFrame = 0; break; default: break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); _kingFrame = resetFrame; } } void Scene104::handleMacAnimation1() { if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame) return; _macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); int resetFrame = -1; switch (_macFrame) { case 1: case 2: case 7: switch (_macStatus) { case 0: resetFrame = 0; break; case 1: if (_macCount == 0) { if (_vm->getRandomNumber(1,2) == 1) resetFrame = 2; else resetFrame = 1; ++_macCount; } else { resetFrame = _vm->getRandomNumber(0, 1); ++_macCount; if (_macCount > 15) { _macStatus = 0; _macCount = 0; resetFrame = 0; } } break; case 2: resetFrame = 90; break; default: break; } break; case 3: case 4: case 5: switch (_macStatus) { case 0: case 2: case 3: case 4: resetFrame = 5; break; case 1: if (_macCount == 0) { if (_vm->getRandomNumber(1,2) == 1) resetFrame = 5; else resetFrame = 3; ++_macCount; } else { resetFrame = _vm->getRandomNumber(3, 4); ++_macCount; if (_macCount > 15) { _macStatus = 0; _macCount = 0; resetFrame = 5; } } break; default: break; } break; case 25: _game._player._stepEnabled = true; break; case 26: case 90: case 174: switch (_macStatus) { case 3: resetFrame = 76; _macStatus = 0; _game._player._stepEnabled = false; break; case 4: break; case 5: resetFrame = 147; _macStatus = 0; break; case 6: _pidFrame = 105; resetFrame = 26; _scene->setAnimFrame(_globals._animationIndexes[4], 105); _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]); break; default: resetFrame = 25; break; } break; case 36: _globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[13], 13); break; case 37: _scene->setAnimFrame(_globals._animationIndexes[4], 89); _pidFrame = 89; _pidStatus = 7; _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]); break; case 76: _vm->_gameConv->reset(1); _vm->_dialogs->show(10467); _globals[kNoLoadWalker] = false; _scene->_nextSceneId = 119; break; case 82: _pidStatus = 4; break; case 97: _activateTimerFl = true; _scene->deleteSequence(_globals._sequenceIndexes[5]); _globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 85); break; case 112: resetFrame = 8; _macStatus = 0; break; case 162: _vm->_gameConv->release(); break; default: break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); _macFrame = resetFrame; } } void Scene104::handleMacAnimation2() { if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame) return; _macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame(); int resetFrame = -1; switch (_macFrame) { case 1: if (_macStatus != 4) resetFrame = 0; break; case 2: _scene->deleteSequence(_globals._sequenceIndexes[14]); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_ANIM, _globals._animationIndexes[1]); break; case 37: _scene->freeAnimation(_globals._animationIndexes[1]); _scene->_sprites.remove(_globals._spriteIndexes[15]); _anim5ActvFl = false; resetFrame = -1; _vm->_dialogs->show(10426); _vm->_sound->command(45); _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(1); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); break; default: break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[1], resetFrame); _macFrame = resetFrame; } } void Scene104::handleQueenAnimation() { if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _queenFrame) return; _queenFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame(); int resetFrame = -1; switch (_queenFrame) { case 1: case 8: case 15: case 24: switch (_queenStatus) { case 0: if (_queenCount > _vm->getRandomNumber(40, 50)) { _queenCount = 0; if (_vm->getRandomNumber(1,2) == 1) resetFrame = 0; else resetFrame = 8; } else { ++_queenCount; resetFrame = 0; } break; case 1: if (_vm->getRandomNumber(1,2) == 1) resetFrame = 1; else resetFrame = 15; _queenStatus = 0; break; case 2: resetFrame = 8; break; default: break; } break; case 12: case 29: switch (_queenStatus) { case 0: if (_queenCount > _vm->getRandomNumber(40, 50)) { _queenCount = 0; if (_vm->getRandomNumber(1,2) == 1) resetFrame = 11; else resetFrame = 12; } else { ++_queenCount; resetFrame = 11; } break; case 1: resetFrame = 12; break; case 2: resetFrame = 24; break; default: break; } break; case 27: switch (_queenStatus) { case 0: case 1: resetFrame = 27; break; case 2: resetFrame = 26; break; case 3: resetFrame = 27; _queenStatus = 0; break; default: break; } break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[2], resetFrame); _queenFrame = resetFrame; } } void Scene104::handleTwinklesAnimation() { if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _twinklesFrame) return; _twinklesFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame(); int resetFrame = -1; switch (_twinklesFrame) { case 1: if (_twinklesStatus == 2) resetFrame = 0; break; case 10: _queenStatus = 2; break; case 28: _vm->_gameConv->run(1); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(0); _vm->_gameConv->exportValue(1); if (_globals[kLlanieStatus] != 2) _vm->_gameConv->exportValue(1); else _vm->_gameConv->exportValue(0); break; case 36: _queenStatus = 3; break; case 37: case 38: case 47: switch (_twinklesStatus) { case 0: if (_twinklesFrame != 37 && _twinklesFrame != 38) _twinklesFrame = 38; if (_twinklesCount > _vm->getRandomNumber(40, 50)) { _twinklesCount = 0; if (_vm->getRandomNumber(1, 2) == 1) resetFrame = 36; else resetFrame = 37; } else { ++_twinklesCount; resetFrame = _twinklesFrame - 1; } break; case 1: resetFrame = 38; _twinklesStatus = 0; break; default: break; } break; default: break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[3], resetFrame); _twinklesFrame = resetFrame; } } void Scene104::handleDeathAnimation() { if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _deathFrame) return; _deathFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame(); if (_deathFrame == 11) _scene->playSpeech(7); else if (_deathFrame == 17) _scene->playSpeech(6); } void Scene104::handlePidAnimation() { if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _pidFrame) return; _pidFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame(); int resetFrame = -1; switch (_pidFrame) { case 1: case 2: case 3: case 9: case 47: case 81: switch (_pidStatus) { case 0: resetFrame = 0; break; case 1: resetFrame = _vm->getRandomNumber(0, 2); ++_pidCount; if (_pidCount > 20) { _pidStatus = 0; _pidCount = 0; resetFrame = 0; } break; case 2: resetFrame = 3; break; case 3: _activateTimerFl = false; resetFrame = 10; break; case 5: _game._player._stepEnabled = false; _activateTimerFl = false; resetFrame = 47; _pidStatus = 0; break; case 6: resetFrame = 81; break; case 8: _scene->freeAnimation(_globals._animationIndexes[1]); _scene->freeAnimation(_globals._animationIndexes[4]); _anim1ActvFl = false; _anim4ActvFl = false; _globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('d', 2), 95); _anim6ActvFl = true; _game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0); break; default: break; } break; case 4: case 5: case 6: case 7: if (_pidStatus == 2) { resetFrame = _vm->getRandomNumber(4, 6); ++_pidCount; if (_pidCount > 20) { _pidStatus = 0; _pidCount = 0; resetFrame = 7; } } else resetFrame = 7; break; case 24: _vm->_gameConv->release(); break; case 25: if (_pidStatus == 4) { resetFrame = 25; _pidStatus = 0; } else resetFrame = 24; break; case 46: _activateTimerFl = true; _clock = 0; _deathTimer = 0; _game._player._stepEnabled = true; break; case 60: resetFrame = 107; break; case 62: _macStatus = 4; break; case 88: if (_deathTimer < 1300) _macStatus = 5; break; case 89: if (_pidStatus == 5) { resetFrame = 55; _pidStatus = 0; } else if (_deathTimer >= 1300) _macStatus = 6; else { _pidDrawnSword = true; resetFrame = 88; } break; case 91: _scene->playSpeech(7); break; case 95: _scene->playSpeech(6); break; case 105: resetFrame = 104; break; case 106: if (_pidStatus == 7) resetFrame = 89; else resetFrame = 105; break; case 111: resetFrame = 60; break; default: break; } if (resetFrame >= 0) { _scene->setAnimFrame(_globals._animationIndexes[4], resetFrame); _pidFrame = resetFrame; } } /*------------------------------------------------------------------------*/ Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) { _maidTalkingFl = false; _sitUpFl = false; _goodNumberFl = false; _maidFrame = -1; _newStatus = -1; _previousStatus = -1; _maidHotspotId1 = -1; _maidHotspotId2 = -1; _bucketHotspotId = -1; _boneHotspotId = -1; _gobletHotspotId = -1; } void Scene105::synchronize(Common::Serializer &s) { Scene1xx::synchronize(s); s.syncAsByte(_maidTalkingFl); s.syncAsByte(_sitUpFl); s.syncAsByte(_goodNumberFl); s.syncAsSint16LE(_maidFrame); s.syncAsSint16LE(_newStatus); s.syncAsSint16LE(_previousStatus); s.syncAsSint16LE(_maidHotspotId1); s.syncAsSint16LE(_maidHotspotId2); s.syncAsSint16LE(_bucketHotspotId); s.syncAsSint16LE(_boneHotspotId); s.syncAsSint16LE(_gobletHotspotId); } void Scene105::setup() { setPlayerSpritesPrefix(); setAAName(); _scene->addActiveVocab(NOUN_SCULLERY_MAID); _scene->addActiveVocab(NOUN_BUCKET); _scene->addActiveVocab(VERB_WALK_TO); _scene->addActiveVocab(NOUN_BONE); _scene->addActiveVocab(NOUN_GOBLET); } void Scene105::enter() { _globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0)); _globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1)); _globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2)); _globals._spriteIndexes[4] = _scene->_sprites.addSprites("*KGRD_8"); _globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0); _globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 3); _maidHotspotId1 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 123, 189 + 25, 123 + 11)); _scene->_dynamicHotspots.setPosition(_maidHotspotId1, Common::Point(174, 151), FACING_NORTHEAST); _scene->_dynamicHotspots[_maidHotspotId1]._articleNumber = PREP_ON; _maidHotspotId2 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 134, 189 + 38, 134 + 9)); _scene->_dynamicHotspots.setPosition(_maidHotspotId2, Common::Point(174, 151), FACING_NORTHEAST); _scene->_dynamicHotspots[_maidHotspotId2]._articleNumber = PREP_ON; _bucketHotspotId = _scene->_dynamicHotspots.add(NOUN_BUCKET, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(176, 137, 176 + 10, 137 + 8)); _scene->_dynamicHotspots.setPosition(_bucketHotspotId, Common::Point(174, 151), FACING_NORTHEAST); if (_game._objects.isInRoom(OBJ_GOBLET)) { _globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 1)); _globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM_6"); _globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1); _gobletHotspotId = _scene->_dynamicHotspots.add(NOUN_GOBLET, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0)); _scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6); _scene->_dynamicHotspots.setPosition(_gobletHotspotId, Common::Point(63, 142), FACING_WEST); } if (_game._objects.isInRoom(OBJ_BONE)) { _globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', 0)); _globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRL_6"); _globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1); _boneHotspotId = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0)); _scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6); _scene->_dynamicHotspots.setPosition(_boneHotspotId, Common::Point(255, 145), FACING_EAST); } _vm->_gameConv->load(2); _newStatus = 1; _previousStatus = 0; _maidTalkingFl = false; _sitUpFl = false; _goodNumberFl = false; _globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 1); if (_scene->_priorSceneId == 106) { _game._player._playerPos = Common::Point(104, 152); _game._player._facing = FACING_NORTHEAST; _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); } else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) { _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 6); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); _game._player.firstWalk(Common::Point(120, 96), FACING_SOUTH, Common::Point(117, 108), FACING_SOUTH, false); _game._player.setWalkTrigger(70); } else { _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); } sceneEntrySound(); } void Scene105::step() { if (_scene->_animation[_globals._animationIndexes[0]]) { if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _maidFrame) { _maidFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame(); int resetFrame = -1; if (_sitUpFl && !_maidTalkingFl) { _previousStatus = _newStatus; _newStatus = 4; } if (_maidTalkingFl) { _previousStatus = _newStatus; _newStatus = 5; } switch (_maidFrame) { case 16: if (_newStatus == 1) { _goodNumberFl = false; while (!_goodNumberFl) setRandomStatus(); } if (_newStatus == 1) resetFrame = 1; else if ((_newStatus == 3 && !_sitUpFl) || _newStatus == 4) resetFrame = 53; else if ((_newStatus == 3) && (_sitUpFl)) resetFrame = 24; break; case 24: if (_newStatus == 2) { _goodNumberFl = false; while (!_goodNumberFl) setRandomStatus(); } if ((_newStatus == 3) || (_newStatus == 5)) resetFrame = 53; else if (_newStatus == 1) resetFrame = 56; else if (_newStatus == 4) resetFrame = 53; break; case 32: if (_newStatus == 3) { _goodNumberFl = false; while (!_goodNumberFl) setRandomStatus(); } if ((_newStatus == 1) || (_newStatus == 2)) resetFrame = 57; else if (_newStatus == 4) resetFrame = 55; break; case 53: _maidTalkingFl = false; _goodNumberFl = false; while (!_goodNumberFl) setRandomStatus(); if (_newStatus == 1) resetFrame = 60; else if (_newStatus == 2) resetFrame = 57; else if (_newStatus == 3) resetFrame = 63; else if (_newStatus == 4) resetFrame = 55; break; case 56: if (_newStatus == 4) { _goodNumberFl = false; while (!_goodNumberFl) setRandomWipebrow(); } if (_newStatus == 4) resetFrame = 55; else if (_newStatus == 5) resetFrame = 32; else if (_newStatus == 3) resetFrame = 24; break; case 57: if (_newStatus == 1) resetFrame = 1; break; case 60: if (_newStatus == 1) resetFrame = 1; else if (_newStatus == 2) resetFrame = 16; break; case 63: if (_newStatus == 1) resetFrame = 1; break; case 64: resetFrame = 24; break; default: break; } if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) { _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame); _maidFrame = resetFrame; } } } if (_game._trigger >= 70) { switch (_game._trigger) { case 70: _scene->deleteSequence(_globals._sequenceIndexes[3]); _vm->_sound->command(25); _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); _scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71); break; case 71: { int seqIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); _game._player._stepEnabled = true; } break; default: break; } } } void Scene105::actions() { if (_action._lookFlag) { _vm->_dialogs->show(10501); _action._inProgress = false; return; } if (_vm->_gameConv->activeConvId() == 2) { handleConversation(); _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 8, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4],true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 2, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3); break; case 1: _scene->deleteSequence(_globals._sequenceIndexes[3]); _vm->_sound->command(24); _globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 2: { int seqIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); } break; case 3: _game._player._visible = true; _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]); _scene->_sequences.addTimer(1,4); break; case 4: _game._player.walk(Common::Point(120, 96), FACING_NORTH); _game._player.setWalkTrigger(5); break; case 5: _scene->deleteSequence(_globals._sequenceIndexes[3]); _vm->_sound->command(25); _globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 7, 1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6); break; case 6: { int seqIdx = _globals._sequenceIndexes[3]; _globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1); _scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1); _game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx); _scene->_sequences.addTimer(6, 7); } break; case 7: _scene->_nextSceneId = 103; break; default: break; } _action._inProgress = false; return; } if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) { _scene->_nextSceneId = 106; _action._inProgress = false; return; } if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) { _vm->_gameConv->run(2); _action._inProgress = false; return; } if (_action.isAction(VERB_TAKE, NOUN_GOBLET)) { if (_game._trigger || !_game._objects.isInInventory(OBJ_GOBLET)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 6, 2); _scene->_sequences.setAnimRange (_globals._sequenceIndexes[8], 1, 7); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 7, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _scene->deleteSequence (_globals._sequenceIndexes[5]); _scene->_dynamicHotspots.remove(_gobletHotspotId); _vm->_sound->command(26); _game._objects.addToInventory(OBJ_GOBLET); _vm->_dialogs->showItem(OBJ_GOBLET, 10519, 0); break; case 2: _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]); _globals[kPlayerScore] += 1; _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } _action._inProgress = false; return; } } if (_action.isAction(VERB_TAKE, NOUN_BONE) && _action._mainObjectSource == CAT_HOTSPOT) { if (_game._trigger || !_game._objects.isInInventory(OBJ_BONE)) { switch (_game._trigger) { case 0: _game._player._stepEnabled = false; _game._player._visible = false; _globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 6, 2); _scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1); _scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2); break; case 1: _scene->deleteSequence (_globals._sequenceIndexes[6]); _vm->_sound->command(26); _scene->_dynamicHotspots.remove(_boneHotspotId); _game._objects.addToInventory(OBJ_BONE); _vm->_dialogs->showItem(OBJ_BONE, 10520, 0); break; case 2: _game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]); if (!(_globals[kPlayerScoreFlags] & 2048)) { _globals[kPlayerScoreFlags] |= 2048; _globals[kPlayerScore] += 1; } _game._player._visible = true; _game._player._stepEnabled = true; break; default: break; } _action._inProgress = false; return; } } if (_action.isAction(VERB_TAKE, NOUN_BONE) && _game._objects.isInInventory(OBJ_BONE) && (_action._mainObjectSource == CAT_HOTSPOT)) { _vm->_dialogs->show(40112); _action._inProgress = false; return; } if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) { if (_action.isObject(NOUN_FLOOR)) { _vm->_dialogs->show(10502); _action._inProgress = false; return; } if (_action.isObject(NOUN_BRAZIER)) { _vm->_dialogs->show(10503); _action._inProgress = false; return; } if (_action.isObject(NOUN_DINING_TABLE)) { if (_scene->_customDest.x <= 98) { if (_game._objects[OBJ_GOBLET]._roomNumber == _scene->_currentSceneId) _vm->_dialogs->show(10505); else _vm->_dialogs->show(10522); } else _vm->_dialogs->show(10504); _action._inProgress = false; return; } if (_action.isObject(NOUN_CHAIR)) { _vm->_dialogs->show(10507); _action._inProgress = false; return; } if (_action.isObject(NOUN_WINDOW)) { _vm->_dialogs->show(10508); _action._inProgress = false; return; } if (_action.isObject(NOUN_TAPESTRY)) { _vm->_dialogs->show(10509); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) { _vm->_dialogs->show(10511); _action._inProgress = false; return; } if (_action.isObject(NOUN_WALL)) { _vm->_dialogs->show(10512); _action._inProgress = false; return; } if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) { _vm->_dialogs->show(10513); _action._inProgress = false; return; } if (_action.isObject(NOUN_DIVIDING_WALL)) { _vm->_dialogs->show(10514); _action._inProgress = false; return; } if (_action.isObject(NOUN_CEILING)) { _vm->_dialogs->show(10515); _action._inProgress = false; return; } if (_action.isObject(NOUN_SCULLERY_MAID)) { _vm->_dialogs->show(10516); _action._inProgress = false; return; } if (_action.isObject(NOUN_GOBLET) && _game._objects.isInRoom(OBJ_GOBLET)) { _vm->_dialogs->show(10517); _action._inProgress = false; return; } if (_action.isObject(NOUN_BONE) && _game._objects.isInRoom(OBJ_BONE)) { _vm->_dialogs->show(10518); _action._inProgress = false; return; } if (_action.isObject(NOUN_SCONCE)) { _vm->_dialogs->show(10524); _action._inProgress = false; return; } if (_action.isObject(NOUN_BUCKET)) { _vm->_dialogs->show(10521); _action._inProgress = false; return; } } if (_action.isAction(VERB_TAKE, NOUN_SCULLERY_MAID)) { _vm->_dialogs->show(30); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_DINING_TABLE)) { _vm->_dialogs->show(10506); _action._inProgress = false; return; } if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) { _vm->_dialogs->show(10510); _action._inProgress = false; return; } } void Scene105::preActions() { if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) _sitUpFl = true; } void Scene105::setRandomStatus() { _previousStatus = _newStatus; int rndVal = _vm->getRandomNumber(1, 30); if (rndVal < 20) { _newStatus = 1; _goodNumberFl = true; } else if ((rndVal > 19) && (rndVal < 27) && (_previousStatus != 2)) { _newStatus = 2; _goodNumberFl = true; } else if (_previousStatus != 3) { _newStatus = 3; _goodNumberFl = true; } } void Scene105::setRandomWipebrow() { _previousStatus = _newStatus; if (_vm->getRandomNumber(1, 100) < 100) { _newStatus = 4; _goodNumberFl = true; } else if (_previousStatus != 3) { _newStatus = 3; _goodNumberFl = true; } } void Scene105::handleConversation() { if ((_action._activeAction._verbId == 0) && !_sitUpFl) _sitUpFl = true; if ((_action._activeAction._verbId == 1) || (_action._activeAction._verbId == 2)) { switch (_game._trigger) { case 0: _vm->_gameConv->setInterlocutorTrigger(1); break; case 1: _maidTalkingFl = true; _sitUpFl = false; _vm->_gameConv->setHeroTrigger(2); break; case 2: _maidTalkingFl = false; break; default: break; } } } /*------------------------------------------------------------------------*/ } // End of namespace Dragonsphere } // End of namespace MADS