/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#include "common/scummsys.h"
#include "mads/mads.h"
#include "mads/conversations.h"
#include "mads/scene.h"
#include "mads/dragonsphere/dragonsphere_scenes.h"
#include "mads/dragonsphere/dragonsphere_scenes1.h"

namespace MADS {

namespace Dragonsphere {

void Scene1xx::setAAName() {
	int idx;

	switch (_scene->_nextSceneId) {
	case 108:
	case 109:
		idx = 3;
		break;
	case 110:
		idx = 5;
		break;
	case 113:
	case 114:
	case 115:
	case 117:
	case 119:
		idx = 1;
		break;
	case 116:
		idx = 2;
		break;
	case 120:
		idx = 8;
		break;
	default:
		idx = 0;
		break;
	}

	_game._aaName = Resources::formatAAName(idx);
	_vm->_palette->setEntry(254, 56, 47, 32);

}

void Scene1xx::sceneEntrySound() {
	if (!_vm->_musicFlag)
		return;

	switch (_scene->_nextSceneId) {
	case 104:
		if (_globals[kPlayerPersona] == 1)
			_vm->_sound->command(44);
		else
			_vm->_sound->command(16);
		break;

	case 106:
		if (_globals[kEndOfGame])
			_vm->_sound->command(47);
		else
			_vm->_sound->command(16);
		break;

	case 108:
		if (_game._visitedScenes.exists(109))
			_vm->_sound->command(32);
		else
			_vm->_sound->command(33);
		break;

	case 109:
		_vm->_sound->command(32);
		break;

	case 110:
		_vm->_sound->command(37);
		break;

	case 111:
		_vm->_sound->command(34);
		break;

	case 112:
		_vm->_sound->command(38);
		break;

	case 113:
		_vm->_sound->command(5);
		if (_globals[kPlayerIsSeal])
			_vm->_sound->command(35);
		else
			_vm->_sound->command(36);
		break;

	case 114:
		_vm->_sound->command(36);
		break;

	case 115:
		_vm->_sound->command(39);
		break;

	case 116:
		_vm->_sound->command(40);
		break;

	case 117:
		_vm->_sound->command(35);
		break;

	case 119:
		_vm->_sound->command(41);
		break;

	case 120:
		_vm->_sound->command(46);
		break;

	default:
		_vm->_sound->command(16);
		break;
	}
}

void Scene1xx::setPlayerSpritesPrefix() {
	int darkSceneFl = false;
	int noPlayerFl = false;

	_vm->_sound->command(5);
	Common::String oldName = _game._player._spritesPrefix;

	_globals[kPerformDisplacements] = true;

	switch (_scene->_nextSceneId) {
	case 106:
		if (_scene->_currentSceneId == 120)
			noPlayerFl = true;
		break;

	case 108:
	case 109:
	case 114:
	case 115:
		darkSceneFl = true;
		break;

	case 111:
	case 112:
	case 117:
	case 120:
	case 119:
		noPlayerFl = true;
		break;

	case 113:
		if (!_globals[kPlayerPersona])
			noPlayerFl = true;
		darkSceneFl = true;
		break;
	}

	if (noPlayerFl || _globals[kNoLoadWalker]) {
		_game._player._spritesPrefix = "";
	} else if (!_game._player._forcePrefix) {
		if (!_globals[kPlayerPersona] || _scene->_nextSceneId == 108 || _scene->_nextSceneId == 109) {
			if (_scene->_nextSceneId == 113 || _scene->_nextSceneId == 114 || _scene->_nextSceneId == 115 || _scene->_nextSceneId == 116)
				_game._player._spritesPrefix = "PD";
			else
				_game._player._spritesPrefix = "KG";
		} else
			_game._player._spritesPrefix = "PD";

		if (darkSceneFl)
			_game._player._spritesPrefix += "D";
	}

	if (oldName != _game._player._spritesPrefix)
		_game._player._spritesChanged = true;

	_game._player._scalingVelocity = true;
}

/*------------------------------------------------------------------------*/

Scene101::Scene101(MADSEngine *vm) : Scene1xx(vm) {
}

void Scene101::synchronize(Common::Serializer &s) {
	Scene1xx::synchronize(s);
}

void Scene101::setup() {
	setPlayerSpritesPrefix();
	setAAName();
}

void Scene101::enter() {
	sceneEntrySound();
}

void Scene101::step() {
}

void Scene101::actions() {
	if (_action.isObject(NOUN_BED)) {
		int sprIdx = _scene->_sprites.addSprites("*ob001i");
		int seqIdx = _scene->_sequences.addStampCycle(sprIdx, false, 1);
		_scene->_sequences.setDepth(seqIdx, 0);
		_scene->_sequences.setPosition(seqIdx, Common::Point(10, 50));
		_action._inProgress = false;
	}
}

void Scene101::preActions() {
}

/*------------------------------------------------------------------------*/

Scene102::Scene102(MADSEngine *vm) : Scene1xx(vm) {
	_diaryHotspotIdx1 = -1;
	_diaryHotspotIdx2 = -1;
	_diaryFrame = -1;
	_animRunning = -1;
}

void Scene102::synchronize(Common::Serializer &s) {
	Scene1xx::synchronize(s);

	s.syncAsSint16LE(_diaryHotspotIdx1);
	s.syncAsSint16LE(_diaryHotspotIdx2);
	s.syncAsSint16LE(_diaryFrame);
	s.syncAsSint16LE(_animRunning);
}

void Scene102::setup() {
	setPlayerSpritesPrefix();
	setAAName();

	_scene->addActiveVocab(NOUN_DIARIES);
	_scene->addActiveVocab(VERB_WALK_TO);
}

void Scene102::enter() {
	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('p', 0));
	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('p', 1));
	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 0));
	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 1));
	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', -1));
	_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_6");
	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 2));

	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0);
	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0);
	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0);

	_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
	_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12);
	_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);

	_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
	_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12);
	_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
	_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST);

	if (_scene->_priorSceneId == 103) {
		_game._player._playerPos = Common::Point(170, 152);
		_game._player._facing = FACING_NORTHWEST;
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
		_game._player.firstWalk(Common::Point(-10, 130), FACING_EAST, Common::Point(35, 144), FACING_EAST, false);
		_game._player.setWalkTrigger(70);
	} else {
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
	}

	sceneEntrySound();
}

void Scene102::step() {
	if ((_animRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) {
		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();

			switch (_diaryFrame) {
			case 6:
				_scene->deleteSequence(_globals._sequenceIndexes[1]);
				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[1], SYNC_ANIM, _globals._animationIndexes[0]);
				break;

			case 10:
				_vm->_sound->command(65);
				break;

			case 26:
				_vm->_dialogs->show(10210);
				_vm->_dialogs->show(10211);
				_vm->_dialogs->show(10212);
				break;

			default:
				break;
			}
		}
	}

	if ((_animRunning == 2) && _scene->_animation[_globals._animationIndexes[0]]) {
		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _diaryFrame) {
			_diaryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();

			switch (_diaryFrame) {
			case 6:
				_scene->deleteSequence(_globals._sequenceIndexes[2]);
				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[2], SYNC_ANIM, _globals._animationIndexes[0]);
				break;

			case 26:
				_vm->_dialogs->show(10213);
				_vm->_dialogs->show(10214);
				break;

			default:
				break;
			}
		}
	}

	if (_game._trigger >= 70) {
		switch (_game._trigger) {
		case 70:
			_scene->deleteSequence(_globals._sequenceIndexes[6]);
			_vm->_sound->command(25);
			_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
			break;

		case 71: {
			int idx = _globals._sequenceIndexes[6];
			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], -2);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
			_game._player._stepEnabled = true;
			}
			break;

		default:
			break;
		}
	}
}

void Scene102::actions() {
	if (_action._lookFlag) {
		_vm->_dialogs->show(10201);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) {
		switch (_game._trigger) {
		case 0:
			_game._player._stepEnabled = false;
			_game._player._visible = false;
			_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], true, 8, 2);
			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
			break;

		case 1:
			_scene->deleteSequence(_globals._sequenceIndexes[6]);
			_vm->_sound->command(24);
			_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 9, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
			break;

		case 2: {
			int idx = _globals._sequenceIndexes[6];
			_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, 5);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 5);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
			}
			break;

		case 3:
			_game._player._visible = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
			_game._player.walk(Common::Point(0, 130), FACING_WEST);
			_game._player._walkOffScreenSceneId = 101;
			break;

		default:
			break;
		}
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
		_scene->_nextSceneId = 103;
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TAKE, NOUN_DIARIES) || _action.isAction(VERB_OPEN, NOUN_DIARIES)) {
		switch (_game._trigger) {
		case 0:
			_game._player._stepEnabled = false;
			_game._player._visible = false;
			_animRunning = 1;
			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('B',-1), 1);
			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
			break;

		case 1:
			_globals._sequenceIndexes[1] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[1], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[1], 12);
			_diaryHotspotIdx1 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[1], Common::Rect(0, 0, 0, 0));
			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx1, Common::Point(47, 123), FACING_NORTHWEST);
			_game._player._visible = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
			_scene->_sequences.addTimer(6, 2);
			break;

		case 2:
			_game._player.walk(Common::Point(51, 121), FACING_NORTHWEST);
			_game._player.setWalkTrigger(3);
			break;

		case 3:
			_game._player._visible = false;
			_animRunning = 2;
			_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 4);
			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[0], SYNC_PLAYER, 0);
			break;

		case 4:
			_globals._sequenceIndexes[2] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[2], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[2], 12);
			_diaryHotspotIdx2 = _scene->_dynamicHotspots.add(NOUN_DIARIES, VERB_WALK_TO, SYNTAX_PLURAL, _globals._sequenceIndexes[2], Common::Rect(0, 0, 0, 0));
			_scene->_dynamicHotspots.setPosition(_diaryHotspotIdx2, Common::Point(47, 123), FACING_NORTHWEST);
			_game._player._visible = true;
			_game._player._stepEnabled = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
			break;

		default:
			break;
		}
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
		if (_action.isObject(NOUN_FIREPLACE)) {
			_vm->_dialogs->show(10202);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BED)) {
			_vm->_dialogs->show(10203);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SHUTTERS)) {
			_vm->_dialogs->show(10204);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_RUG)) {
			_vm->_dialogs->show(10206);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BOOKCASE)) {
			_vm->_dialogs->show(10208);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DIARIES)) {
			_vm->_dialogs->show(10209);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) {
			_vm->_dialogs->show(10215);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_FLOWERS)) {
			_vm->_dialogs->show(10216);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WINDOW)) {
			_vm->_dialogs->show(10217);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WOOD_BASKET)) {
			_vm->_dialogs->show(10219);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) {
			_vm->_dialogs->show(10220);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_NIGHTSTAND)) {
			_vm->_dialogs->show(10222);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
			_vm->_dialogs->show(10223);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CHEST)) {
			_vm->_dialogs->show(10224);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TAPESTRY)) {
			_vm->_dialogs->show(10226);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SCONCE)) {
			_vm->_dialogs->show(10227);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_FLOOR)) {
			_vm->_dialogs->show(10228);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WALL)) {
			_vm->_dialogs->show(10229);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DECORATION)) {
			_vm->_dialogs->show(10230);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CEILING)) {
			_vm->_dialogs->show(10231);
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_OPEN, NOUN_CHEST)) {
		_vm->_dialogs->show(10224);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TAKE, NOUN_FLOWERS)) {
		_vm->_dialogs->show(10225);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_OPEN, NOUN_WINDOW)) {
		_vm->_dialogs->show(10218);
		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) {
		_vm->_dialogs->show(10221);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_CLOSE, NOUN_SHUTTERS)) {
		_vm->_dialogs->show(10205);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_PULL, NOUN_RUG)) {
		_vm->_dialogs->show(10207);
		_action._inProgress = false;
		return;
	}
}

void Scene102::preActions() {
}

/*------------------------------------------------------------------------*/

Scene103::Scene103(MADSEngine *vm) : Scene1xx(vm) {
}

void Scene103::synchronize(Common::Serializer &s) {
	Scene1xx::synchronize(s);
}

void Scene103::setup() {
	setPlayerSpritesPrefix();
	setAAName();
}

void Scene103::enter() {
	_vm->_disableFastwalk = true;

	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('y', 1));
	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('y', 2));
	_globals._spriteIndexes[8] = _scene->_sprites.addSprites(formAnimName('y', 7));
	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('y', 0));
	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('y', 3));
	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('y', 4));
	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('y', 5));
	_globals._spriteIndexes[7] = _scene->_sprites.addSprites(formAnimName('y', 6));
	_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('x', 0));
	_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('x', 1));
	_globals._spriteIndexes[11] = _scene->_sprites.addSprites("*KGRD_9");

	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 0);
	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0, 4);
	_globals._sequenceIndexes[8] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[8], false, 7, 0, 0);
	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 0);
	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0, 3);
	_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 7, 0, 2);
	_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 7, 0, 0);
	_globals._sequenceIndexes[7] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[7], false, 7, 0, 5);

	if ((_scene->_priorSceneId == 104) || (_scene->_priorSceneId == 105)) {
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
	}

	if (_scene->_priorSceneId == 102) {
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
		_scene->setCamera(Common::Point(320, 0));
		_game._player.walk(Common::Point(482, 128), FACING_SOUTH);
		_game._player.firstWalk(Common::Point(471, 108), FACING_SOUTH, Common::Point(482, 128), FACING_SOUTH, false);
		_game._player.setWalkTrigger(72);
	} else if (_scene->_priorSceneId == 104) {
		_game._player._playerPos = Common::Point(130, 152);
		_game._player._facing = FACING_NORTHEAST;
	} else if (_scene->_priorSceneId == 105) {
		_game._player._playerPos = Common::Point(517, 152);
		_game._player._facing = FACING_NORTHWEST;
		_scene->setCamera(Common::Point(320, 0));
	} else if ((_scene->_priorSceneId == 101) || (_scene->_priorSceneId != RETURNING_FROM_LOADING)) {
		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
		_game._player.firstWalk(Common::Point(173, 108), FACING_SOUTH, Common::Point(162, 127), FACING_SOUTH, false);
		_game._player.setWalkTrigger(70);
	} else {
		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
	}

	sceneEntrySound();
}

void Scene103::step() {
	switch (_game._trigger) {
	case 70:
		_scene->deleteSequence(_globals._sequenceIndexes[9]);
		_vm->_sound->command(25);
		_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 6, 1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[9], 1, 3);
		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
		break;

	case 71: {
		int tmpIdx = _globals._sequenceIndexes[9];
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 6);
		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
		_game._player._stepEnabled = true;
		}
		break;

	case 72:
		_scene->deleteSequence(_globals._sequenceIndexes[10]);
		_vm->_sound->command(25);
		_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 6, 1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[10], 1, 3);
		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 73);
		break;

	case 73: {
		int tmpIdx = _globals._sequenceIndexes[10];
		_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
		_game._player._stepEnabled = true;
		}
		break;

	default:
		break;
	}
}

void Scene103::actions() {
	if (_action._lookFlag) {
		_vm->_dialogs->show(10301);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_KINGS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_KINGS_ROOM)) {
		switch (_game._trigger) {
		case 0:
			_game._player._stepEnabled = false;
			_game._player._visible = false;
			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], false, 7, 2);
			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
			break;

		case 1:
			_scene->deleteSequence(_globals._sequenceIndexes[9]);
			_vm->_sound->command(24);
			_globals._sequenceIndexes[9] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
			break;

		case 2: {
			int tmpIdx = _globals._sequenceIndexes[9];
			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -2);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 14);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
			}
			break;

		case 3:
			_game._player._visible = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]);
			_scene->_sequences.addTimer(1, 4);
			break;

		case 4:
			_game._player.walk(Common::Point(173, 108), FACING_NORTH);
			_game._player.setWalkTrigger(5);
			break;

		case 5:
			_scene->deleteSequence(_globals._sequenceIndexes[9]);
			_vm->_sound->command(25);
			_globals._sequenceIndexes[9] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[9], false, 7, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[9], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
			break;

		case 6: {
			int tmpIdx = _globals._sequenceIndexes[9];
			_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 1);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[9], SYNC_SEQ, tmpIdx);
			_scene->_sequences.addTimer(6, 7);
			}
			break;

		case 7:
			_scene->_nextSceneId = 101;
			break;

		default:
			break;
		}
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_QUEENS_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_QUEENS_ROOM)) {
		switch (_game._trigger) {
		case 0:
			_game._player._stepEnabled = false;
			_game._player._visible = false;
			_globals._sequenceIndexes[11] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[11], true, 7, 2);
			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[11], true);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_SPRITE, 2, 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[11], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
			break;

		case 1:
			_scene->deleteSequence(_globals._sequenceIndexes[10]);
			_vm->_sound->command(24);
			_globals._sequenceIndexes[10] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 8);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
			break;

		case 2: {
			int tmpIdx = _globals._sequenceIndexes[10];
			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -2);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 14);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
			}
			break;

		case 3:
			_game._player._visible = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[11]);
			_scene->_sequences.addTimer(1, 4);
			break;

		case 4:
			_game._player.walk(Common::Point(471, 108), FACING_NORTH);
			_game._player.setWalkTrigger(5);
			break;

		case 5:
			_scene->deleteSequence(_globals._sequenceIndexes[10]);
			_vm->_sound->command(25);
			_globals._sequenceIndexes[10] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[10], false, 7, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[10], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
			break;

		case 6: {
			int tmpIdx = _globals._sequenceIndexes[10];
			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 1);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[10], SYNC_SEQ, tmpIdx);
			_scene->_sequences.addTimer(6, 7);
			}
			break;

		case 7:
			_scene->_nextSceneId = 102;
			break;

		default:
			break;
		}
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_MEETING_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_MEETING_ROOM)) {
		_scene->_nextSceneId = 104;
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_BALLROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_BALLROOM)) {
		_scene->_nextSceneId = 105;
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
		if (_action.isObject(NOUN_TAPESTRY)) {
			if ((_scene->_customDest.x <= 75) && (_scene->_customDest.y <= 130))
				_vm->_dialogs->show(10302);
			else
				_vm->_dialogs->show(10303);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_COAT_OF_ARMS)) {
			_vm->_dialogs->show(10305);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_QUEENS_ROOM)) {
			_vm->_dialogs->show(10307);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_KINGS_ROOM)) {
			_vm->_dialogs->show(10308);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CEDAR_CHEST)) {
			_vm->_dialogs->show(10309);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TABLE)) {
			_vm->_dialogs->show(10311);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SMALL_WINDOW)) {
			_vm->_dialogs->show(10312);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_LARGE_WINDOW)) {
			_vm->_dialogs->show(10314);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BATTLE_AXES)) {
			_vm->_dialogs->show(10315);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BUST_ON_WALL)) {
			_vm->_dialogs->show(10317);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DECORATION)) {
			_vm->_dialogs->show(10320);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WALL_PLAQUE)) {
			_vm->_dialogs->show(10322);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_BALLROOM)) {
			_vm->_dialogs->show(10323);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_MEETING_ROOM)) {
			_vm->_dialogs->show(10324);
			_action._inProgress = false;
			return;
		}
	}

	if ((_action.isAction(VERB_TAKE) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_BATTLE_AXES)) {
		_vm->_dialogs->show(10316);
		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) {
		_vm->_dialogs->show(10304);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_PULL, NOUN_COAT_OF_ARMS)) {
		_vm->_dialogs->show(10306);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_OPEN, NOUN_CEDAR_CHEST)) {
		_vm->_dialogs->show(10310);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_OPEN, NOUN_SMALL_WINDOW) || _action.isAction(VERB_OPEN, NOUN_LARGE_WINDOW)) {
		_vm->_dialogs->show(10313);
		_action._inProgress = false;
		return;
	}
}

void Scene103::preActions() {
}

/*------------------------------------------------------------------------*/

Scene104::Scene104(MADSEngine *vm) : Scene1xx(vm) {
	_anim0ActvFl = false;
	_anim1ActvFl = false;
	_anim2ActvFl = false;
	_anim3ActvFl = false;
	_anim4ActvFl = false;
	_anim5ActvFl = false;
	_activateTimerFl = false;
	_wasBearFl = false;
	_amuletWorksFl = false;
	_pidDrawnSword = false;
	_anim6ActvFl = false;

	_animationRunning = -1;
	_deathTimer = -1;
	_deathFrame = -1;
	_doorwayHotspotId = -1;

	_kingStatus = -1;
	_kingFrame = -1;
	_kingCount = -1;
	_macCount = -1;
	_macFrame = -1;
	_macStatus = -1;
	_queenStatus = -1;
	_queenFrame = -1;
	_queenCount = -1;
	_pidStatus = -1;
	_pidFrame = -1;
	_pidCount = -1;
	_twinklesFrame = -1;
	_twinklesStatus = -1;
	_twinklesCount = -1;

	_tapestryFrame = -1;
	_clock = -1;
}

void Scene104::synchronize(Common::Serializer &s) {
	Scene1xx::synchronize(s);

	s.syncAsByte(_anim0ActvFl);
	s.syncAsByte(_anim1ActvFl);
	s.syncAsByte(_anim2ActvFl);
	s.syncAsByte(_anim3ActvFl);
	s.syncAsByte(_anim4ActvFl);
	s.syncAsByte(_anim5ActvFl);
	s.syncAsByte(_activateTimerFl);
	s.syncAsByte(_wasBearFl);
	s.syncAsByte(_amuletWorksFl);
	s.syncAsByte(_pidDrawnSword);
	s.syncAsByte(_anim6ActvFl);

	s.syncAsSint16LE(_animationRunning);
	s.syncAsSint16LE(_deathTimer);
	s.syncAsSint16LE(_deathFrame);
	s.syncAsSint16LE(_doorwayHotspotId);

	s.syncAsSint16LE(_kingStatus);
	s.syncAsSint16LE(_kingFrame);
	s.syncAsSint16LE(_kingCount);
	s.syncAsSint16LE(_queenStatus);
	s.syncAsSint16LE(_queenFrame);
	s.syncAsSint16LE(_queenCount);
	s.syncAsSint16LE(_macStatus);
	s.syncAsSint16LE(_macFrame);
	s.syncAsSint16LE(_macCount);
	s.syncAsSint16LE(_pidStatus);
	s.syncAsSint16LE(_pidFrame);
	s.syncAsSint16LE(_pidCount);
	s.syncAsSint16LE(_twinklesStatus);
	s.syncAsSint16LE(_twinklesFrame);
	s.syncAsSint16LE(_twinklesCount);

	s.syncAsSint16LE(_tapestryFrame);
	s.syncAsSint32LE(_clock);
}

void Scene104::setup() {
	if (_scene->_currentSceneId == 119)
		_globals[kNoLoadWalker] = true;

	setPlayerSpritesPrefix();
	setAAName();

	_scene->addActiveVocab(NOUN_DOORWAY);
	_scene->addActiveVocab(NOUN_QUEEN_MOTHER);
	_scene->addActiveVocab(NOUN_KING);
}

void Scene104::enter() {
	_vm->_gameConv->load(1);

	if (_globals[kPlayerPersona] == 1) {
		_scene->_sprites.addSprites(formAnimName('e', 8));
		_scene->_sprites.addSprites(formAnimName('b', 5));
	}

	_scene->_hotspots.activate(NOUN_MACMORN, false);

	if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
		_animationRunning = 0;
		_anim0ActvFl = false;
		_anim1ActvFl = false;
		_anim2ActvFl = false;
		_anim3ActvFl = false;
		_anim4ActvFl = false;
		_anim5ActvFl = false;
		_kingCount = 0;
		_macCount = 0;
		_queenCount = 0;
		_twinklesCount = 0;
		_deathTimer = 0;
		_clock = 0;
		_activateTimerFl = false;
		_wasBearFl = false;
		_amuletWorksFl = false;
		_pidDrawnSword = false;
	}

	_anim6ActvFl = false;

	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
	_globals._spriteIndexes[4] = _scene->_sprites.addSprites(formAnimName('x', 3));
	_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('x', 5));
	_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('x', 4));

	if (_globals[kNoLoadWalker]) {
		_scene->drawToBackground(_globals._spriteIndexes[6], 5, Common::Point(-32000, -32000), 0, 100);
		_scene->_sprites.remove(_globals._spriteIndexes[6]);
	}

	if (_globals[kPlayerPersona] == 0) {
		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(139, 132));

		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRD_8");
		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM1_8");
		_globals._spriteIndexes[11] = _scene->_sprites.addSprites(formAnimName('y', 5));
		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4));
		_globals._spriteIndexes[12] = _scene->_sprites.addSprites(formAnimName('y', 1));

		if (_globals[kTapestryStatus] == 0 || _globals[kTapestryStatus] == 2) {
			_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
			_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
			_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6);
		} else {
			_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
			_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
		}

		if (_globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3) {
			if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
				_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
		} else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4) {
			_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);

			if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) {
				_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
				_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
			}
		}
	} else {
		_globals._spriteIndexes[14] = _scene->_sprites.addSprites(formAnimName('e', 5));
		_scene->_sprites.addSprites(formAnimName('b', 0));
		_globals._spriteIndexes[13] = _scene->_sprites.addSprites(formAnimName('b', 3));
		_scene->_hotspots.activateAtPos(NOUN_TABLE, false, Common::Point(140, 107));
		_scene->_hotspots.activateAtPos(NOUN_TABLE, true, Common::Point(139, 132));
		_globals._spriteIndexes[10] = _scene->_sprites.addSprites(formAnimName('y', 4));

		if (_globals[kNoLoadWalker]) {
			_scene->drawToBackground(_globals._spriteIndexes[10], 1, Common::Point(-32000, -32000), 0, 100);
			_scene->_sprites.remove(_globals._spriteIndexes[10]);
		}

		_globals._spriteIndexes[9] = _scene->_sprites.addSprites(formAnimName('y', 3));
		_globals._sequenceIndexes[9] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[9], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[9], 8);
		_doorwayHotspotId = _scene->_dynamicHotspots.add(NOUN_DOORWAY, VERB_WALK_THROUGH, SYNTAX_SINGULAR, _globals._sequenceIndexes[9], Common::Rect(0, 0, 0, 0));
		_scene->_dynamicHotspots.setPosition(_doorwayHotspotId, Common::Point(295, 145), FACING_NORTHEAST);

		_globals[kBooksStatus] = 0;
		_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
	}

	if (_globals[kBooksStatus] == 0)
		_scene->_hotspots.activate(NOUN_BOOKS, false);

	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0, 5);
	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0);
	_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 7, 0);
	_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 3);
	_globals._sequenceIndexes[4] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[4], false, 7, 0);


	if (_globals[kPlayerPersona] == 0) {
		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
	}

	if (_scene->_priorSceneId == 106) {
		_game._player._playerPos = Common::Point(201, 152);
		_game._player._facing = FACING_NORTHWEST;
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
	} else if ((_scene->_priorSceneId == 119) || (_scene->_priorSceneId == 104)) {
		_game._player._visible = false;
		_game._player._stepEnabled = false;

		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 4);
		_scene->_sequences.addTimer(60, 77);

		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0);
		_anim0ActvFl = true;
		_kingStatus = 2;
		_scene->setAnimFrame(_globals._animationIndexes[0], 22);

		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0);
		_anim2ActvFl = true;
		_queenStatus = 0;

		_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);

		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 1), 79);

		int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
		_scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0);

		_scene->_hotspots.activate(NOUN_MACMORN, true);

		idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);
	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
		_game._player.firstWalk(Common::Point(77, 93), FACING_SOUTH, Common::Point(74, 107), FACING_SOUTH, false);
		_game._player.setWalkTrigger(70);
	} else if (_globals[kNoLoadWalker]) {
		_game._player._visible = false;
		_game._player._stepEnabled = false;

		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);

		_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('k', 1), 0);
		_anim0ActvFl = true;
		_kingStatus = 0;
		_scene->setAnimFrame(_globals._animationIndexes[0], 14);

		_globals._animationIndexes[2] = _scene->loadAnimation(formAnimName('q', 1), 0);
		_anim2ActvFl = true;
		_queenStatus = 0;

		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0);
		_anim4ActvFl = true;
		_pidStatus = 0;
		if (_amuletWorksFl)
			_scene->setAnimFrame(_globals._animationIndexes[4], 89);

		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0);
		_anim1ActvFl = true;
		_macStatus = 0;
		_scene->setAnimFrame(_globals._animationIndexes[1], 25);

		int idx = _scene->_dynamicHotspots.add(NOUN_QUEEN_MOTHER, VERB_WALK_TO, SYNTAX_FEM_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
		_scene->setDynamicAnim(idx, _globals._animationIndexes[2], 0);

		_scene->_hotspots.activate(NOUN_MACMORN, true);

		idx = _scene->_dynamicHotspots.add(NOUN_KING, VERB_WALK_TO, SYNTAX_MASC_NOT_PROPER, EXT_NONE, Common::Rect(0, 0, 0, 0));
		_scene->_dynamicHotspots[idx]._articleNumber = PREP_ON;
		_scene->setDynamicAnim(idx, _globals._animationIndexes[0], 0);

		if (_vm->_gameConv->restoreRunning() == 1) {
			_game._player._stepEnabled = false;
			_vm->_gameConv->run(1);
			_vm->_gameConv->exportValue(0);
			_vm->_gameConv->exportValue(0);
			_vm->_gameConv->exportValue(0);
			if (_globals[kLlanieStatus] != 2)
				_vm->_gameConv->exportValue(1);
			else
				_vm->_gameConv->exportValue(0);
		} else {
			_activateTimerFl = true;
			_deathTimer = 0;
			_clock = 0;
			_game._player._stepEnabled = true;
		}
	} else {
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 12);
	}

	sceneEntrySound();
}

void Scene104::step() {
	if (_anim0ActvFl)
		handleKingAnimation();

	if (_anim1ActvFl)
		handleMacAnimation1();

	if (_anim2ActvFl)
		handleQueenAnimation();

	if (_anim3ActvFl)
		handleTwinklesAnimation();

	if (_anim4ActvFl)
		handlePidAnimation();

	if (_anim5ActvFl)
		handleMacAnimation2();

	if (_anim6ActvFl)
		handleDeathAnimation();

	if ((_animationRunning == 1) && _scene->_animation[_globals._animationIndexes[0]]) {
		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _tapestryFrame) {
			_tapestryFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();

			if (_tapestryFrame == 13) {
				_game._player._visible = true;
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
			}
		}
	}

	switch (_game._trigger) {
	case 70:
		_scene->deleteSequence(_globals._sequenceIndexes[6]);
		_vm->_sound->command(25);
		_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[6], 1, 4);
		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
		break;

	case 71: {
		int idx = _globals._sequenceIndexes[6];
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, idx);
		_game._player._stepEnabled = true;
		}
		break;
	}

	if (_game._trigger == 77)
		_kingStatus = 0;

	if (_game._trigger == 79) {
		_scene->freeAnimation(_globals._animationIndexes[4]);

		_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('p', 2), 0);
		_anim4ActvFl = true;
		_pidStatus = 0;
		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0);

		_scene->deleteSequence(_globals._sequenceIndexes[14]);
		_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 1), 0);
		_anim1ActvFl = true;
		_macStatus = 0;

		_game._player._stepEnabled = false;
		_vm->_gameConv->run(1);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(0);

		if (_globals[kLlanieStatus] != 2)
			_vm->_gameConv->exportValue(1);
		else
			_vm->_gameConv->exportValue(0);
	}

	if (_game._trigger == 85) {
		_vm->_sound->command(100);
		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -2);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
	}

	if (_activateTimerFl) {
		long clockDiff = _scene->_frameStartTime - _clock;
		if ((clockDiff >= 0) && (clockDiff <= 4))
			_deathTimer += clockDiff;
		else
			_deathTimer += 1;

		_clock = _scene->_frameStartTime;

		if (_deathTimer >= 1300) {
			_activateTimerFl = false;
			if (_pidDrawnSword) {
				_pidStatus = 6;
				_vm->_gameConv->run(1);
				_vm->_gameConv->exportValue(0);
				_vm->_gameConv->exportValue(1);
				_vm->_gameConv->exportValue(0);
				if (_globals[kLlanieStatus] != 2)
					_vm->_gameConv->exportValue(1);
				else
					_vm->_gameConv->exportValue(0);
				_vm->_gameConv->hold();
			} else
				_pidStatus = 8;

			_game._player._stepEnabled = false;
		}
	}


	if ((_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
		&& (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4))
		_globals[kCanViewCrownHole] = true;

	if (_game._trigger == 95) {
		_vm->_gameConv->reset(1);
		_vm->_dialogs->show(10466);
		_globals[kNoLoadWalker] = false;
		_scene->_nextSceneId = 119;
	}
}

void Scene104::actions() {
	if (_vm->_gameConv->activeConvId() == 1) {
		handleFinalConversation();
		_action._inProgress = false;
		return;
	}

	if (_action._lookFlag) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10401);
		else
			_vm->_dialogs->show(10437);

		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) {
		if (_globals[kPlayerPersona] == 0)
			_scene->_nextSceneId = 106;
		else
			_vm->_dialogs->show(10434);

		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
		if (_globals[kPlayerPersona] == 0) {
			switch (_game._trigger) {
			case 0:
				_game._player._stepEnabled = false;
				_game._player._visible = false;
				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 8, 2);
				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 2, 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
				break;

			case 1:
				_scene->deleteSequence(_globals._sequenceIndexes[6]);
				_vm->_sound->command(24);
				_globals._sequenceIndexes[6] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[6], false, 6, 1);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
				break;

			case 2: {
				int tmpIdx = _globals._sequenceIndexes[6];
				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -2);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 14);
				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx);
				}
				break;

			case 3:
				_game._player._visible = true;
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
				_scene->_sequences.addTimer(1, 4);
				break;

			case 4:
				_game._player.walk(Common::Point(77, 93), FACING_NORTH);
				_game._player.setWalkTrigger(5);
				break;

			case 5:
				_scene->deleteSequence(_globals._sequenceIndexes[6]);
				_vm->_sound->command(25);
				_globals._sequenceIndexes[6] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[6], false, 7, 1);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[6], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
				break;

			case 6: {
				int tmpIdx = _globals._sequenceIndexes[6];
				_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 1);
				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[6], SYNC_SEQ, tmpIdx);
				_scene->_sequences.addTimer(6, 7);
				}
				break;

			case 7:
				_scene->_nextSceneId = 103;
				break;

			default:
				break;
			}
		} else
			_vm->_dialogs->show(10434);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_TAKE) || _action.isAction(VERB_OPEN)) && _action.isObject(NOUN_BOOKS)) {
		if ((_globals[kBooksStatus] == 1) || (_globals[kBooksStatus] == 3) || _game._trigger) {
			switch (_game._trigger) {
			case 0:
				_game._player._stepEnabled = false;
				_game._player._visible = false;
				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
				break;

			case 1:
				_globals._sequenceIndexes[12] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[12], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
				break;

			case 2: {
				int tmpIdx = _globals._sequenceIndexes[12];
				_globals._sequenceIndexes[12] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[12], false, -2);
				_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[12], SYNC_SEQ, tmpIdx);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
				if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) {
					_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
					_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
				}
				}
				break;

			case 3:
				_game._player._visible = true;
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
				_scene->_sequences.addTimer(5, 4);
				break;

			case 4:
				if (_globals[kBooksStatus] == 1) {
					_globals[kPlayerScore] += 2;
					_globals[kBooksStatus] = 2;
					if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3))
						_vm->_dialogs->show(10428);
					else {
						_vm->_sound->command(94);
						_vm->_sound->command(67);
						_vm->_dialogs->show(10427);
					}
				} else {
					_vm->_sound->command(94);
					_vm->_sound->command(67);
					_globals[kBooksStatus] = 4;
				}
				_game._player._stepEnabled = true;
				break;

			default:
				break;
			}
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_PUSH, NOUN_BOOKS)) {
		if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) {
			switch (_game._trigger) {
			case 0:
				_game._player._stepEnabled = false;
				_game._player._visible = false;
				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], false, 8, 2);
				_scene->_sequences.setAnimRange(_globals._sequenceIndexes[8], -1, 3);
				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 3, 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
				break;

			case 1:
				_vm->_sound->command(94);
				_vm->_sound->command(67);
				_scene->deleteSequence(_globals._sequenceIndexes[12]);
				_globals._sequenceIndexes[12] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[12], false, 6, 1);
				_scene->_sequences.setDepth(_globals._sequenceIndexes[12], 8);
				_scene->_sequences.addTimer(6, 2);
				break;

			case 2:
				if ((_globals[kTapestryStatus] == 1) || (_globals[kTapestryStatus] == 3)) {
					_scene->_hotspots.activate(NOUN_WALL_PANEL, true);
					_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
				}
				break;

			case 3:
				_game._player._visible = true;
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
				_scene->_sequences.addTimer(5, 4);
				break;

			case 4:
				if (_globals[kBooksStatus] == 2)
					_vm->_dialogs->show(10429);
				_globals[kBooksStatus] = 3;
				_game._player._stepEnabled = true;
				break;

			default:
				break;
			}
			_action._inProgress = false;
			return;
		}
	}

	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) {
		if (_globals[kPlayerPersona] == 0) {
			if (_scene->_customDest.x >= 279) {
				if ((_globals[kTapestryStatus] == 0) || (_globals[kTapestryStatus] == 2)) {
					switch (_game._trigger) {
					case 0:
						_scene->deleteSequence(_globals._sequenceIndexes[11]);
						_game._player._stepEnabled = false;
						_game._player._visible = false;
						_animationRunning = 1;
						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('a', -1), 1);
						break;

					case 1:
						_game._player._visible = true;
						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
						_globals._sequenceIndexes[10] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[10], false, -1);
						_scene->_sequences.setDepth(_globals._sequenceIndexes[10], 6);
						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(290, 20));
						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(310, 70));
						if ((_globals[kBooksStatus] == 2) || (_globals[kBooksStatus] == 4)) {
							_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
							_scene->_hotspots.activate(NOUN_SECRET_DOOR, true);
						} else {
							_scene->_hotspots.activate(NOUN_WALL_PANEL, true);
							_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
						}
						_scene->_sequences.addTimer(6, 2);
						break;

					case 2:
						if (_globals[kTapestryStatus] == 0) {
							_globals[kTapestryStatus] = 1;
							_globals[kPlayerScore] += 2;
							if (_globals[kBooksStatus] == 0 || _globals[kBooksStatus] == 1 || _globals[kBooksStatus] == 3)
								_vm->_dialogs->show(10424);
							else if (_globals[kBooksStatus] == 2 || _globals[kBooksStatus] == 4)
								_vm->_dialogs->show(10425);
						} else
							_globals[kTapestryStatus] = 3;

						_game._player._stepEnabled = true;
						break;

					default:
						break;
					}
				}
			} else
				_vm->_dialogs->show(10404);
		} else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY)) {
		if (_globals[kPlayerPersona] == 0) {
			if (_scene->_customDest.x >= 279) {
				if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3) {
					switch (_game._trigger) {
					case 0:
						_game._player._stepEnabled = false;
						_game._player._visible = false;
						_scene->deleteSequence(_globals._sequenceIndexes[10]);
						_animationRunning = 2;
						_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('d', -1), 1);
						break;

					case 1:
						_game._player._visible = true;
						_game.syncTimers(SYNC_PLAYER, 0, SYNC_ANIM, _globals._animationIndexes[0]);
						_globals._sequenceIndexes[11] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[11], false, -1);
						_scene->_sequences.setDepth(_globals._sequenceIndexes[11], 6);
						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, false, Common::Point(290, 20));
						_scene->_hotspots.activateAtPos(NOUN_TAPESTRY, true, Common::Point(310, 70));
						_scene->_hotspots.activate(NOUN_SECRET_DOOR, false);
						_scene->_hotspots.activate(NOUN_WALL_PANEL, false);
						_scene->_sequences.addTimer(6, 2);
						break;

					case 2:
						_globals[kTapestryStatus] = 2;
						_game._player._stepEnabled = true;
						break;

					default:
						break;
					}
					_action._inProgress = false;
					return;
				}
			}
		} else {
			_vm->_dialogs->show(10445);
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {
		if (_action.isObject(NOUN_BOOKS) || _action.isObject(NOUN_BOOKSHELF)) {
			if (_globals[kPlayerPersona] == 0) {
				switch (_globals[kBooksStatus]) {
				case 0:
					_scene->_hotspots.activate(NOUN_BOOKS, true);
					_globals[kBooksStatus] = 1;
					_vm->_dialogs->show(10418);
					_action._inProgress = false;
					return;

				case 1:
					_vm->_dialogs->show(10418);
					_action._inProgress = false;
					return;

				case 2:
				case 4:
					_vm->_dialogs->show(10419);
					_action._inProgress = false;
					return;

				case 3:
					_vm->_dialogs->show(10420);
					_action._inProgress = false;
					return;

				default:
					break;
				}
			} else {
				_vm->_dialogs->show(10439);
				_action._inProgress = false;
				return;
			}
		}

		if (_action.isObject(NOUN_FIREPLACE)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10402);
			else
				_vm->_dialogs->show(10438);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TAPESTRY)) {
			if (_globals[kPlayerPersona] == 0) {
				if (_scene->_customDest.x >= 209 && _scene->_customDest.x <= 278)
					_vm->_dialogs->show(10403);
				else if (_scene->_customDest.x >= 107 && _scene->_customDest.x <= 190)
						_vm->_dialogs->show(10422);
				else if (_globals[kTapestryStatus] == 1 || _globals[kTapestryStatus] == 3)
					_vm->_dialogs->show(10460);
				else
					_vm->_dialogs->show(10423);
			} else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_RUG)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10405);
			else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_FIREPLACE_SCREEN)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10407);
			else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10409);
			else
				_vm->_dialogs->show(10434);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SCONCE)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10410);
			else
				_vm->_dialogs->show(10440);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WOOD_BASKET)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10411);
			else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TROPHY)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10412);
			else
				_vm->_dialogs->show(10441);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_READING_BENCH)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10414);
			else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_LOVESEAT)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10416);
			else
				_vm->_dialogs->show(10439);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
			if (_globals[kPlayerPersona] == 0)
				_vm->_dialogs->show(10421);
			else
				_vm->_dialogs->show(10434);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SECRET_DOOR)) {
			_vm->_dialogs->show(10430);
			_action._inProgress = false;
			return;
		}

		if ((_action.isObject(NOUN_DOORWAY) || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY) || _action.isAction(VERB_OPEN, NOUN_DOORWAY)) && (_globals[kPlayerPersona] == 1)) {
			_vm->_dialogs->show(10432);
			_action._inProgress = false;
			return;
		}

		if (_action.isAction(VERB_LOOK, NOUN_WALL_PANEL)) {
			if ((_globals[kBooksStatus] == 0) || (_globals[kBooksStatus] == 1))
				_vm->_dialogs->show(10435);
			else
				_vm->_dialogs->show(10436);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_KING) && _globals[kPlayerPersona] == 1) {
			_vm->_dialogs->show(10443);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
			_vm->_dialogs->showItem(OBJ_MAGIC_MUSIC_BOX, 843, 0);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_MACMORN) && (_globals[kPlayerPersona] == 1)) {
			_vm->_dialogs->show(10444);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TABLE)) {
			if (_globals[kPlayerPersona] == 1)
				_vm->_dialogs->show(10455);
			else if (_scene->_customDest.x < 174)
				_vm->_dialogs->show(10451);
			else
				_vm->_dialogs->show(10448);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DECORATION)) {
			if (_globals[kPlayerPersona] == 1)
				_vm->_dialogs->show(10439);
			else
				_vm->_dialogs->show(10449);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SWORD)) {
			if (_globals[kPlayerPersona] == 1)
				_vm->_dialogs->show(10439);
			else
				_vm->_dialogs->show(10450);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_FLOOR) && (_globals[kPlayerPersona] == 1)) {
			_vm->_dialogs->show(10439);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WALL) && (_globals[kPlayerPersona] == 1)) {
			_vm->_dialogs->show(10439);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CANDLESTICK)) {
			if (_globals[kPlayerPersona] == 1)
				_vm->_dialogs->show(10439);
			else
				_vm->_dialogs->show(10461);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_QUEEN_MOTHER)) {
			_vm->_dialogs->show(10456);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_MACMORN)) {
			_vm->_dialogs->show(10444);
			_action._inProgress = false;
			return;
		}
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_RUG)) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10406);
		else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_FIREPLACE_SCREEN)) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10408);
		else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TROPHY)) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10413);
		else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_OPEN, NOUN_READING_BENCH)) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10415);
		else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_LOVESEAT)) {
		if (_globals[kPlayerPersona] == 0)
			_vm->_dialogs->show(10417);
		else
			_vm->_dialogs->show(10445);

		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && (_action.isObject(NOUN_SECRET_DOOR) || _action.isObject(NOUN_WALL_PANEL))) {
		_vm->_dialogs->show(10431);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_INVOKE, NOUN_SIGNET_RING) && (_globals[kPlayerPersona] == 1)) {
		_vm->_dialogs->show(10433);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_PUT, NOUN_TENTACLE_PARTS, NOUN_WALL_PANEL) && (_globals[kPlayerPersona] == 0)) {
		_vm->_dialogs->show(10446);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_SHIFT_INTO_BEAR) && _anim0ActvFl) {
		if (_wasBearFl)
			_vm->_dialogs->show(10457);
		else if (_amuletWorksFl)
			_vm->_dialogs->show(10459);
		else {
			_wasBearFl = true;
			_globals[kPlayerScore] += 2;
			_vm->_gameConv->run(1);
			_vm->_gameConv->exportValue(1);
			_vm->_gameConv->exportValue(0);
			_vm->_gameConv->exportValue(0);
			if (_globals[kLlanieStatus] != 2)
				_vm->_gameConv->exportValue(1);
			else
				_vm->_gameConv->exportValue(0);
		}
		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_MACMORN) || _action.isAction(VERB_TAKE, NOUN_SWORD)) && _anim0ActvFl) {
		_activateTimerFl = false;
		_pidStatus = 6;

		if (!_amuletWorksFl) {
			_globals[kPlayerScore] += 5;
			_vm->_gameConv->run(1);
			_vm->_gameConv->exportValue(0);
			_vm->_gameConv->exportValue(1);
			_vm->_gameConv->exportValue(0);
			if (_globals[kLlanieStatus] != 2)
				_vm->_gameConv->exportValue(1);
			else
				_vm->_gameConv->exportValue(0);

			_vm->_gameConv->hold();
		} else {
			_macStatus = 6;
			_game._player._stepEnabled = false;
		}
		_amuletWorksFl = true;
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_INVOKE, NOUN_AMULET) && _anim0ActvFl) {
		if (_amuletWorksFl) {
			_activateTimerFl = false;
			_pidStatus = 5;
			_globals[kPlayerScore] += 15;
			_globals[kAmuletStatus] = 2;
			_game._player._stepEnabled = false;

			_scene->freeAnimation(_globals._animationIndexes[1]);

			_globals._sequenceIndexes[14] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[14], false, -2);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[14], 6);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_CLOCK, 0);

			_globals._spriteIndexes[15] = _scene->_sprites.addSprites(formAnimName('e', 3), PALFLAG_ALL_TO_CLOSEST | PALFLAG_ANY_TO_CLOSEST);
			_globals._animationIndexes[1] = _scene->loadAnimation(formAnimName('m', 2), 0);
			_anim1ActvFl = false;
			_anim5ActvFl = true;
		} else
			_vm->_dialogs->showItem(OBJ_AMULET, 945, 0);

		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_ATTACK, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_CARVE_UP, NOUN_SWORD, NOUN_QUEEN_MOTHER) || _action.isAction(VERB_THRUST, NOUN_SWORD, NOUN_QUEEN_MOTHER)) {
		_vm->_dialogs->show(10458);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TALK_TO, NOUN_MACMORN)) {
		_vm->_dialogs->show(10464);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TALK_TO, NOUN_QUEEN_MOTHER)) {
		_vm->_dialogs->show(10463);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TALK_TO, NOUN_KING)) {
		_vm->_dialogs->show(10465);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_POUR_CONTENTS_OF, NOUN_MACMORN)) {
		_vm->_dialogs->show(10462);
		_action._inProgress = false;
		return;
	}


	if (_anim2ActvFl && (_action.isAction(VERB_WALK_ACROSS) || _action.isAction(VERB_WALK_TO))) {
		_vm->_dialogs->show(10445);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TAKE, NOUN_CANDLESTICK)) {
		_vm->_dialogs->show(10468);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_OPEN, NOUN_MUSIC_BOX) && _globals[kNoLoadWalker]) {
		_vm->_dialogs->show(10470);
		_action._inProgress = false;
		return;
	}
}

void Scene104::preActions() {
	if ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH))
	 && _action.isObject(NOUN_TAPESTRY) && (_scene->_customDest.x > 280))
		_game._player.walk(Common::Point(295, 145), FACING_NORTHEAST);

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM)
	 || _action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY)
	 || _action.isAction(VERB_WALK_THROUGH, NOUN_DOORWAY)
	 || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_OPEN) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY))
	 || ((_action.isAction(VERB_PULL) || _action.isAction(VERB_CLOSE) || _action.isAction(VERB_PUSH)) && _action.isObject(NOUN_TAPESTRY))
	 || ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL))
		 && (_action.isObject(NOUN_RUG) || _action.isObject(NOUN_FIREPLACE_SCREEN) || _action.isObject(NOUN_TROPHY) || _action.isObject(NOUN_LOVESEAT)))
	 || _action.isAction(VERB_OPEN, NOUN_READING_BENCH)) {
		if (_globals[kPlayerPersona] == 1)
			_game._player.cancelWalk();
	}

	if (_globals[kNoLoadWalker])
		_game._player._needToWalk = false;
}

void Scene104::handleFinalConversation() {
	bool interlocutorFl = false;
	bool heroFl = false;

	switch (_action._activeAction._verbId) {
	case 11:
		_deathTimer = 0;
		_clock = 0;
		_activateTimerFl = true;
		interlocutorFl = true;
		heroFl = true;
		break;

	case 14:
		if (!_game._trigger)
			_macStatus = 3;

		interlocutorFl = true;
		heroFl = true;
		break;

	case 17:
		_pidStatus = 3;
		_vm->_gameConv->hold();
		interlocutorFl = true;
		heroFl = true;
		break;

	case 20:
		if (!_game._trigger)
			_macStatus = 2;
		interlocutorFl = true;
		heroFl = true;
		break;

	case 30:
		_vm->_gameConv->setStartNode(31);
		_vm->_gameConv->stop();

		if (_globals[kLlanieStatus] == 2) {
			_globals._animationIndexes[3] = _scene->loadAnimation(formAnimName('l', 1), 0);
			_anim3ActvFl = true;
			_twinklesStatus = 1;
		}
		break;

	case 38:
		_globals[kEndOfGame] = true;
		_scene->_nextSceneId = 106;
		break;

	default:
		break;
	}

	switch (_game._trigger) {
	case 81:
		switch (_action._activeAction._verbId) {
		case 0:
		case 2:
		case 4:
		case 5:
		case 7:
		case 8:
		case 11:
		case 17:
			if (_macStatus == 0)
				_macStatus = 1;

			_pidStatus = 0;
			if (_queenStatus != 2)
				_queenStatus = 0;

			_kingStatus = 0;
			break;

		case 1:
		case 3:
		case 6:
		case 20:
		case 22:
		case 24:
		case 26:
		case 28:
		case 32:
		case 34:
		case 39:
		case 41:
		case 43:
			_kingStatus = 1;
			_pidStatus = 0;
			if (_queenStatus != 2)
				_queenStatus = 0;

			if (_macStatus == 1)
				_macStatus = 0;

			break;

		case 21:
		case 23:
		case 25:
		case 27:
		case 35:
		case 40:
		case 42:
			if (_queenStatus != 2)
				_queenStatus = 1;

			_pidStatus = 0;
			if (_macStatus == 1)
				_macStatus = 0;

			_kingStatus = 0;
			break;

		case 31:
		case 33:
			_twinklesStatus = 1;
			_pidStatus = 0;
			if (_queenStatus != 2)
				_queenStatus = 0;

			if (_macStatus == 1)
				_macStatus = 0;

			_kingStatus = 0;
			break;

		default:
			break;
		}
		break;

	case 83:
		if ((_action._activeAction._verbId == 8) || (_action._activeAction._verbId == 11))
			_pidStatus = 2;
		else
			_pidStatus = 1;

		if (_macStatus == 1)
			_macStatus = 0;

		if (_queenStatus != 2)
			_queenStatus = 0;

		_kingStatus = 0;
		break;

	default:
		break;
	}

	if (!heroFl)
		_vm->_gameConv->setHeroTrigger(83);

	if (!interlocutorFl)
		_vm->_gameConv->setInterlocutorTrigger(81);

	_kingCount = 0;
	_queenCount = 0;
	_macCount = 0;
	_twinklesCount = 0;
	_pidCount = 0;
}

void Scene104::handleKingAnimation() {
	if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() == _kingFrame)
		return;

	_kingFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_kingFrame) {
	case 14:
	case 21:
		switch (_kingStatus) {
		case 0:
			if (_kingCount > _vm->getRandomNumber(40, 50)) {
				_kingCount = 0;
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 13;
				else
					resetFrame = 14;
			} else {
				++_kingCount;
				resetFrame = 13;
			}
			break;

		case 1:
			resetFrame = 14;
			break;

		default:
			break;
		}
		break;

	case 16:
	case 17:
	case 18:
	case 19:
		switch (_kingStatus) {
		case 0:
			if (_kingCount > _vm->getRandomNumber(40, 50)) {
				_kingCount = 0;
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 15;
				else
					resetFrame = 19;
			} else {
				++_kingCount;
				resetFrame = 15;
			}
			break;

		case 1:
			resetFrame = _vm->getRandomNumber(16, 18);
			++_kingCount;
			if (_kingCount > 15) {
				_kingStatus = 0;
				_kingCount = 0;
				resetFrame = 15;
			}
			break;

		default:
			break;
		}
		break;

	case 22:
		if (_kingStatus == 2)
			resetFrame = 21;
		else
			resetFrame = 0;

		break;

	default:
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
		_kingFrame = resetFrame;
	}
}


void Scene104::handleMacAnimation1() {
	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame)
		return;

	_macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_macFrame) {
	case 1:
	case 2:
	case 7:
		switch (_macStatus) {
		case 0:
			resetFrame = 0;
			break;

		case 1:
			if (_macCount == 0) {
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 2;
				else
					resetFrame = 1;

				++_macCount;
			} else {
				resetFrame = _vm->getRandomNumber(0, 1);
				++_macCount;
				if (_macCount > 15) {
					_macStatus = 0;
					_macCount = 0;
					resetFrame = 0;
				}
			}
			break;

		case 2:
			resetFrame = 90;
			break;

		default:
			break;
		}
		break;

	case 3:
	case 4:
	case 5:
		switch (_macStatus) {
		case 0:
		case 2:
		case 3:
		case 4:
			resetFrame = 5;
			break;

		case 1:
			if (_macCount == 0) {
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 5;
				else
					resetFrame = 3;

				++_macCount;

			} else {
				resetFrame = _vm->getRandomNumber(3, 4);
				++_macCount;
				if (_macCount > 15) {
					_macStatus = 0;
					_macCount = 0;
					resetFrame = 5;
				}
			}
			break;

		default:
			break;
		}
		break;

	case 25:
		_game._player._stepEnabled = true;
		break;

	case 26:
	case 90:
	case 174:
		switch (_macStatus) {
		case 3:
			resetFrame = 76;
			_macStatus = 0;
			_game._player._stepEnabled = false;
			break;

		case 4:
			break;

		case 5:
			resetFrame = 147;
			_macStatus = 0;
			break;

		case 6:
			_pidFrame = 105;
			resetFrame = 26;
			_scene->setAnimFrame(_globals._animationIndexes[4], 105);
			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]);
			break;

		default:
			resetFrame = 25;
			break;
		}
		break;

	case 36:
		_globals._sequenceIndexes[13] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[13], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[13], 13);
		break;

	case 37:
		_scene->setAnimFrame(_globals._animationIndexes[4], 89);
		_pidFrame = 89;
		_pidStatus = 7;
		_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_ANIM, _globals._animationIndexes[1]);
		break;

	case 76:
		_vm->_gameConv->reset(1);
		_vm->_dialogs->show(10467);
		_globals[kNoLoadWalker] = false;
		_scene->_nextSceneId = 119;
		break;

	case 82:
		_pidStatus = 4;
		break;

	case 97:
		_activateTimerFl = true;
		_scene->deleteSequence(_globals._sequenceIndexes[5]);
		_globals._sequenceIndexes[5] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[5], false, 10, 1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 1);
		_scene->_sequences.setAnimRange(_globals._sequenceIndexes[5], -1, -2);
		_scene->_sequences.addSubEntry(_globals._sequenceIndexes[5], SEQUENCE_TRIGGER_EXPIRE, 0, 85);
		break;

	case 112:
		resetFrame = 8;
		_macStatus = 0;
		break;

	case 162:
		_vm->_gameConv->release();
		break;

	default:
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
		_macFrame = resetFrame;
	}
}


void Scene104::handleMacAnimation2() {

	if (_scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame() == _macFrame)
		return;

	_macFrame = _scene->_animation[_globals._animationIndexes[1]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_macFrame) {
	case 1:
		if (_macStatus != 4)
			resetFrame = 0;
		break;

	case 2:
		_scene->deleteSequence(_globals._sequenceIndexes[14]);
		_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[14], SYNC_ANIM, _globals._animationIndexes[1]);
		break;

	case 37:
		_scene->freeAnimation(_globals._animationIndexes[1]);
		_scene->_sprites.remove(_globals._spriteIndexes[15]);
		_anim5ActvFl = false;
		resetFrame = -1;

		_vm->_dialogs->show(10426);
		_vm->_sound->command(45);
		_vm->_gameConv->run(1);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(1);
		if (_globals[kLlanieStatus] != 2)
			_vm->_gameConv->exportValue(1);
		else
			_vm->_gameConv->exportValue(0);
		break;

	default:
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[1], resetFrame);
		_macFrame = resetFrame;
	}
}

void Scene104::handleQueenAnimation() {
	if (_scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame() == _queenFrame)
		return;

	_queenFrame = _scene->_animation[_globals._animationIndexes[2]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_queenFrame) {
	case 1:
	case 8:
	case 15:
	case 24:
		switch (_queenStatus) {
		case 0:
			if (_queenCount > _vm->getRandomNumber(40, 50)) {
				_queenCount = 0;
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 0;
				else
					resetFrame = 8;
			} else {
				++_queenCount;
				resetFrame = 0;
			}
			break;

		case 1:
			if (_vm->getRandomNumber(1,2) == 1)
				resetFrame = 1;
			else
				resetFrame = 15;

			_queenStatus = 0;
			break;

		case 2:
			resetFrame = 8;
			break;

		default:
			break;
		}
		break;

	case 12:
	case 29:
		switch (_queenStatus) {
		case 0:
			if (_queenCount > _vm->getRandomNumber(40, 50)) {
				_queenCount = 0;
				if (_vm->getRandomNumber(1,2) == 1)
					resetFrame = 11;
				else
					resetFrame = 12;
			} else {
				++_queenCount;
				resetFrame = 11;
			}
			break;

		case 1:
			resetFrame = 12;
			break;

		case 2:
			resetFrame = 24;
			break;

		default:
			break;
		}
		break;

	case 27:
		switch (_queenStatus) {
		case 0:
		case 1:
			resetFrame = 27;
			break;

		case 2:
			resetFrame = 26;
			break;

		case 3:
			resetFrame = 27;
			_queenStatus = 0;
			break;

		default:
			break;
		}
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[2], resetFrame);
		_queenFrame = resetFrame;
	}
}

void Scene104::handleTwinklesAnimation() {
	if (_scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame() == _twinklesFrame)
		return;

	_twinklesFrame = _scene->_animation[_globals._animationIndexes[3]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_twinklesFrame) {
	case 1:
		if (_twinklesStatus == 2)
			resetFrame = 0;
		break;

	case 10:
		_queenStatus = 2;
		break;

	case 28:
		_vm->_gameConv->run(1);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(0);
		_vm->_gameConv->exportValue(1);
		if (_globals[kLlanieStatus] != 2)
			_vm->_gameConv->exportValue(1);
		else
			_vm->_gameConv->exportValue(0);
		break;

	case 36:
		_queenStatus = 3;
		break;

	case 37:
	case 38:
	case 47:
		switch (_twinklesStatus) {
		case 0:
			if (_twinklesFrame != 37 && _twinklesFrame != 38)
				_twinklesFrame = 38;

			if (_twinklesCount > _vm->getRandomNumber(40, 50)) {
				_twinklesCount = 0;
				if (_vm->getRandomNumber(1, 2) == 1)
					resetFrame = 36;
				else
					resetFrame = 37;
			} else {
				++_twinklesCount;
				resetFrame = _twinklesFrame - 1;
			}
			break;

		case 1:
			resetFrame = 38;
			_twinklesStatus = 0;
			break;

		default:
			break;
		}
		break;

	default:
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[3], resetFrame);
		_twinklesFrame = resetFrame;
	}
}

void Scene104::handleDeathAnimation() {
	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _deathFrame)
		return;

	_deathFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame();

	if (_deathFrame == 11)
		_scene->playSpeech(7);
	else if (_deathFrame == 17)
		_scene->playSpeech(6);
}

void Scene104::handlePidAnimation() {
	if (_scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame() == _pidFrame)
		return;

	_pidFrame = _scene->_animation[_globals._animationIndexes[4]]->getCurrentFrame();
	int resetFrame = -1;

	switch (_pidFrame) {
	case 1:
	case 2:
	case 3:
	case 9:
	case 47:
	case 81:
		switch (_pidStatus) {
		case 0:
			resetFrame = 0;
			break;

		case 1:
			resetFrame = _vm->getRandomNumber(0, 2);
			++_pidCount;
			if (_pidCount > 20) {
				_pidStatus = 0;
				_pidCount = 0;
				resetFrame = 0;
			}
			break;

		case 2:
			resetFrame = 3;
			break;

		case 3:
			_activateTimerFl = false;
			resetFrame = 10;
			break;

		case 5:
			_game._player._stepEnabled = false;
			_activateTimerFl = false;
			resetFrame = 47;
			_pidStatus = 0;
			break;

		case 6:
			resetFrame = 81;
			break;

		case 8:
			_scene->freeAnimation(_globals._animationIndexes[1]);
			_scene->freeAnimation(_globals._animationIndexes[4]);
			_anim1ActvFl = false;
			_anim4ActvFl = false;
			_globals._animationIndexes[4] = _scene->loadAnimation(formAnimName('d', 2), 95);
			_anim6ActvFl = true;
			_game.syncTimers(SYNC_ANIM, _globals._animationIndexes[4], SYNC_CLOCK, 0);
			break;

		default:
			break;
		}
		break;

	case 4:
	case 5:
	case 6:
	case 7:
		if (_pidStatus == 2) {
			resetFrame = _vm->getRandomNumber(4, 6);
			++_pidCount;
			if (_pidCount > 20) {
				_pidStatus = 0;
				_pidCount = 0;
				resetFrame = 7;
			}
		} else
			resetFrame = 7;
		break;

	case 24:
		_vm->_gameConv->release();
		break;

	case 25:
		if (_pidStatus == 4) {
			resetFrame = 25;
			_pidStatus = 0;
		} else
			resetFrame = 24;
		break;

	case 46:
		_activateTimerFl = true;
		_clock = 0;
		_deathTimer = 0;
		_game._player._stepEnabled = true;
		break;

	case 60:
		resetFrame = 107;
		break;

	case 62:
		_macStatus = 4;
		break;

	case 88:
		if (_deathTimer < 1300)
			_macStatus = 5;
		break;

	case 89:
		if (_pidStatus == 5) {
			resetFrame = 55;
			_pidStatus = 0;
		} else if (_deathTimer >= 1300)
			_macStatus = 6;
		else {
			_pidDrawnSword = true;
			resetFrame = 88;
		}
		break;

	case 91:
		_scene->playSpeech(7);
		break;

	case 95:
		_scene->playSpeech(6);
		break;

	case 105:
		resetFrame = 104;
		break;

	case 106:
		if (_pidStatus == 7)
			resetFrame = 89;
		else
			resetFrame = 105;
		break;

	case 111:
		resetFrame = 60;
		break;

	default:
		break;
	}

	if (resetFrame >= 0) {
		_scene->setAnimFrame(_globals._animationIndexes[4], resetFrame);
		_pidFrame = resetFrame;
	}
}
/*------------------------------------------------------------------------*/

Scene105::Scene105(MADSEngine *vm) : Scene1xx(vm) {
	_maidTalkingFl = false;
	_sitUpFl = false;
	_goodNumberFl = false;

	_maidFrame = -1;
	_newStatus = -1;
	_previousStatus = -1;
	_maidHotspotId1 = -1;
	_maidHotspotId2 = -1;
	_bucketHotspotId = -1;
	_boneHotspotId = -1;
	_gobletHotspotId = -1;
}

void Scene105::synchronize(Common::Serializer &s) {
	Scene1xx::synchronize(s);

	s.syncAsByte(_maidTalkingFl);
	s.syncAsByte(_sitUpFl);
	s.syncAsByte(_goodNumberFl);

	s.syncAsSint16LE(_maidFrame);
	s.syncAsSint16LE(_newStatus);
	s.syncAsSint16LE(_previousStatus);
	s.syncAsSint16LE(_maidHotspotId1);
	s.syncAsSint16LE(_maidHotspotId2);
	s.syncAsSint16LE(_bucketHotspotId);
	s.syncAsSint16LE(_boneHotspotId);
	s.syncAsSint16LE(_gobletHotspotId);
}

void Scene105::setup() {
	setPlayerSpritesPrefix();
	setAAName();

	_scene->addActiveVocab(NOUN_SCULLERY_MAID);
	_scene->addActiveVocab(NOUN_BUCKET);
	_scene->addActiveVocab(VERB_WALK_TO);
	_scene->addActiveVocab(NOUN_BONE);
	_scene->addActiveVocab(NOUN_GOBLET);
}

void Scene105::enter() {
	_globals._spriteIndexes[1] = _scene->_sprites.addSprites(formAnimName('x', 0));
	_globals._spriteIndexes[2] = _scene->_sprites.addSprites(formAnimName('x', 1));
	_globals._spriteIndexes[3] = _scene->_sprites.addSprites(formAnimName('x', 2));
	_globals._spriteIndexes[4] = _scene->_sprites.addSprites("*KGRD_8");

	_globals._sequenceIndexes[1] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[1], false, 7, 0);
	_globals._sequenceIndexes[2] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[2], false, 7, 0, 3);

	_maidHotspotId1 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 123, 189 + 25, 123 + 11));
	_scene->_dynamicHotspots.setPosition(_maidHotspotId1, Common::Point(174, 151), FACING_NORTHEAST);
	_scene->_dynamicHotspots[_maidHotspotId1]._articleNumber = PREP_ON;

	_maidHotspotId2 = _scene->_dynamicHotspots.add(NOUN_SCULLERY_MAID, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(189, 134, 189 + 38, 134 + 9));
	_scene->_dynamicHotspots.setPosition(_maidHotspotId2, Common::Point(174, 151), FACING_NORTHEAST);
	_scene->_dynamicHotspots[_maidHotspotId2]._articleNumber = PREP_ON;

	_bucketHotspotId = _scene->_dynamicHotspots.add(NOUN_BUCKET, VERB_WALK_TO, SYNTAX_SINGULAR, EXT_NONE, Common::Rect(176, 137, 176 + 10, 137 + 8));
	_scene->_dynamicHotspots.setPosition(_bucketHotspotId, Common::Point(174, 151), FACING_NORTHEAST);

	if (_game._objects.isInRoom(OBJ_GOBLET)) {
		_globals._spriteIndexes[5] = _scene->_sprites.addSprites(formAnimName('p', 1));
		_globals._spriteIndexes[8] = _scene->_sprites.addSprites("*KGRM_6");
		_globals._sequenceIndexes[5] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[5], false, -1);
		_gobletHotspotId = _scene->_dynamicHotspots.add(NOUN_GOBLET, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[5], Common::Rect(0, 0, 0, 0));
		_scene->_sequences.setDepth(_globals._sequenceIndexes[5], 6);
		_scene->_dynamicHotspots.setPosition(_gobletHotspotId, Common::Point(63, 142), FACING_WEST);
	}

	if (_game._objects.isInRoom(OBJ_BONE)) {
		_globals._spriteIndexes[6] = _scene->_sprites.addSprites(formAnimName('p', 0));
		_globals._spriteIndexes[7] = _scene->_sprites.addSprites("*KGRL_6");
		_globals._sequenceIndexes[6] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[6], false, -1);
		_boneHotspotId = _scene->_dynamicHotspots.add(NOUN_BONE, VERB_WALK_TO, SYNTAX_SINGULAR, _globals._sequenceIndexes[6], Common::Rect(0, 0, 0, 0));
		_scene->_sequences.setDepth(_globals._sequenceIndexes[6], 6);
		_scene->_dynamicHotspots.setPosition(_boneHotspotId, Common::Point(255, 145), FACING_EAST);
	}

	_vm->_gameConv->load(2);
	_newStatus = 1;
	_previousStatus = 0;
	_maidTalkingFl = false;
	_sitUpFl = false;
	_goodNumberFl = false;
	_globals._animationIndexes[0] = _scene->loadAnimation(formAnimName('A',-1), 1);


	if (_scene->_priorSceneId == 106) {
		_game._player._playerPos = Common::Point(104, 152);
		_game._player._facing = FACING_NORTHEAST;
		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
	} else if (_scene->_priorSceneId != RETURNING_FROM_LOADING) {
		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, 6);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
		_game._player.firstWalk(Common::Point(120, 96), FACING_SOUTH, Common::Point(117, 108), FACING_SOUTH, false);
		_game._player.setWalkTrigger(70);
	} else {
		_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
		_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
	}

	sceneEntrySound();
}

void Scene105::step() {
	if (_scene->_animation[_globals._animationIndexes[0]]) {
		if (_scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame() != _maidFrame) {
			_maidFrame = _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame();
			int resetFrame = -1;

			if (_sitUpFl && !_maidTalkingFl) {
				_previousStatus = _newStatus;
				_newStatus = 4;
			}

			if (_maidTalkingFl) {
				_previousStatus = _newStatus;
				_newStatus = 5;
			}

			switch (_maidFrame) {
			case 16:
				if (_newStatus == 1) {
					_goodNumberFl = false;
					while (!_goodNumberFl)
						setRandomStatus();
				}

				if (_newStatus == 1)
					resetFrame = 1;
				else if ((_newStatus == 3 && !_sitUpFl) || _newStatus == 4)
					resetFrame = 53;
				else if ((_newStatus == 3) && (_sitUpFl))
					resetFrame = 24;
				break;

			case 24:
				if (_newStatus == 2) {
					_goodNumberFl = false;
					while (!_goodNumberFl)
						setRandomStatus();
				}

				if ((_newStatus == 3) || (_newStatus == 5))
					resetFrame = 53;
				else if (_newStatus == 1)
					resetFrame = 56;
				else if (_newStatus == 4)
					resetFrame = 53;

				break;

			case 32:
				if (_newStatus == 3) {
					_goodNumberFl = false;
					while (!_goodNumberFl)
						setRandomStatus();
				}

				if ((_newStatus == 1) || (_newStatus == 2))
					resetFrame = 57;
				else if (_newStatus == 4)
					resetFrame = 55;
				break;

			case 53:
				_maidTalkingFl = false;
				_goodNumberFl = false;
				while (!_goodNumberFl)
					setRandomStatus();

				if (_newStatus == 1)
					resetFrame = 60;
				else if (_newStatus == 2)
					resetFrame = 57;
				else if (_newStatus == 3)
					resetFrame = 63;
				else if (_newStatus == 4)
					resetFrame = 55;
				break;

			case 56:
				if (_newStatus == 4) {
					_goodNumberFl = false;
					while (!_goodNumberFl)
						setRandomWipebrow();
				}

				if (_newStatus == 4)
					resetFrame = 55;
				else if (_newStatus == 5)
					resetFrame = 32;
				else if (_newStatus == 3)
					resetFrame = 24;
				break;

			case 57:
				if (_newStatus == 1)
					resetFrame = 1;
				break;

			case 60:
				if (_newStatus == 1)
					resetFrame = 1;
				else if (_newStatus == 2)
					resetFrame = 16;
				break;

			case 63:
				if (_newStatus == 1)
					resetFrame = 1;
				break;

			case 64:
				resetFrame = 24;
				break;

			default:
				break;
			}

			if ((resetFrame >= 0) && (resetFrame != _scene->_animation[_globals._animationIndexes[0]]->getCurrentFrame())) {
				_scene->setAnimFrame(_globals._animationIndexes[0], resetFrame);
				_maidFrame = resetFrame;
			}
		}
	}

	if (_game._trigger >= 70) {
		switch (_game._trigger) {
		case 70:
			_scene->deleteSequence(_globals._sequenceIndexes[3]);
			_vm->_sound->command(25);
			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
			_scene->_sequences.setAnimRange(_globals._sequenceIndexes[3], 1, 5);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 71);
			break;

		case 71: {
			int seqIdx = _globals._sequenceIndexes[3];
			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 15);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
			_game._player._stepEnabled = true;
			}
			break;

		default:
			break;
		}
	}
}

void Scene105::actions() {
	if (_action._lookFlag) {
		_vm->_dialogs->show(10501);
		_action._inProgress = false;
		return;
	}

	if (_vm->_gameConv->activeConvId() == 2) {
		handleConversation();
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_HALLWAY) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_HALLWAY)) {
		switch (_game._trigger) {
		case 0:
			_game._player._stepEnabled = false;
			_game._player._visible = false;
			_globals._sequenceIndexes[4] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[4], false, 8, 2);
			_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[4],true);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_SPRITE, 2, 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[4], SEQUENCE_TRIGGER_EXPIRE, 0, 3);
			break;

		case 1:
			_scene->deleteSequence(_globals._sequenceIndexes[3]);
			_vm->_sound->command(24);
			_globals._sequenceIndexes[3] = _scene->_sequences.addSpriteCycle(_globals._spriteIndexes[3], false, 6, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
			break;

		case 2: {
			int seqIdx = _globals._sequenceIndexes[3];
			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -2);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 12);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
			}
			break;

		case 3:
			_game._player._visible = true;
			_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[4]);
			_scene->_sequences.addTimer(1,4);
			break;

		case 4:
			_game._player.walk(Common::Point(120, 96), FACING_NORTH);
			_game._player.setWalkTrigger(5);
			break;

		case 5:
			_scene->deleteSequence(_globals._sequenceIndexes[3]);
			_vm->_sound->command(25);
			_globals._sequenceIndexes[3] = _scene->_sequences.addReverseSpriteCycle(_globals._spriteIndexes[3], false, 7, 1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
			_scene->_sequences.addSubEntry(_globals._sequenceIndexes[3], SEQUENCE_TRIGGER_EXPIRE, 0, 6);
			break;

		case 6: {
			int seqIdx = _globals._sequenceIndexes[3];
			_globals._sequenceIndexes[3] = _scene->_sequences.addStampCycle(_globals._spriteIndexes[3], false, -1);
			_scene->_sequences.setDepth(_globals._sequenceIndexes[3], 1);
			_game.syncTimers(SYNC_SEQ, _globals._sequenceIndexes[3], SYNC_SEQ, seqIdx);
			_scene->_sequences.addTimer(6, 7);
			}
			break;

		case 7:
			_scene->_nextSceneId = 103;
			break;

		default:
			break;
		}
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_WALK_THROUGH, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_OPEN, NOUN_DOOR_TO_THRONE_ROOM) || _action.isAction(VERB_PULL, NOUN_DOOR_TO_THRONE_ROOM)) {
		_scene->_nextSceneId = 106;
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID)) {
		_vm->_gameConv->run(2);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_TAKE, NOUN_GOBLET)) {
		if (_game._trigger || !_game._objects.isInInventory(OBJ_GOBLET)) {
			switch (_game._trigger) {
			case 0:
				_game._player._stepEnabled = false;
				_game._player._visible = false;
				_globals._sequenceIndexes[8] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[8], true, 6, 2);
				_scene->_sequences.setAnimRange (_globals._sequenceIndexes[8], 1, 7);
				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[8], true);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_SPRITE, 7, 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[8], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
				break;

			case 1:
				_scene->deleteSequence (_globals._sequenceIndexes[5]);
				_scene->_dynamicHotspots.remove(_gobletHotspotId);
				_vm->_sound->command(26);
				_game._objects.addToInventory(OBJ_GOBLET);
				_vm->_dialogs->showItem(OBJ_GOBLET, 10519, 0);
				break;

			case 2:
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[8]);
				_globals[kPlayerScore] += 1;
				_game._player._visible = true;
				_game._player._stepEnabled = true;
				break;

			default:
				break;
			}
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_TAKE, NOUN_BONE) && _action._mainObjectSource == CAT_HOTSPOT) {
		if (_game._trigger || !_game._objects.isInInventory(OBJ_BONE)) {
			switch (_game._trigger) {
			case 0:
				_game._player._stepEnabled = false;
				_game._player._visible = false;
				_globals._sequenceIndexes[7] = _scene->_sequences.startPingPongCycle(_globals._spriteIndexes[7], false, 6, 2);
				_scene->_sequences.setSeqPlayer(_globals._sequenceIndexes[7], true);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_SPRITE, 6, 1);
				_scene->_sequences.addSubEntry(_globals._sequenceIndexes[7], SEQUENCE_TRIGGER_EXPIRE, 0, 2);
				break;

			case 1:
				_scene->deleteSequence (_globals._sequenceIndexes[6]);
				_vm->_sound->command(26);
				_scene->_dynamicHotspots.remove(_boneHotspotId);
				_game._objects.addToInventory(OBJ_BONE);
				_vm->_dialogs->showItem(OBJ_BONE, 10520, 0);
				break;

			case 2:
				_game.syncTimers(SYNC_PLAYER, 0, SYNC_SEQ, _globals._sequenceIndexes[7]);
				if (!(_globals[kPlayerScoreFlags] & 2048)) {
					_globals[kPlayerScoreFlags] |= 2048;
					_globals[kPlayerScore] += 1;
				}
				_game._player._visible = true;
				_game._player._stepEnabled = true;
				break;

			default:
				break;
			}
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_TAKE, NOUN_BONE) && _game._objects.isInInventory(OBJ_BONE) && (_action._mainObjectSource == CAT_HOTSPOT)) {
		_vm->_dialogs->show(40112);
		_action._inProgress = false;
		return;
	}

	if (_action.isAction(VERB_LOOK) || _action.isAction(VERB_LOOK_AT)) {

		if (_action.isObject(NOUN_FLOOR)) {
			_vm->_dialogs->show(10502);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BRAZIER)) {
			_vm->_dialogs->show(10503);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DINING_TABLE)) {
			if (_scene->_customDest.x <= 98) {
				if (_game._objects[OBJ_GOBLET]._roomNumber == _scene->_currentSceneId)
					_vm->_dialogs->show(10505);
				else
					_vm->_dialogs->show(10522);
			} else
				_vm->_dialogs->show(10504);

			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CHAIR)) {
			_vm->_dialogs->show(10507);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WINDOW)) {
			_vm->_dialogs->show(10508);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_TAPESTRY)) {
			_vm->_dialogs->show(10509);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_THRONE_ROOM)) {
			_vm->_dialogs->show(10511);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_WALL)) {
			_vm->_dialogs->show(10512);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DOOR_TO_HALLWAY)) {
			_vm->_dialogs->show(10513);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_DIVIDING_WALL)) {
			_vm->_dialogs->show(10514);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_CEILING)) {
			_vm->_dialogs->show(10515);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SCULLERY_MAID)) {
			_vm->_dialogs->show(10516);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_GOBLET) && _game._objects.isInRoom(OBJ_GOBLET)) {
			_vm->_dialogs->show(10517);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BONE) && _game._objects.isInRoom(OBJ_BONE)) {
			_vm->_dialogs->show(10518);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_SCONCE)) {
			_vm->_dialogs->show(10524);
			_action._inProgress = false;
			return;
		}

		if (_action.isObject(NOUN_BUCKET)) {
			_vm->_dialogs->show(10521);
			_action._inProgress = false;
			return;
		}
	}

	if (_action.isAction(VERB_TAKE, NOUN_SCULLERY_MAID)) {
		_vm->_dialogs->show(30);
		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_DINING_TABLE)) {
		_vm->_dialogs->show(10506);
		_action._inProgress = false;
		return;
	}

	if ((_action.isAction(VERB_PUSH) || _action.isAction(VERB_PULL)) && _action.isObject(NOUN_TAPESTRY)) {
		_vm->_dialogs->show(10510);
		_action._inProgress = false;
		return;
	}
}

void Scene105::preActions() {
	if (_action.isAction(VERB_TALK_TO, NOUN_SCULLERY_MAID))
		_sitUpFl = true;
}

void Scene105::setRandomStatus() {
	_previousStatus = _newStatus;
	int rndVal = _vm->getRandomNumber(1, 30);
	if (rndVal < 20) {
		_newStatus = 1;
		_goodNumberFl = true;
	} else if ((rndVal > 19) && (rndVal < 27) && (_previousStatus != 2)) {
		_newStatus = 2;
		_goodNumberFl = true;
	} else if (_previousStatus != 3) {
		_newStatus = 3;
		_goodNumberFl = true;
	}
}

void Scene105::setRandomWipebrow() {
	_previousStatus = _newStatus;

	if (_vm->getRandomNumber(1, 100) < 100) {
		_newStatus = 4;
		_goodNumberFl = true;
	} else if (_previousStatus != 3) {
		_newStatus = 3;
		_goodNumberFl = true;
	}
}

void Scene105::handleConversation() {
	if ((_action._activeAction._verbId == 0) && !_sitUpFl)
		_sitUpFl = true;

	if ((_action._activeAction._verbId == 1) || (_action._activeAction._verbId == 2)) {
		switch (_game._trigger) {
		case 0:
			_vm->_gameConv->setInterlocutorTrigger(1);
			break;

		case 1:
			_maidTalkingFl = true;
			_sitUpFl = false;
			_vm->_gameConv->setHeroTrigger(2);
			break;

		case 2:
			_maidTalkingFl = false;
			break;

		default:
			break;
		}
	}
}

/*------------------------------------------------------------------------*/

} // End of namespace Dragonsphere
} // End of namespace MADS