aboutsummaryrefslogtreecommitdiff
path: root/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mads/dragonsphere/dragonsphere_scenes1.cpp')
-rw-r--r--engines/mads/dragonsphere/dragonsphere_scenes1.cpp3714
1 files changed, 3714 insertions, 0 deletions
diff --git a/engines/mads/dragonsphere/dragonsphere_scenes1.cpp b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
new file mode 100644
index 0000000000..7abb4607ac
--- /dev/null
+++ b/engines/mads/dragonsphere/dragonsphere_scenes1.cpp
@@ -0,0 +1,3714 @@
+/* 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 interface;
+
+ switch (_scene->_nextSceneId) {
+ case 108:
+ case 109:
+ interface = 3;
+ break;
+ case 110:
+ interface = 5;
+ break;
+ case 113:
+ case 114:
+ case 115:
+ case 117:
+ case 119:
+ interface = 1;
+ break;
+ case 116:
+ interface = 2;
+ break;
+ case 120:
+ interface = 8;
+ break;
+ default:
+ interface = 0;
+ break;
+ }
+
+ _game._aaName = Resources::formatAAName(interface);
+ _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() {
+ int resetFrame;
+
+ if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) {
+ if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
+ _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+ resetFrame = -1;
+
+ 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 (resetFrame >= 0) {
+ if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) {
+ _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+ _diaryFrame = resetFrame;
+ }
+ }
+ }
+ }
+
+ if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) {
+ if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
+ _diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
+ resetFrame = -1;
+
+ 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 (resetFrame >= 0) {
+ if (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame()) {
+ _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+ _diaryFrame = resetFrame;
+ }
+ }
+ }
+ }
+
+ 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->get(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();
+ int resetFrame = -1;
+
+ if (_tapestryFrame == 13) {
+ _game._player._visible = true;
+ _game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
+ }
+
+ if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) {
+ _scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
+ _tapestryFrame = resetFrame;
+ }
+ }
+ }
+
+ 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->_running == 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->_nextStartNode = 31;
+ _vm->_gameConv->abortConv();
+
+ 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();
+ int resetFrame = -1;
+
+ if (_deathFrame == 11)
+ _scene->playSpeech(7);
+ else if (_deathFrame == 17)
+ _scene->playSpeech(6);
+
+ if (resetFrame >= 0) {
+ _scene->setAnimFrame(_globals._animationIndexes[4], resetFrame);
+ _deathFrame = resetFrame;
+ }
+}
+
+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->get(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->_running == 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