/* 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 "tsage/scenes.h"
#include "tsage/tsage.h"
#include "tsage/staticres.h"
#include "tsage/ringworld2/ringworld2_scenes3.h"

namespace TsAGE {

namespace Ringworld2 {

/*--------------------------------------------------------------------------
 * Scene 3100 -
 *
 *--------------------------------------------------------------------------*/
Scene3100::Scene3100() {
	_field412 = 0;
}

void Scene3100::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field412);
}

bool Scene3100::Guard::startAction(CursorType action, Event &event) {
	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	Scene3100 *scene = (Scene3100 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 10;
	R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
	scene->_stripManager.start(606, scene);
	return true;
}

void Scene3100::postInit(SceneObjectList *OwnerList) {
	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
		if (R2_GLOBALS._player._oldCharacterScene[1] == 3100) {
			loadScene(3101);
			R2_GLOBALS._uiElements._active = false;
		} else {
			loadScene(3100);
			g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
		}
	} else {
		loadScene(3100);
	}
	// Original was doing it twice in a row. Skipped.

	if (R2_GLOBALS._sceneManager._previousScene == 3255)
		R2_GLOBALS._uiElements._active = false;

	SceneExt::postInit();
	_stripManager.addSpeaker(&_guardSpeaker);

	if (R2_GLOBALS._sceneManager._previousScene == -1)
		R2_GLOBALS._sceneManager._previousScene = 1000;

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player._characterIndex = R2_QUINN;
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_item2.setDetails(Rect(212, 97, 320, 114), 3100, 3, -1, -1, 1, NULL);
	_item1.setDetails(Rect(0, 0, 480, 200), 3100, 0, -1, -1, 1, NULL);
	_field412 = 0;

	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
		if (R2_GLOBALS._player._oldCharacterScene[1] == 3100) {
			_sceneMode = 3102;
			_actor3.postInit();
			_actor4.postInit();
			_actor5.postInit();
			R2_GLOBALS._sound1.play(274);
			_sound1.fadeSound(130);
			setAction(&_sequenceManager, this, 3102, &_actor1, &R2_GLOBALS._player, &_actor3, &_actor4, &_actor5, NULL);
		} else {
			_guard.postInit();
			_guard.setup(3110, 5, 1);
			_guard.changeZoom(50);
			_guard.setPosition(Common::Point(10, 149));
			_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);

			_actor4.postInit();
			_actor4.setup(3103, 1, 1);
			_actor4.setPosition(Common::Point(278, 113));
			_actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
			_actor4.animate(ANIM_MODE_2, NULL);

			_field412 = 1;
			_actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);
			R2_GLOBALS._sound1.play(243);
			R2_GLOBALS._sound2.play(130);
			_sceneMode = 3100;

			setAction(&_sequenceManager, this, 3100, &R2_GLOBALS._player, &_actor1, NULL);
		}
	} else if (R2_GLOBALS._sceneManager._previousScene == 3255) {
		_sceneMode = 3101;
		_actor2.postInit();
		_actor3.postInit();
		_field412 = 1;

		setAction(&_sequenceManager, this, 3101, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
	} else {
		_guard.postInit();
		_guard.setup(3110, 5, 1);
		_guard.changeZoom(50);
		_guard.setPosition(Common::Point(10, 149));
		_guard.setDetails(3100, 6, -1, -1, 2, (SceneItem *)NULL);

		_actor4.postInit();
		_actor4.setup(3103, 1, 1);
		_actor4.setPosition(Common::Point(278, 113));
		_actor4.setDetails(3100, 9, -1, -1, 2, (SceneItem *)NULL);
		_actor4.animate(ANIM_MODE_2, NULL);

		_actor1.postInit();
		_actor1.setup(3104, 4, 1);
		_actor1.setPosition(Common::Point(143, 104));
		_actor1.setDetails(3100, 3, -1, -1, 2, (SceneItem *)NULL);

		R2_GLOBALS._player.setup(3110, 3, 1);
		R2_GLOBALS._player.changeZoom(50);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(160, 150));
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);

		R2_GLOBALS._sound1.play(243);
	}

	R2_GLOBALS._player._oldCharacterScene[1] = 3100;
}

void Scene3100::remove() {
	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
	R2_GLOBALS._sound1.fadeOut2(NULL);
	R2_GLOBALS._sound2.fadeOut2(NULL);
	_sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3100::signal() {
	switch (_sceneMode) {
	case 10:
		R2_GLOBALS._player.enableControl(CURSOR_TALK);
		break;
	case 3100:
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	case 3101:
		R2_GLOBALS._sceneManager.changeScene(1000);
		break;
	case 3102:
		R2_GLOBALS._player._oldCharacterScene[1] = 1000;
		R2_GLOBALS._sceneManager.changeScene(1000);
		break;
	default:
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	}
}

void Scene3100::dispatch() {
	if ((_sceneMode == 3100) && (_field412 != 0) && (R2_GLOBALS._player._position.y == 104)) {
		_field412 = 0;
		R2_GLOBALS._sound2.fadeOut2(NULL);
	}

	if ((_sceneMode == 3101) && (_field412 != 0) && (R2_GLOBALS._player._position.y < 104)) {
		_field412 = 0;
		_sound1.fadeSound(130);
	}

	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3125 - Ghouls dormitory
 *
 *--------------------------------------------------------------------------*/
Scene3125::Scene3125() {
	_field412 = 0;
}

void Scene3125::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field412);
}

bool Scene3125::Item1::startAction(CursorType action, Event &event) {
	Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (_useLineNum != -1)
			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	case CURSOR_LOOK:
		if (_lookLineNum != -1)
			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	case CURSOR_TALK:
		if (_talkLineNum != -1)
			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	default:
		return scene->display(action, event);
		break;
	}

	return true;
}

bool Scene3125::Item2::startAction(CursorType action, Event &event) {
	Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3125;
		scene->setAction(&scene->_sequenceManager1, scene, 3125, &R2_GLOBALS._player, NULL);
		break;
	case CURSOR_LOOK:
		SceneItem::display(3125, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	case CURSOR_TALK:
		SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	default:
		return SceneHotspot::startAction(action, event);
		break;
	}

	return true;
}

bool Scene3125::Item3::startAction(CursorType action, Event &event) {
	Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		R2_GLOBALS._player.disableControl();
		scene->_actor5.postInit();
		scene->_sceneMode = 3126;
		scene->setAction(&scene->_sequenceManager1, scene, 3126, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor3, &scene->_actor4, &scene->_actor1, &scene->_actor5, NULL);
		break;
	case CURSOR_LOOK:
		SceneItem::display(3125, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	case CURSOR_TALK:
		SceneItem::display(3125, 13, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		break;
	default:
		return SceneHotspot::startAction(action, event);
		break;
	}

	return true;
}

bool Scene3125::Actor1::startAction(CursorType action, Event &event) {
	Scene3125 *scene = (Scene3125 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3176;
	scene->setAction(&scene->_sequenceManager1, scene, 3176, &R2_GLOBALS._player, &scene->_actor1, NULL);
	return true;
}

void Scene3125::postInit(SceneObjectList *OwnerList) {
	loadScene(3125);
	SceneExt::postInit();
	_field412 = 0;

	_actor1.postInit();
	_actor1.setup(3175, 1, 1);
	_actor1.setPosition(Common::Point(35, 72));
	_actor1.setDetails(3125, 12, 13, -1, 1, (SceneItem *)NULL);

	_actor2.postInit();
	_actor2.setup(3126, 4, 1);
	_actor2.setPosition(Common::Point(71, 110));
	_actor2._numFrames = 20;

	_actor3.postInit();
	_actor3.setup(3126, 1, 1);
	_actor3.setPosition(Common::Point(215, 62));
	_actor3.fixPriority(71);

	_actor4.postInit();
	_actor4.setup(3126, 1, 1);
	_actor4.setPosition(Common::Point(171, 160));
	_actor4.fixPriority(201);

	_item3.setDetails(12, 3125, 9, 13, -1);
	_item2.setDetails(11, 3125, 15, 13, -1);
	_item1.setDetails(Rect(0, 0, 320, 200), 3125, 0, 1, 2, 1, NULL);

	R2_GLOBALS._sound1.play(262);
	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._oldCharacterScene[3] == 3250) {
		_sceneMode = 3175;
		setAction(&_sequenceManager1, this, 3175, &R2_GLOBALS._player, &_actor1, NULL);
	} else {
		R2_GLOBALS._player.setup(30, 5, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(89, 76));
		R2_GLOBALS._player.enableControl();
	}
	R2_GLOBALS._player._oldCharacterScene[3] = 3125;
}

void Scene3125::signal() {
	switch (_sceneMode) {
	case 3125:
		SceneItem::display(3125, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		_sceneMode = 3127;
		setAction(&_sequenceManager1, this, 3127, &R2_GLOBALS._player, NULL);
		break;
	case 3126:
		R2_GLOBALS.setFlag(79);
	// No break on purpose
	case 3176:
		R2_GLOBALS._sceneManager.changeScene(3250);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene3125::dispatch() {
	if ((_sceneMode == 3126) && (_actor2._frame == 2) && (_field412 == 0)) {
		_field412 = 1;
		R2_GLOBALS._sound1.play(265);
	}
	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3150 - Jail
 *
 *--------------------------------------------------------------------------*/
bool Scene3150::Item5::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (R2_INVENTORY.getObjectScene(47) != 3150)
			return SceneHotspot::startAction(action, event);

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3154;
		scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_actor3, NULL);
		return true;
	case R2_SUPERCONDUCTOR_WIRE:
		if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_GLOBALS.getFlag(75))) {
			R2_GLOBALS._player.disableControl();
			scene->_actor3.postInit();
			scene->_actor3._effect = 3;
			scene->_actor3._shade = 5;
			scene->_sceneMode = 3155;
			scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_actor3, NULL);
		} else {
			SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
		}
		return true;
	default:
		return SceneHotspot::startAction(action, event);
		break;
	}
}

bool Scene3150::Item6::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case R2_PILLOW:
		R2_GLOBALS._player.disableControl();
		scene->_actor4.postInit();
		scene->_actor4._effect = 6;
		scene->_actor4._shade = 3;
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3158;
		scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_actor4, NULL);
		return true;
	case R2_FOOD_TRAY:
		if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_INVENTORY.getObjectScene(40) == 3150) && (R2_GLOBALS.getFlag(75))) {
			scene->_actor5.postInit();
			scene->_actor5._effect = 6;
			scene->_actor5._shade = 3;
			scene->_actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);

			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 3159;
			scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_actor5, NULL);
		} else {
			SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
		}
	default:
		return SceneHotspot::startAction(action, event);
		break;
	}
}

bool Scene3150::Actor4::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (R2_GLOBALS.getFlag(75))
			return SceneActor::startAction(action, event);

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3151;
		scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_actor4, NULL);
		return true;
	case R2_FOOD_TRAY:
		return false;
	default:
		return SceneActor::startAction(action, event);
		break;
	}
}

bool Scene3150::Actor5::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
		return SceneActor::startAction(action ,event);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3157;
	scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_actor5, NULL);
	return true;
}

bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	if (action == CURSOR_USE) {
		if (R2_GLOBALS.getFlag(75)) {
			if (R2_GLOBALS.getFlag(77)) {
				R2_GLOBALS._player.disableControl();
				if (R2_GLOBALS.getFlag(76)) {
					scene->_sceneMode = 3152;
					scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
				} else {
					scene->_sceneMode = 3153;
					scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, &scene->_actor4, NULL);
				}
			} else {
				SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
			}
		} else {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 3152;
			scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
		}
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene3150::Actor7::startAction(CursorType action, Event &event) {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	if ((action == R2_LASER_HACKSAW) && (!R2_GLOBALS.getFlag(80))) {
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3160;
		scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_actor7, NULL);
		return true;
	}

	return SceneActor::startAction(action, event);
}

void Scene3150::Exit1::changeScene() {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	g_globals->_events.setCursor(CURSOR_ARROW);
	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 11;

	Common::Point pt(-20, 180);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3150::Exit2::changeScene() {
	Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	g_globals->_events.setCursor(CURSOR_ARROW);
	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 12;

	scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
}

void Scene3150::postInit(SceneObjectList *OwnerList) {
	loadScene(3150);
	if (R2_GLOBALS._sceneManager._previousScene == -1) {
		R2_INVENTORY.setObjectScene(35, 2000);
		R2_GLOBALS._player._oldCharacterScene[1] = 3100;
		R2_GLOBALS._player._oldCharacterScene[3] = 0;
		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
	}
	SceneExt::postInit();

	if (R2_GLOBALS.getFlag(78)) {
		_exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
		_exit1.setDest(Common::Point(70, 125));
	}

	if (R2_GLOBALS.getFlag(80)) {
		_exit2.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
		_exit2.setDest(Common::Point(241, 106));
	}

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.disableControl();

	_actor2.postInit();
	_actor2.setPosition(Common::Point(64, 139));
	if (R2_GLOBALS.getFlag(78)) {
		_actor2.setup(3151, 1, 5);
		_actor2.fixPriority(125);
	} else {
		_actor2.setup(3151, 1, 1);
		_actor2.setDetails(3150, 8, -1, 9, 1, (SceneItem *)NULL);
	}

	if (R2_GLOBALS.getFlag(78)) {
		_actor1.postInit();
		_actor1.setup(3154, 1, 16);
		_actor1.setPosition(Common::Point(104, 129));
		_actor1._effect = 6;
		_actor1._shade = 3;
		_actor1.setDetails(3150, 24, -1, -1, -1, (SceneItem *)NULL);
	}

	_actor7.postInit();
	_actor7.setup(3154, 5, 1);
	if (R2_GLOBALS.getFlag(80))
		_actor7.setPosition(Common::Point(264, 108));
	else
		_actor7.setPosition(Common::Point(264, 58));
	_actor7.fixPriority(50);
	_actor7.setDetails(3150, 17, -1, 19, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(41) == 3150) {
		_actor4.postInit();
		if (R2_GLOBALS.getFlag(75)) {
			if (R2_GLOBALS.getFlag(76)) {
				R2_GLOBALS._walkRegions.enableRegion(1);
				R2_GLOBALS._walkRegions.enableRegion(4);
				R2_GLOBALS._walkRegions.enableRegion(5);
				R2_GLOBALS._walkRegions.enableRegion(6);
				_actor4.setup(3152, 4, 10);
				_actor4.setDetails(3150, 14, -1, -1, 1, (SceneItem *)NULL);
			} else {
				_actor4.setup(3152, 7, 4);
				_actor4.setDetails(3150, 13, -1, -1, 1, (SceneItem *)NULL);
			}
			_actor4.fixPriority(110);
			_actor4.setPosition(Common::Point(83, 88));
			_actor4._effect = 6;
			_actor4._shade = 3;
		} else {
			_actor4.setup(3152, 7, 3);
			_actor4.setPosition(Common::Point(143, 70));
			_actor4.setDetails(3150, 15, -1, -1, 1, (SceneItem *)NULL);
		}
	}

	if (R2_INVENTORY.getObjectScene(47) == 3150) {
		_actor3.postInit();
		_actor3.setup(3152, 7, 1);
		_actor3.setPosition(Common::Point(73, 83));
	}

	if (R2_INVENTORY.getObjectScene(40) == 3150) {
		_actor3.postInit();
		_actor3.setup(3152, 7, 3);
		_actor3.setPosition(Common::Point(70, 55));
		_actor3.fixPriority(111);
		_actor3._effect = 6;
		_actor3._shade = 5;
	}

	if (R2_INVENTORY.getObjectScene(42) == 3150) {
		_actor5.postInit();
		if (R2_GLOBALS.getFlag(77)) {
			_actor5.setup(3152, 7, 8);
			_actor5.setPosition(Common::Point(82, 92));
			_actor5.fixPriority(111);
			_actor5._effect = 6;
			_actor5._shade = 3;
		} else {
			_actor5.setup(3152, 7, 7);
			_actor5.setPosition(Common::Point(155, 79));
		}
		_actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
	}

	_actor6.postInit();
	_actor6.setup(3152, 7, 6);
	_actor6.setPosition(Common::Point(98, 73));
	_actor6.setDetails(3150, 43, -1, -1, 1, (SceneItem *)NULL);

	_item2.setDetails(12, 3150, 10, -1, 12);
	_item3.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
	_item4.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
	_item5.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
	_item6.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
	_item1.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);

	switch (R2_GLOBALS._player._oldCharacterScene[3]) {
	case 0:
		_sceneMode = 3150;
		_actor1.postInit();
		_actor1._effect = 6;
		_actor1._shade = 5;
		setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_actor1, &_actor2, NULL);
		break;
	case 1200:
		_sceneMode = 3162;
		setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
		break;
	case 3275: {
		_sceneMode = 10;
		R2_GLOBALS._player.setup(30, 3, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);

		Common::Point pt(80, 125);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		break;
		}
	default:
		if ((R2_GLOBALS._v56AA0 == 1) && (R2_INVENTORY.getObjectScene(35) == 2000) && (R2_GLOBALS._player._oldCharacterScene[1] == 3100)) {
			++R2_GLOBALS._v56AA0;
			_sceneMode = 3156;
			_actor1.postInit();
			_actor1._effect = 6;
			_actor1._shade = 3;

			_actor2.postInit();
			_actor5.postInit();
			_actor5._effect = 6;
			_actor5._shade = 3;

			setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor5, NULL);
		} else {
			if (R2_GLOBALS._v56AA0 != 2)
				++R2_GLOBALS._v56AA0;

			R2_GLOBALS._player.setup(30, 3, 1);
			R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
			R2_GLOBALS._player.setPosition(Common::Point(155, 120));
			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
			R2_GLOBALS._player.enableControl();
		}
	}

	R2_GLOBALS._player._oldCharacterScene[3] = 3150;
}

void Scene3150::signal() {
	switch (_sceneMode) {
	case 11:
		R2_GLOBALS._sceneManager.changeScene(3275);
		break;
	case 12:
		R2_GLOBALS._sceneManager.changeScene(1200);
		break;
	case 3151:
		_actor1.remove();
		R2_INVENTORY.setObjectScene(41, 3);
		R2_GLOBALS._player.enableControl();
		break;
	case 3153:
		R2_GLOBALS.setFlag(76);
		_actor4.setDetails(3150, 14, -1, -1, 3, (SceneItem *)NULL);
		_actor1.postInit();
		_actor1.setDetails(3150, 24, -1, -1, 2, (SceneItem *)NULL);
		_sceneMode = 3161;
		setAction(&_sequenceManager, this, 3161, &_actor1, &_actor2, NULL);
		break;
	case 3154:
		_actor3.remove();
		R2_INVENTORY.setObjectScene(47, 3);
		R2_GLOBALS._player.enableControl();
		break;
	case 3155:
		R2_INVENTORY.setObjectScene(40, 3150);
		R2_GLOBALS._player.enableControl();
		break;
	case 3156:
		_actor5.setDetails(3150, 30, -1, -1, 2, (SceneItem *)NULL);
		R2_INVENTORY.setObjectScene(42, 3150);
		R2_GLOBALS._player.enableControl();
		break;
	case 3157:
		_actor5.remove();
		R2_INVENTORY.setObjectScene(42, 3);
		R2_GLOBALS._player.enableControl();
		break;
	case 3158:
		R2_GLOBALS.setFlag(75);
		R2_INVENTORY.setObjectScene(41, 3150);
		_actor4.fixPriority(110);
		_actor4.setDetails(3150, 13, -1, -1, 2, (SceneItem *)NULL);
		R2_GLOBALS._player.enableControl();
		break;
	case 3159:
		R2_GLOBALS.setFlag(77);
		R2_INVENTORY.setObjectScene(42, 3150);
		R2_GLOBALS._player.enableControl();
		break;
	case 3160:
		R2_INVENTORY.setObjectScene(52, 3150);
		R2_GLOBALS.setFlag(80);
		R2_GLOBALS._sceneManager.changeScene(1200);
		break;
	case 3161:
		R2_GLOBALS._sceneItems.remove(&_actor2);
		_exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
		_exit1.setDest(Common::Point(70, 125));
		R2_GLOBALS._walkRegions.enableRegion(1);
		R2_GLOBALS._walkRegions.enableRegion(4);
		R2_GLOBALS._walkRegions.enableRegion(5);
		R2_GLOBALS._walkRegions.enableRegion(6);
		R2_GLOBALS.setFlag(78);
		R2_GLOBALS._player.enableControl();
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene3150::dispatch() {
	if (_actor5._position.x == 155) {
		_actor5._effect = 0;
		_actor5._shade = 0;
	}

	if (_actor1._visage == 3154) {
		_actor1._effect = 0;
		_actor1._shade = 0;
	}

	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3175 - Autopsy room
 *
 *--------------------------------------------------------------------------*/
bool Scene3175::Item1::startAction(CursorType action, Event &event) {
	Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (_useLineNum != -1) {
			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_LOOK:
		if (_lookLineNum != -1) {
			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_TALK:
		if (_talkLineNum != -1) {
			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	default:
		break;
	}

	return scene->display(action, event);
}

bool Scene3175::Actor3::startAction(CursorType action, Event &event) {
	Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (_useLineNum != -1) {
			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_LOOK:
		if (_lookLineNum != -1) {
			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_TALK:
		if (_talkLineNum != -1) {
			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	default:
		break;
	}

	return scene->display(action, event);
}

bool Scene3175::Actor1::startAction(CursorType action, Event &event) {
	Scene3175 *scene = (Scene3175 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 3176;
		scene->setAction(&scene->_sequenceManager, scene, 3176, &R2_GLOBALS._player, &scene->_actor1, NULL);
		return true;
		break;
	case CURSOR_LOOK:
		SceneItem::display(3175, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		return true;
		break;
	case CURSOR_TALK:
		SceneItem::display(3175, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		return true;
		break;
	default:
		return SceneActor::startAction(action, event);
		break;
	}
}

void Scene3175::postInit(SceneObjectList *OwnerList) {
	loadScene(3175);
	SceneExt::postInit();

	_actor1.postInit();
	_actor1.setup(3175, 1, 1);
	_actor1.setPosition(Common::Point(35, 72));
	_actor1.setDetails(3175, 9, 10, -1, 1, (SceneItem *)NULL);

	_actor2.postInit();
	_actor2.setup(3175, 2, 1);
	_actor2.setPosition(Common::Point(87, 148));

	_actor3.postInit();
	_actor3.setup(3175, 3, 1);
	_actor3.setPosition(Common::Point(199, 117));
	_actor3.setDetails(3175, 15, 16, 17, 1, (SceneItem *)NULL);

	_item2.setDetails(12, 3175, 3, 1, 5);
	_item3.setDetails(11, 3175, 6, 7, 8);
	_item1.setDetails(Rect(0, 0, 320, 200), 3175, 0, 1, 2, 1, NULL);

	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._oldCharacterScene[3] == 3250) {
		R2_GLOBALS._player.setup(30, 5, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(126, 77));
		R2_GLOBALS._player.enableControl();
	} else {
		_sceneMode = 3175;
		setAction(&_sequenceManager, this, 3175, &R2_GLOBALS._player, &_actor1, NULL);
	}

	R2_GLOBALS._player._oldCharacterScene[3] = 3175;
}

void Scene3175::signal() {
	if (_sceneMode == 3176)
		R2_GLOBALS._sceneManager.changeScene(3250);
	else
		R2_GLOBALS._player.enableControl();
}

/*--------------------------------------------------------------------------
 * Scene 3200 - Cutscene : Guards - Discussion
 *
 *--------------------------------------------------------------------------*/
void Scene3200::postInit(SceneObjectList *OwnerList) {
	loadScene(3200);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_rockoSpeaker);
	_stripManager.addSpeaker(&_jockoSpeaker);
	_stripManager.addSpeaker(&_sockoSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor3.postInit();
	_actor2.postInit();

	setAction(&_sequenceManager, this, 3200 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
}

void Scene3200::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3210 - Cutscene : Captain and Private - Discussion
 *
 *--------------------------------------------------------------------------*/
void Scene3210::postInit(SceneObjectList *OwnerList) {
	loadScene(3210);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_privateSpeaker);
	_stripManager.addSpeaker(&_captainSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor2.postInit();

	setAction(&_sequenceManager, this, 3210 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
}

void Scene3210::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3220 - Cutscene : Guards in cargo zone
 *
 *--------------------------------------------------------------------------*/
void Scene3220::postInit(SceneObjectList *OwnerList) {
	loadScene(3220);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_rockoSpeaker);
	_stripManager.addSpeaker(&_jockoSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor2.postInit();

	setAction(&_sequenceManager, this, 3220 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
}

void Scene3220::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3230 - Cutscene : Guards on duty
 *
 *--------------------------------------------------------------------------*/
void Scene3230::postInit(SceneObjectList *OwnerList) {
	loadScene(3230);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_rockoSpeaker);
	_stripManager.addSpeaker(&_jockoSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor2.postInit();
	_actor3.postInit();

	setAction(&_sequenceManager, this, 3230 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, &_actor3, NULL);
}

void Scene3230::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3240 - Cutscene : Teal monolog
 *
 *--------------------------------------------------------------------------*/
void Scene3240::postInit(SceneObjectList *OwnerList) {
	loadScene(3240);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_tealSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor2.postInit();

	setAction(&_sequenceManager, this, 3240 + R2_GLOBALS._randomSource.getRandomNumber(1), &_actor1, &_actor2, NULL);
}

void Scene3240::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3245 - Cutscene : Discussions with Dr. Tomko
 *
 *--------------------------------------------------------------------------*/
void Scene3245::postInit(SceneObjectList *OwnerList) {
	loadScene(3245);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.addSpeaker(&_ralfSpeaker);
	_stripManager.addSpeaker(&_tomkoSpeaker);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor2.postInit();

	if (R2_GLOBALS._v56AA1 < 4)
		++R2_GLOBALS._v56AA1;

	if (R2_GLOBALS._v56AA1 >= 4) {
		SceneItem::display(1200, 7, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
		signal();
	} else {
		setAction(&_sequenceManager, this, 3244 + R2_GLOBALS._v56AA1, &_actor1, &_actor2, NULL);
	}
}

void Scene3245::signal() {
	R2_GLOBALS._sceneManager.changeScene(1200);
}

/*--------------------------------------------------------------------------
 * Scene 3250 - Room with large stasis field negator
 *
 *--------------------------------------------------------------------------*/
bool Scene3250::Item::startAction(CursorType action, Event &event) {
	Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;

	switch (action) {
	case CURSOR_USE:
		if (_useLineNum != -1) {
			SceneItem::display(_resNum, _useLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_LOOK:
		if (_lookLineNum != -1) {
			SceneItem::display(_resNum, _lookLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	case CURSOR_TALK:
		if (_talkLineNum != -1) {
			SceneItem::display(_resNum, _talkLineNum, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
			return true;
		}
		break;
	default:
		break;
	}

	return scene->display(action, event);
}

bool Scene3250::Actor::startAction(CursorType action, Event &event) {
	Scene3250 *scene = (Scene3250 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();

	switch(_position.x) {
	case 25:
		scene->_sceneMode = 3262;
		scene->setAction(&scene->_sequenceManager, scene, 3262, &R2_GLOBALS._player, &scene->_actor1, NULL);
		break;
	case 259:
		scene->_sceneMode = 3260;
		scene->setAction(&scene->_sequenceManager, scene, 3260, &R2_GLOBALS._player, &scene->_actor2, NULL);
		break;
	case 302:
		scene->_sceneMode = 3261;
		scene->setAction(&scene->_sequenceManager, scene, 3261, &R2_GLOBALS._player, &scene->_actor3, NULL);
		break;
	default:
		break;
	}
	return true;
}

void Scene3250::postInit(SceneObjectList *OwnerList) {
	loadScene(3250);

	if (R2_GLOBALS._sceneManager._previousScene == -1) {
		R2_GLOBALS._player._oldCharacterScene[3] = 1200;
		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
	}

	SceneExt::postInit();
	_actor1.postInit();
	_actor1.setup(3250, 6, 1);
	_actor1.setPosition(Common::Point(25, 148));
	_actor1.fixPriority(10);
	_actor1.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);

	_actor2.postInit();
	_actor2.setup(3250, 4, 1);
	_actor2.setPosition(Common::Point(259, 126));
	_actor2.fixPriority(10);
	_actor2.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);

	_actor3.postInit();
	_actor3.setup(3250, 5, 1);
	_actor3.setPosition(Common::Point(302, 138));
	_actor3.fixPriority(10);
	_actor3.setDetails(3250, 9, 10, -1, 1, (SceneItem *)NULL);

	_item3.setDetails(Rect(119, 111, 149, 168), 3250, 6, 7, 2, 1, NULL);
	_item2.setDetails(Rect(58, 85, 231, 138), 3250, 12, 7, 2, 1, NULL);
	_item4.setDetails(12, 3250, 3, 1, 2);
	_item1.setDetails(Rect(0, 0, 320, 200), 3250, 0, 1, 2, 1, NULL);

	R2_GLOBALS._player.postInit();

	switch (R2_GLOBALS._player._oldCharacterScene[3]) {
	case 1200:
		_sceneMode = 3250;
		_actor4.postInit();
		R2_GLOBALS._player._effect = 0;
		setAction(&_sequenceManager, this, 3250, &R2_GLOBALS._player, &_actor4, NULL);
		break;
	case 3125:
		if (R2_GLOBALS.getFlag(79)) {
			_sceneMode = 3254;
			_actor5.postInit();
			_actor5._effect = 1;
			_actor6.postInit();
			_actor6._effect = 1;
			_actor7.postInit();
			_actor7._effect = 1;
			setAction(&_sequenceManager, this, 3254, &R2_GLOBALS._player, &_actor3, &_actor5, &_actor6, &_actor7, &_actor1, NULL);
		} else {
			_sceneMode = 3252;
			setAction(&_sequenceManager, this, 3252, &R2_GLOBALS._player, &_actor3, NULL);
		}
		break;
	case 3175:
		_sceneMode = 3251;
		setAction(&_sequenceManager, this, 3251, &R2_GLOBALS._player, &_actor2, NULL);
		break;
	case 3255:
		_sceneMode = 3253;
		setAction(&_sequenceManager, this, 3253, &R2_GLOBALS._player, &_actor1, NULL);
		break;
	default:
		R2_GLOBALS._player.setup(31, 3, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(185, 150));
		R2_GLOBALS._player.enableControl();
		break;
	}

	R2_GLOBALS._player._oldCharacterScene[3] = 3250;
}

void Scene3250::signal() {
	switch(_sceneMode) {
	case 3250:
		R2_GLOBALS._player._effect = 1;
		R2_GLOBALS._player.enableControl();
		break;
	case 3254:
	//No break on purpose
	case 3262:
		R2_GLOBALS._sceneManager.changeScene(3255);
		break;
	case 3260:
		R2_GLOBALS._sceneManager.changeScene(3175);
		break;
	case 3261:
		R2_GLOBALS._sceneManager.changeScene(3125);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene3250::dispatch() {
	if ((R2_GLOBALS._player._visage == 3250) && (R2_GLOBALS._player._strip == 3) && (R2_GLOBALS._player._effect == 0)) {
		R2_GLOBALS._player._effect = 6;
		R2_GLOBALS._player._shade = 6;
	}

	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3255 -
 *
 *--------------------------------------------------------------------------*/
void Scene3255::postInit(SceneObjectList *OwnerList) {
	loadScene(3255);
	SceneExt::postInit();

	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);

	if (R2_GLOBALS._sceneManager._previousScene == -1)
		R2_GLOBALS.setFlag(79);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.disableControl();

	if (R2_GLOBALS.getFlag(79)) {
		R2_GLOBALS._sound1.play(267);
		R2_GLOBALS._sound2.play(268);
		_sceneMode = 3257;
		_actor3.postInit();
		_actor4.postInit();
		_actor4._effect = 1;
		setAction(&_sequenceManager, this, 3257, &R2_GLOBALS._player, &_actor4, &_actor3, NULL);
	} else {
		_actor1.postInit();
		_actor1.setup(303, 1, 1);
		_actor1.setPosition(Common::Point(208, 128));
		_actor2.postInit();
		_actor2.setup(3107, 3, 1);
		_actor2.setPosition(Common::Point(230, 127));
		_sceneMode = 3255;
		setAction(&_sequenceManager, this, 3255, &R2_GLOBALS._player, NULL);
	}
	R2_GLOBALS._player._oldCharacterScene[3] = 3255;
}

void Scene3255::signal() {
	switch (_sceneMode) {
	case 10:
		_sceneMode = 3258;
		_actor5.postInit();
		_actor6.postInit();
		_actor7.postInit();
		setAction(&_sequenceManager, this, 3258, &R2_GLOBALS._player, &_actor4, &_actor3, &_actor5, &_actor6, &_actor7, NULL);
		break;
	case 3256:
		R2_GLOBALS._sceneManager.changeScene(3250);
		break;
	case 3257:
		_sceneMode = 10;
		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
		_stripManager.start(607, this);
		break;
	case 3258:
		R2_GLOBALS._sceneManager.changeScene(3100);
		break;
	default:
		SceneItem::display(3255, 0, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
		_sceneMode = 3256;
		setAction(&_sequenceManager, this, 3256, &R2_GLOBALS._player, NULL);
	}
}

void Scene3255::dispatch() {
	if (R2_GLOBALS.getFlag(79)) {
		if (_actor5._position.y >= 95) {
			if (_actor5._position.y <= 110)
				_actor5._shade = 6 - (_actor5._position.y - 95) / 3;
			else
				_actor5._effect = 1;
		} else {
			_actor5._effect = 6;
			_actor5._shade = 6;
		}

		if (_actor6._position.y >= 95) {
			if (_actor6._position.y <= 110)
				_actor6._shade = 6 - (_actor6._position.y - 95) / 3;
			else
				_actor6._effect = 1;
		} else {
			_actor6._effect = 6;
			_actor6._shade = 6;
		}

		if (_actor7._position.y >= 95) {
			if (_actor7._position.y <= 110)
				_actor7._shade = 6 - (_actor7._position.y - 95) / 3;
			else
				_actor7._effect = 1;
		} else {
			_actor7._effect = 6;
			_actor7._shade = 6;
		}
	}

	if ((R2_GLOBALS._player._position.x > 250) && (R2_GLOBALS._player._shade == 1)) {
		R2_GLOBALS._player._effect = 6;
		_actor4._effect = 6;
	}
	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3260 - Computer room
 *
 *--------------------------------------------------------------------------*/
bool Scene3260::Actor13::startAction(CursorType action, Event &event) {
	Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3271;
	scene->setAction(&scene->_sequenceManager, scene, 3271, &R2_GLOBALS._player, &scene->_actor13, NULL);
	return true;
}

bool Scene3260::Actor14::startAction(CursorType action, Event &event) {
	Scene3260 *scene = (Scene3260 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3272;
	scene->setAction(&scene->_sequenceManager, scene, 3272, &R2_GLOBALS._player, &scene->_actor14, NULL);
	return true;
}

void Scene3260::Action1::signal() {
	SceneObjectExt *fmtObj = (SceneObjectExt *) _endHandler;

	fmtObj->setFrame(R2_GLOBALS._randomSource.getRandomNumber(6));
	setDelay(120 + R2_GLOBALS._randomSource.getRandomNumber(179));
}

void Scene3260::postInit(SceneObjectList *OwnerList) {
	loadScene(3260);
	R2_GLOBALS._player._characterIndex = R2_MIRANDA;
	SceneExt::postInit();
	R2_GLOBALS._sound1.play(285);

	_actor13.postInit();
	_actor13.setup(3260, 6, 1);
	_actor13.setPosition(Common::Point(40, 106));
	_actor13.setDetails(3260, 18, 1, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(52) == 3260) {
		_actor14.postInit();
		_actor14.setup(3260, 7, 1);
		_actor14.setPosition(Common::Point(202, 66));
		_actor14.setDetails(3260, 12, 1, -1, 1, (SceneItem *)NULL);
	}

	_actor1.postInit();
	_actor1.setup(3260, 1, 1);
	_actor1.setPosition(Common::Point(93, 73));
	_actor1.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor1.setAction(&_action1, &_actor1);

	_actor2.postInit();
	_actor2.setup(3260, 2, 1);
	_actor2.setPosition(Common::Point(142, 63));
	_actor2.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor2.setAction(&_action2, &_actor2);

	_actor3.postInit();
	_actor3.setup(3260, 2, 1);
	_actor3.setPosition(Common::Point(166, 54));
	_actor3.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor3.setAction(&_action3, &_actor3);

	_actor4.postInit();
	_actor4.setup(3260, 2, 1);
	_actor4.setPosition(Common::Point(190, 46));
	_actor4.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor4.setAction(&_action4, &_actor4);

	_actor5.postInit();
	_actor5.setup(3260, 2, 1);
	_actor5.setPosition(Common::Point(142, 39));
	_actor5.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor5.setAction(&_action5, &_actor5);

	_actor6.postInit();
	_actor6.setup(3260, 2, 1);
	_actor6.setPosition(Common::Point(166, 30));
	_actor6.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor6.setAction(&_action6, &_actor6);

	_actor7.postInit();
	_actor7.setup(3260, 2, 1);
	_actor7.setPosition(Common::Point(190, 22));
	_actor7.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor7.setAction(&_action7, &_actor7);

	_actor8.postInit();
	_actor8.setup(3260, 2, 1);
	_actor8.setPosition(Common::Point(142, 14));
	_actor8.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor8.setAction(&_action8, &_actor8);

	_actor9.postInit();
	_actor9.setup(3260, 2, 1);
	_actor9.setPosition(Common::Point(166, 6));
	_actor9.setDetails(3260, 3, 1, 5, 1, (SceneItem *)NULL);
	_actor9.setAction(&_action9, &_actor9);

	_actor10.postInit();
	_actor10.setup(3260, 3, 1);
	_actor10.setPosition(Common::Point(265, 163));
	_actor10.fixPriority(180);
	_actor10._numFrames = 10;
	_actor10.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
	_actor10.animate(ANIM_MODE_2, NULL);

	_actor11.postInit();
	_actor11.setup(3260, 4, 1);
	_actor11.setPosition(Common::Point(127, 108));
	_actor11.fixPriority(120);
	_actor11.setAction(&_action11, &_actor11);
	_actor11._numFrames = 15;
	_actor11.setDetails(3260, 6, 1, 8, 1, (SceneItem *)NULL);
	_actor11.animate(ANIM_MODE_2, NULL);

	_actor12.postInit();
	_actor12.setup(3260, 5, 1);
	_actor12.setPosition(Common::Point(274, 65));
	_actor12.setAction(&_action12, &_actor12);
	_actor12._numFrames = 5;
	_actor12.setDetails(3260, 9, 1, 11, 1, (SceneItem *)NULL);
	_actor12.animate(ANIM_MODE_2, NULL);

	_item1.setDetails(Rect(0, 0, 320, 200), 3260, 0, 1, 2, 1, NULL);
	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._oldCharacterScene[3] == 3275) {
		_sceneMode = 3270;
		setAction(&_sequenceManager, this, 3270, &R2_GLOBALS._player, &_actor13, NULL);
	} else {
		R2_GLOBALS._player.setup(30, 5, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(53, 113));
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		R2_GLOBALS._player.enableControl();
	}
	R2_GLOBALS._player._oldCharacterScene[3] = 3260;
}

void Scene3260::remove() {
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3260::signal() {
	switch (_sceneMode) {
	case 3271:
		R2_GLOBALS._sceneManager.changeScene(3275);
		break;
	case 3272:
		_sceneMode = 3273;
		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
		SceneItem::display(3260, 15, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, -999);
		R2_GLOBALS._player.disableControl();
		R2_INVENTORY.setObjectScene(52, 3);
		R2_INVENTORY.setObjectScene(43, 3);
		setAction(&_sequenceManager, this, 3273, &R2_GLOBALS._player, &_actor14, NULL);
		break;
	case 3273:
		_actor4.remove();
		R2_GLOBALS._player.enableControl();
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3275 - Hall
 *
 *--------------------------------------------------------------------------*/
bool Scene3275::Actor2::startAction(CursorType action, Event &event) {
	Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3275;
	scene->setAction(&scene->_sequenceManager, scene, 3275, &R2_GLOBALS._player, &scene->_actor2, NULL);
	return true;
}

void Scene3275::Exit1::changeScene() {
	Scene3275 *scene = (Scene3275 *)R2_GLOBALS._sceneManager._scene;

	scene->_sceneMode = 0;
	g_globals->_events.setCursor(CURSOR_ARROW);
	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 10;
	Common::Point pt(418, 118);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3275::postInit(SceneObjectList *OwnerList) {
	loadScene(3275);

	if (R2_GLOBALS._sceneManager._previousScene == -1)
		R2_GLOBALS._sceneManager._previousScene = 3260;

	if (R2_GLOBALS._sceneManager._previousScene == 3150)
		g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
	else
		g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));

	SceneExt::postInit();
	_exit1.setDetails(Rect(398, 60, 439, 118), SHADECURSOR_UP, 3150);
	_exit1.setDest(Common::Point(418, 128));

	_actor1.postInit();
	_actor1.setup(3275, 1, 7);
	_actor1.setPosition(Common::Point(419, 119));

	_actor2.postInit();
	_actor2.setup(3275, 2, 1);
	_actor2.setPosition(Common::Point(56, 118));
	_actor2.setDetails(3275, 3, 4, -1, 1, (SceneItem *)NULL);

	_item2.setDetails(Rect(153, 58, 200, 120), 3275, 6, 7, 8, 1, NULL);
	_item3.setDetails(Rect(275, 58, 331, 120), 3275, 6, 7, 8, 1, NULL);
	_item4.setDetails(Rect(0, 66, 22, 127), 3275, 9, 10, 11, 1, NULL);
	_item5.setDetails(Rect(457, 66, 480, 127), 3275, 9, 10, 11, 1, NULL);
	_item1.setDetails(Rect(0, 0, 480, 200), 3275, 0, 1, 2, 1, NULL);

	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.disableControl();
	if (R2_GLOBALS._player._oldCharacterScene[3] == 3150) {
		_sceneMode = 11;
		R2_GLOBALS._player.setup(30, 3, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(418, 118));
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		Common::Point pt(418, 128);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
	} else if (R2_GLOBALS._player._oldCharacterScene[3] == 3260) {
		_sceneMode = 3276;
		setAction(&_sequenceManager, this, 3276, &R2_GLOBALS._player, &_actor2, NULL);
	} else {
		R2_GLOBALS._player.setup(30, 3, 1);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(245, 135));
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		R2_GLOBALS._player.enableControl();
	}
	R2_GLOBALS._player._oldCharacterScene[3] = 3275;
}

void Scene3275::signal() {
	switch (_sceneMode) {
	case 10:
		R2_GLOBALS._sceneManager.changeScene(3150);
		break;
	case 3275:
		R2_GLOBALS._sceneManager.changeScene(3260);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3350 - Cutscene - Ship landing
 *
 *--------------------------------------------------------------------------*/
void Scene3350::postInit(SceneObjectList *OwnerList) {
	loadScene(3350);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();
	R2_GLOBALS._sound2.play(310);

	_rotation = R2_GLOBALS._scenePalette.addRotation(176, 203, 1);
	_rotation->setDelay(3);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	_actor1.hide();
	_actor2.postInit();
	_actor2.hide();
	_actor3.postInit();
	_actor3.hide();
	_actor4.postInit();
	_actor4.hide();
	_actor9.postInit();
	_actor9.hide();
	_actor8.postInit();
	_actor8.hide();
	_actor5.postInit();
	_actor5.hide();
	_actor6.postInit();
	_actor6.hide();
	_actor7.postInit();
	_actor7.hide();

	_sceneMode = 3350;
	setAction(&_sequenceManager, this, _sceneMode, &_actor5, &_actor6, &_actor7, NULL);
}

void Scene3350::remove() {
	R2_GLOBALS._sound2.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3350::signal() {
	switch (_sceneMode) {
	case 3350:
		_sceneMode = 3351;
		setAction(&_sequenceManager, this, 3351, &_actor4, &_actor9, &_actor8, NULL);
		break;
	case 3351:
		_sceneMode = 3352;
		setAction(&_sequenceManager, this, 3352, &_actor4, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
	case 3352:
		R2_GLOBALS._sceneManager.changeScene(3395);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3375 -
 *
 *--------------------------------------------------------------------------*/
Scene3375::Scene3375() {
	_field1488 = _field1492 = 0;
	for (int i = 0; i < 4; ++i)
		_field148A[i] = 0;
}

void Scene3375::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field1488);
	s.syncAsSint16LE(_field1492);
	for (int i = 0; i < 4; ++i)
		s.syncAsSint16LE(_field148A[i]);
}

void Scene3375::subFC696(int sceneMode) {
	switch (sceneMode) {
	case 3379:
		R2_GLOBALS._player.setPosition(Common::Point(0, 155));
		_actor1.setPosition(Common::Point(-20, 163));
		_actor2.setPosition(Common::Point(-5, 150));
		_actor3.setPosition(Common::Point(-20, 152));
		break;
	case 3380:
		++R2_GLOBALS._v56A9E;
		if (R2_GLOBALS._v56A9E >= 4)
			R2_GLOBALS._v56A9E = 0;

		loadScene(_field148A[R2_GLOBALS._v56A9E]);

		R2_GLOBALS._uiElements.show();
		R2_GLOBALS._player.setStrip(4);
		R2_GLOBALS._player.setPosition(Common::Point(148, 230));

		_actor1.setPosition(Common::Point(191, 274));
		_actor1._effect = 1;
		_actor2.setPosition(Common::Point(124, 255));
		_actor2._effect = 1;
		_actor3.setPosition(Common::Point(155, 245));
		_actor3._effect = 1;
		break;
	case 3381:
		--R2_GLOBALS._v56A9E;
		if (R2_GLOBALS._v56A9E < 0)
			R2_GLOBALS._v56A9E = 3;

		loadScene(_field148A[R2_GLOBALS._v56A9E]);

		R2_GLOBALS._uiElements.show();
		R2_GLOBALS._player.setStrip(6);
		R2_GLOBALS._player.setPosition(Common::Point(201, 131));

		_actor1.setPosition(Common::Point(231, 127));
		_actor1._effect = 1;
		_actor2.setPosition(Common::Point(231, 127));
		_actor2._effect = 1;
		_actor3.setPosition(Common::Point(231, 127));
		_actor3._effect = 1;
		break;
	default:
		R2_GLOBALS._player.setPosition(Common::Point(192, 155));

		_actor1.setPosition(Common::Point(138, 134));
		_actor2.setPosition(Common::Point(110, 139));
		_actor3.setPosition(Common::Point(125, 142));
		break;
	}

	if (R2_GLOBALS._v56A9E == 2) {
		R2_GLOBALS._sceneItems.remove(&_actor4);
		for (int i = 0; i <= 12; i++)
			R2_GLOBALS._sceneItems.remove(&_itemArray[i]);
		R2_GLOBALS._sceneItems.remove(&_item1);

		_actor4.show();
		_actor4.setDetails(3375, 9, 10, -1, 1, (SceneItem *)NULL);

		for (int i = 0; i <= 12; i++)
			_itemArray[i].setDetails(3375, 3, -1, -1);

		_item1.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, -1, 1, NULL);
	} else {
		_actor4.hide();
		R2_GLOBALS._sceneItems.remove(&_actor4);
	}

	if (_sceneMode == 0)
		signal();
	else
		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
}

bool Scene3375::Actor1::startAction(CursorType action, Event &event) {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 2)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3304, scene);

	return true;
}

bool Scene3375::Actor2::startAction(CursorType action, Event &event) {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 3)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3301, scene);

	return true;
}

bool Scene3375::Actor3::startAction(CursorType action, Event &event) {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	scene->_stripManager.start(3303, scene);

	return true;
}

bool Scene3375::Actor4::startAction(CursorType action, Event &event) {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	if (R2_GLOBALS._v56A9E != 0) {
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(3);
	} else {
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
	}
	R2_GLOBALS._walkRegions.disableRegion(6);
	R2_GLOBALS._walkRegions.disableRegion(7);
	R2_GLOBALS._walkRegions.disableRegion(8);

	R2_GLOBALS._player.disableControl(CURSOR_ARROW);

	scene->_sceneMode = 3375;
	scene->setAction(&scene->_sequenceManager, scene, 3375, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);

	return true;
}

void Scene3375::Exit1::changeScene() {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	_moving = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_sceneMode = 3376;
	if (R2_GLOBALS._v56A9E != 0) {
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(3);
	} else {
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
	}
	if (scene->_actor1._position.y != 163) {
		R2_GLOBALS._player.setStrip(-1);
		scene->_actor1.setStrip2(-1);
		scene->_actor2.setStrip2(-1);
		scene->_actor3.setStrip2(-1);
		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
	} else {
		R2_GLOBALS._player.setStrip2(2);
		scene->_actor1.setStrip2(2);
		scene->_actor2.setStrip2(2);
		scene->_actor3.setStrip2(2);
		R2_GLOBALS._sound2.play(314);

		Common::Point pt(50, 150);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, scene);
	}
}

void Scene3375::Exit2::changeScene() {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	_moving = false;
	R2_GLOBALS._player._effect = 6;
	R2_GLOBALS._player._shade = 4;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);

	scene->_sceneMode = 3377;
	scene->_field1488 = 3381;

	if (R2_GLOBALS._v56A9E != 0) {
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(3);
	} else {
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
	}
	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
}

void Scene3375::Exit3::changeScene() {
	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;

	_moving = false;
	R2_GLOBALS._player._effect = 6;
	R2_GLOBALS._player._shade = 4;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);

	scene->_sceneMode = 3378;
	scene->_field1488 = 3380;

	if (R2_GLOBALS._v56A9E != 0) {
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(3);
	} else {
		R2_GLOBALS._walkRegions.disableRegion(1);
		R2_GLOBALS._walkRegions.disableRegion(3);
		R2_GLOBALS._walkRegions.disableRegion(4);
	}
	scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
}

void Scene3375::postInit(SceneObjectList *OwnerList) {
	_field148A[0] = 3376;
	_field148A[1] = 3377;
	_field148A[2] = 3375;
	_field148A[3] = 3378;

	loadScene(_field148A[R2_GLOBALS._v56A9E]);
	SceneExt::postInit();

	R2_GLOBALS._sound1.play(313);

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);

	R2_GLOBALS._player._characterScene[1] = 3375;
	R2_GLOBALS._player._characterScene[2] = 3375;
	R2_GLOBALS._player._characterScene[3] = 3375;

	setZoomPercents(126, 55, 200, 167);
	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._characterIndex == 2) {
		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
	} else {
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
	}
	R2_GLOBALS._player.changeZoom(-1);

	switch (R2_GLOBALS._player._characterIndex) {
	case 2:
		if (R2_GLOBALS._sceneManager._previousScene == 3385)
			R2_GLOBALS._player.setup(20, 1, 1);
		else
			R2_GLOBALS._player.setup(20, 3, 1);
		break;
	case 3:
		if (R2_GLOBALS._sceneManager._previousScene == 3385)
			R2_GLOBALS._player.setup(30, 1, 1);
		else
			R2_GLOBALS._player.setup(30, 3, 1);
		break;
	default:
		if (R2_GLOBALS._sceneManager._previousScene == 3385)
			R2_GLOBALS._player.setup(10, 1, 1);
		else
			R2_GLOBALS._player.setup(10, 3, 1);
		break;
	}

	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	if (R2_GLOBALS._player._characterIndex == 2) {
		_actor1._moveRate = 10;
		_actor1._moveDiff = Common::Point(3, 2);
	} else {
		_actor1._moveRate = 7;
		_actor1._moveDiff = Common::Point(5, 3);
	}
	_actor1.changeZoom(-1);
	_actor1._effect = 1;

	int tmpStrip, tmpVisage;
	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		tmpStrip = 1;
	else
		tmpStrip = 4;

	if (R2_GLOBALS._player._characterIndex == 2)
		tmpVisage = 10;
	else
		tmpVisage = 20;

	_actor1.setup(tmpVisage, tmpStrip, 1);
	_actor1.animate(ANIM_MODE_1, NULL);

	_actor2.postInit();
	_actor2._moveDiff = Common::Point(3, 2);
	_actor2.changeZoom(-1);
	_actor2._effect = 1;
	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		tmpStrip = 1;
	else
		tmpStrip = 8;

	if (R2_GLOBALS._player._characterIndex == 3)
		tmpVisage = 10;
	else
		tmpVisage = 30;

	_actor2.setup(tmpVisage, tmpStrip, 1);
	_actor2.animate(ANIM_MODE_1, NULL);

	_actor3.postInit();
	_actor3._moveRate = 7;
	_actor3._moveDiff = Common::Point(5, 3);
	_actor3.changeZoom(-1);
	_actor3._effect = 1;
	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		tmpStrip = 1;
	else
		tmpStrip = 4;

	_actor3.setup(40, tmpStrip, 1);
	_actor3.animate(ANIM_MODE_1, NULL);

	_actor2.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);
	_actor3.setDetails(3375, 21, -1, -1, 1, (SceneItem *)NULL);
	_actor1.setDetails(3375, -1, -1, -1, 1, (SceneItem *)NULL);

	_actor4.postInit();
	_actor4.setup(3375, 1, 1);
	_actor4.setPosition(Common::Point(254, 166));
	_actor4.fixPriority(140);
	_actor4.hide();

	_exit1.setDetails(Rect(0, 84, 24, 167), EXITCURSOR_W, 3375);
	_exit1.setDest(Common::Point(65, 155));
	_exit2.setDetails(Rect(103, 152, 183, 170), SHADECURSOR_DOWN, 3375);
	_exit2.setDest(Common::Point(158, 151));
	_exit3.setDetails(Rect(180, 75, 213, 132), EXITCURSOR_E, 3375);
	_exit3.setDest(Common::Point(201, 131));

	for (int i = 0; i <= 12; ++i)
		_itemArray[i].setDetails(i, 3375, 3, -1, -1);

	_item1.setDetails(Rect(0, 0, 320, 200), 3375, 0, -1, 1, 1, NULL);

	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		_sceneMode = 3379;
	else
		_sceneMode = 0;

	subFC696(_sceneMode);
}

void Scene3375::remove() {
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3375::signalCase3379() {
	switch (R2_GLOBALS._v56A9E) {
	case 0:
		_exit1._enabled = true;
		if (R2_GLOBALS._sceneManager._previousScene == 3385)
			R2_GLOBALS._walkRegions.enableRegion(1);
		else {
			R2_GLOBALS._walkRegions.enableRegion(3);
			R2_GLOBALS._walkRegions.enableRegion(4);
		}
		R2_GLOBALS._walkRegions.enableRegion(6);
		R2_GLOBALS._walkRegions.enableRegion(7);
	case 2:
		_exit1._enabled = false;
		R2_GLOBALS._walkRegions.enableRegion(2);
		R2_GLOBALS._walkRegions.enableRegion(3);
		R2_GLOBALS._walkRegions.enableRegion(5);
		R2_GLOBALS._walkRegions.enableRegion(6);
		R2_GLOBALS._walkRegions.enableRegion(7);
		R2_GLOBALS._walkRegions.enableRegion(8);
		R2_GLOBALS._walkRegions.enableRegion(9);
	default:
		_exit1._enabled = false;
		R2_GLOBALS._walkRegions.enableRegion(2);
		R2_GLOBALS._walkRegions.enableRegion(3);
		R2_GLOBALS._walkRegions.enableRegion(5);
		R2_GLOBALS._walkRegions.enableRegion(6);
		break;
	}
	R2_GLOBALS._sceneManager._previousScene = 3375;
	R2_GLOBALS._player._effect = 1;
	_actor1._effect = 1;
	_actor2._effect = 1;
	_actor3._effect = 1;
	R2_GLOBALS._player.enableControl(CURSOR_ARROW);
}

void Scene3375::signal() {
	switch (_sceneMode) {
	case 3375:
		R2_GLOBALS._sceneManager.changeScene(3400);
		break;
	case 3376:
		R2_GLOBALS._sceneManager.changeScene(3385);
		break;
	case 3377:
		// No break on purpose
	case 3378:
		_sceneMode = _field1488;
		_field1488 = 0;
		_actor1._effect = 6;
		_actor1._shade = 4;
		_actor2._effect = 6;
		_actor2._shade = 4;
		_actor3._effect = 6;
		_actor3._shade = 4;
		subFC696(_sceneMode);
		break;
	case 3379:
		signalCase3379();
		break;
	case 9999:
		if (_actor1._position.y == 163)
			R2_GLOBALS._player.setStrip(1);
		else
			R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.enableControl(CURSOR_TALK);
	default:
		_actor1.setPriority(130);
		_actor2.setPriority(132);
		_actor3.setPriority(134);
		signalCase3379();
		break;
	}
}

void Scene3375::dispatch() {
	if ((R2_GLOBALS._player._position.y >= 168) && (R2_GLOBALS._player._effect == 1))
		R2_GLOBALS._player._effect = 6;
	else if ((R2_GLOBALS._player._position.y < 168) && (R2_GLOBALS._player._effect == 6))
		R2_GLOBALS._player._effect = 1;

	if ((_actor1._position.y >= 168) && (_actor1._effect == 1))
		_actor1._effect = 6;
	else if ((_actor1._position.y < 168) && (_actor1._effect == 6))
		_actor1._effect = 1;

	if ((_actor2._position.y >= 168) && (_actor2._effect == 1))
		_actor2._effect = 6;
	else if ((_actor2._position.y < 168) && (_actor2._effect == 6))
		_actor2._effect = 1;

	if ((_actor3._position.y >= 168) && (_actor3._effect == 1))
		_actor3._effect = 6;
	else if ((_actor3._position.y < 168) && (_actor3._effect == 6))
		_actor3._effect = 1;

	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3385 -
 *
 *--------------------------------------------------------------------------*/
Scene3385::Scene3385() {
	_field11B2 = 0;
}

void Scene3385::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field11B2);
}

bool Scene3385::Actor1::startAction(CursorType action, Event &event) {
	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 2)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3304, scene);

	return true;
}

bool Scene3385::Actor2::startAction(CursorType action, Event &event) {
	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 3)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3301, scene);

	return true;
}

bool Scene3385::Actor3::startAction(CursorType action, Event &event) {
	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	scene->_stripManager.start(3303, scene);

	return true;
}

bool Scene3385::Actor4::startAction(CursorType action, Event &event) {
	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	if (R2_GLOBALS._sceneManager._previousScene == 3375)
		R2_GLOBALS._sound2.play(314);

	scene->_sceneMode = 3386;
	scene->setAction(&scene->_sequenceManager, scene, 3386, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);

	return true;
}

void Scene3385::Exit1::changeScene() {
	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;

	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_sceneMode = 3387;

	if (R2_GLOBALS._sceneManager._previousScene == 3375)
		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, NULL);
	else
		scene->signal();
}

void Scene3385::Action1::signal() {
	int v = _actionIndex;
	++_actionIndex;

	if (v == 0)
		setDelay(1);
	else if (v == 1)
		R2_GLOBALS._sound2.play(314);
}

void Scene3385::postInit(SceneObjectList *OwnerList) {
	loadScene(3385);
	SceneExt::postInit();

	R2_GLOBALS._sound1.play(313);

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);

	R2_GLOBALS._player._characterScene[1] = 3385;
	R2_GLOBALS._player._characterScene[2] = 3385;
	R2_GLOBALS._player._characterScene[3] = 3385;

	if (R2_GLOBALS._sceneManager._previousScene == 3375)
		_field11B2 = 3;
	else
		_field11B2 = 4;

	setZoomPercents(102, 40, 200, 160);
	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
	else
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);

	R2_GLOBALS._player.changeZoom(-1);

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player.setup(20, _field11B2, 1);
	else if (R2_GLOBALS._player._characterIndex == 3)
		R2_GLOBALS._player.setup(30, _field11B2, 1);
	else
		R2_GLOBALS._player.setup(10, _field11B2, 1);

	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	if (R2_GLOBALS._player._characterIndex == 2) {
		_actor1._moveRate = 10;
		_actor1._moveDiff = Common::Point(3, 2);
	} else {
		_actor1._moveRate = 7;
		_actor1._moveDiff = Common::Point(5, 3);
	}
	_actor1.changeZoom(-1);
	_actor1._effect = 1;
	if (R2_GLOBALS._player._characterIndex == 2)
		_actor1.setup(10, _field11B2, 1);
	else
		_actor1.setup(20, _field11B2, 1);
	_actor1.animate(ANIM_MODE_1, NULL);
	_actor1.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);

	_actor2.postInit();
	_actor2._moveDiff = Common::Point(3, 2);
	_actor2.changeZoom(-1);
	_actor2._effect = 1;
	if (R2_GLOBALS._player._characterIndex == 3)
		_actor2.setup(10, _field11B2, 1);
	else
		_actor2.setup(30, _field11B2, 1);
	_actor2.animate(ANIM_MODE_1, NULL);
	_actor2.setDetails(3385, -1, -1, -1, 1, (SceneItem *) NULL);

	_actor3.postInit();
	_actor3._moveDiff = Common::Point(3, 2);
	_actor3.changeZoom(-1);
	_actor3._effect = 1;
	_actor3.setup(40, _field11B2, 1);
	_actor3.animate(ANIM_MODE_1, NULL);
	_actor3.setDetails(3385, 15, -1, -1, 1, (SceneItem *) NULL);

	_exit1.setDetails(Rect(103, 152, 217, 170), SHADECURSOR_DOWN, 3395);
	_exit1.setDest(Common::Point(158, 151));

	_actor4.postInit();
	_actor4.setPosition(Common::Point(160, 100));
	_actor4.fixPriority(90);
	_actor4.setDetails(3385, 3, 4, -1, 1, (SceneItem *) NULL);

	if (R2_GLOBALS._sceneManager._previousScene == 3375) {
		R2_GLOBALS._player.setPosition(Common::Point(158, 102));
		_actor1.setPosition(Common::Point(164, 100));
		_actor1.fixPriority(98);
		_actor2.setPosition(Common::Point(150, 100));
		_actor2.fixPriority(97);
		_actor3.setPosition(Common::Point(158, 100));
		_actor3.fixPriority(96);
		_sceneMode = 3384;
		_actor4.setup(3385, 1, 6);
		_actor4.animate(ANIM_MODE_6, this);
		setAction(&_action1, &_actor4);
	} else {
		R2_GLOBALS._player.setPosition(Common::Point(158, 230));
		_actor1.setPosition(Common::Point(191, 270));
		_actor2.setPosition(Common::Point(124, 255));
		_actor3.setPosition(Common::Point(155, 245));
		_actor4.setup(3385, 1, 1);
		_sceneMode = 3385;
		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
	}

	_item1.setDetails(Rect(0, 0, 320, 200), 3385, 0, -1, -1, 1, NULL);
	R2_GLOBALS._v56A9E = 0;
}

void Scene3385::remove() {
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3385::signal() {
	switch (_sceneMode) {
	case 3386:
		R2_GLOBALS._sceneManager.changeScene(3375);
		break;
	case 3387:
		R2_GLOBALS._sceneManager.changeScene(3395);
		break;
	case 9999:
		if (R2_GLOBALS._sceneManager._previousScene == 3375)
			R2_GLOBALS._player.setStrip(3);
		else
			R2_GLOBALS._player.setStrip(4);
		R2_GLOBALS._player.enableControl(CURSOR_TALK);
		break;
	default:
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3395 -
 *
 *--------------------------------------------------------------------------*/
Scene3395::Scene3395() {
	_field142E = 0;
}

void Scene3395::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field142E);
}

bool Scene3395::Actor1::startAction(CursorType action, Event &event) {
	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 2)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3304, scene);

	return true;
}

bool Scene3395::Actor2::startAction(CursorType action, Event &event) {
	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	if (R2_GLOBALS._player._characterIndex == 3)
		scene->_stripManager.start(3302, scene);
	else
		scene->_stripManager.start(3301, scene);

	return true;
}

bool Scene3395::Actor3::startAction(CursorType action, Event &event) {
	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_TALK)
		return SceneActor::startAction(action, event);

	scene->_sceneMode = 9999;
	scene->_stripManager.start(3303, scene);

	return true;
}

bool Scene3395::Actor4::startAction(CursorType action, Event &event) {
	Scene3395 *scene = (Scene3395 *)R2_GLOBALS._sceneManager._scene;

	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		R2_GLOBALS._sound2.play(314);

	scene->_sceneMode = 3396;
	scene->setAction(&scene->_sequenceManager, scene, 3396, &R2_GLOBALS._player, &scene->_actor1, &scene->_actor2, &scene->_actor3, &scene->_actor4, NULL);

	return true;
}

void Scene3395::Action1::signal() {
	int v = _actionIndex;
	++_actionIndex;

	if (v == 0)
		setDelay(2);
	else if (v == 1)
		R2_GLOBALS._sound2.play(314);
}

void Scene3395::postInit(SceneObjectList *OwnerList) {
	loadScene(3395);
	SceneExt::postInit();

	R2_GLOBALS._sound1.play(313);

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);

	R2_GLOBALS._player._characterScene[1] = 3395;
	R2_GLOBALS._player._characterScene[2] = 3395;
	R2_GLOBALS._player._characterScene[3] = 3395;

	if (R2_GLOBALS._sceneManager._previousScene == 3385)
		_field142E = 3;
	else
		_field142E = 4;

	setZoomPercents(51, 40, 200, 137);
	R2_GLOBALS._player.postInit();

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
	else
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);

	R2_GLOBALS._player.changeZoom(-1);

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player.setup(20, _field142E, 1);
	else if (R2_GLOBALS._player._characterIndex == 3)
		R2_GLOBALS._player.setup(30, _field142E, 1);
	else
		R2_GLOBALS._player.setup(10, _field142E, 1);

	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	if (R2_GLOBALS._player._characterIndex == 2) {
		_actor1._moveRate = 10;
		_actor1._moveDiff = Common::Point(3, 2);
	} else {
		_actor1._moveRate = 7;
		_actor1._moveDiff = Common::Point(5, 3);
	}
	_actor1.changeZoom(-1);
	_actor1._effect = 1;
	if (R2_GLOBALS._player._characterIndex == 2)
		_actor1.setup(10, _field142E, 1);
	else
		_actor1.setup(20, _field142E, 1);
	_actor1.animate(ANIM_MODE_1, NULL);
	_actor1.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);

	_actor2.postInit();
	_actor2._moveDiff = Common::Point(3, 2);
	_actor2.changeZoom(-1);
	_actor2._effect = 1;
	if (R2_GLOBALS._player._characterIndex == 3)
		_actor2.setup(10, _field142E, 1);
	else
		_actor2.setup(30, _field142E, 1);
	_actor2.animate(ANIM_MODE_1, NULL);
	_actor2.setDetails(3395, -1, -1, -1, 1, (SceneItem *) NULL);

	_actor3.postInit();
	_actor3._moveDiff = Common::Point(3, 2);
	_actor3.changeZoom(-1);
	_actor3._effect = 1;
	_actor3.setup(40, _field142E, 1);
	_actor3.animate(ANIM_MODE_1, NULL);
	_actor3.setDetails(3385, 18, -1, -1, 1, (SceneItem *) NULL);

	_actor4.postInit();
	_actor4.setPosition(Common::Point(159, 50));
	_actor4.fixPriority(40);
	_actor4.setDetails(3395, 6, 7, -1, 1, (SceneItem *) NULL);

	if (R2_GLOBALS._sceneManager._previousScene == 3385) {
		R2_GLOBALS._player.setPosition(Common::Point(158, 53));
		_actor1.setPosition(Common::Point(164, 51));
		_actor1.fixPriority(48);
		_actor2.setPosition(Common::Point(150, 51));
		_actor2.fixPriority(47);
		_actor3.setPosition(Common::Point(158, 51));
		_actor3.fixPriority(46);
		_sceneMode = 3394;
		_actor4.setup(3395, 1, 7);
		_actor4.animate(ANIM_MODE_6, this);
		setAction(&_action1, &_actor4);
	} else {
		R2_GLOBALS._player.setPosition(Common::Point(158, 200));
		_actor1.setPosition(Common::Point(191, 255));
		_actor2.setPosition(Common::Point(124, 240));
		_actor3.setPosition(Common::Point(155, 242));
		_actor4.setup(3395, 1, 1);

		R2_GLOBALS._walkRegions.enableRegion(1);

		_sceneMode = 3395;
		setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
	}

	for (int i = 0; i <= 12; i++) {
		_itemArray[i].setDetails(i, 3995, 0, -1, -1);
	}

	_item1.setDetails(Rect(0, 0, 320, 200), 3395, 3, -1, -1, 1, NULL);
}

void Scene3395::remove() {
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3395::signal() {
	switch (_sceneMode) {
	case 3396:
		R2_GLOBALS._sceneManager.changeScene(3385);
		break;
	case 9999:
		if (R2_GLOBALS._sceneManager._previousScene == 3385)
			R2_GLOBALS._player.setStrip(3);
		else
			R2_GLOBALS._player.setStrip(4);
		R2_GLOBALS._player.enableControl(CURSOR_TALK);
		break;
	default:
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3400 -
 *
 *--------------------------------------------------------------------------*/
Scene3400::Scene3400() {
	_field157C = 0;
}

void Scene3400::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field157C);
}

void Scene3400::postInit(SceneObjectList *OwnerList) {
	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
	g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
	loadScene(3400);
	_field157C = 0;
	R2_GLOBALS._v558B6.set(60, 0, 260, 200);
	SceneExt::postInit();
	R2_GLOBALS._sound1.play(317);

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);
	_stripManager.addSpeaker(&_tealSpeaker);

	setZoomPercents(51, 46, 180, 200);
	R2_GLOBALS._player._characterScene[1] = 3400;
	R2_GLOBALS._player._characterScene[2] = 3400;
	R2_GLOBALS._player._characterScene[3] = 3400;

	_actor7.postInit();
	_actor7.setup(3403, 1, 1);
	_actor7.setPosition(Common::Point(190, 103));
	_actor7.fixPriority(89);

	R2_GLOBALS._player.postInit();
	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
	else
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
	R2_GLOBALS._player.changeZoom(-1);
	R2_GLOBALS._player.setPosition(Common::Point(239, 64));

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player.setup(20, 5, 1);
	else if (R2_GLOBALS._player._characterIndex == 3)
		R2_GLOBALS._player.setup(30, 5, 1);
	else
		R2_GLOBALS._player.setup(10, 5, 1);

	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_actor1.postInit();
	if (R2_GLOBALS._player._characterIndex == 2) {
		_actor1._numFrames = 10;
		_actor1._moveDiff = Common::Point(3, 2);
	} else {
		_actor1._numFrames = 7;
		_actor1._moveDiff = Common::Point(5, 3);
	}
	_actor1.changeZoom(-1);
	_actor1._effect = 1;
	_actor1.setPosition(Common::Point(247, 63));
	if (R2_GLOBALS._player._characterIndex == 2)
		_actor1.setup(10, 5, 1);
	else
		_actor1.setup(20, 5, 1);
	_actor1.animate(ANIM_MODE_1, NULL);

	_actor2.postInit();
	_actor2._moveDiff = Common::Point(3, 2);
	_actor2.changeZoom(-1);
	_actor2._effect = 1;
	_actor2.setPosition(Common::Point(225, 63));
	if (R2_GLOBALS._player._characterIndex == 3)
		_actor2.setup(10, 5, 1);
	else
		_actor2.setup(30, 5, 1);
	_actor2.animate(ANIM_MODE_1, NULL);

	_actor3.postInit();
	_actor3._numFrames = 7;
	_actor3._moveDiff = Common::Point(5, 3);
	_actor3.changeZoom(-1);
	_actor3._effect = 1;
	_actor3.setPosition(Common::Point(235, 61));
	_actor3.setup(40, 3, 1);
	_actor3.animate(ANIM_MODE_1, NULL);

	_actor6.postInit();
	_actor6.setup(3400, 1, 6);
	_actor6.setPosition(Common::Point(236, 51));
	_actor6.fixPriority(51);
	_actor6.animate(ANIM_MODE_6, NULL);

	R2_GLOBALS.clearFlag(71);
	_sceneMode = 3400;
	setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
}

void Scene3400::remove() {
	R2_GLOBALS._sound2.fadeOut2(NULL);
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3400::signal() {
	switch (_sceneMode) {
	case 3305: {
		warning("STUB: sub_1D227()");
		_tealSpeaker._object1.hide();
		_actor4.show();
		_actor4.setStrip(1);
		Common::Point pt(158, 190);
		NpcMover *mover = new NpcMover();
		_actor4.addMover(mover, &pt, this);
		_sceneMode = 3402;
		setAction(&_sequenceManager, this, 3402, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor3, NULL);
		}
		break;
	case 3306:
		R2_GLOBALS._sound2.play(318);
		_actor1.setStrip(2);
		R2_GLOBALS._player.setStrip(6);
		_actor2.setStrip(6);
		_actor3.setStrip(3);
		_actor4.setStrip(1);
		R2_INVENTORY.setObjectScene(34, 0);
		_stripManager.start(3307, this);
		if (R2_GLOBALS._player._characterIndex == 2) {
			_sceneMode = 3400;
			R2_GLOBALS._player.setAction(&_sequenceManager, this, 3400, &R2_GLOBALS._player, &_actor4, &_actor8, NULL);
		} else {
			_sceneMode = 3408;
			_actor1.setAction(&_sequenceManager, this, 3408, &_actor1, &_actor4, &_actor8, NULL);
		}
		break;
	case 3307:
	case 3404:
	case 3408:
		if (_field157C == 0) {
			R2_GLOBALS._sound2.fadeOut2(NULL);
			_field157C = 1;
		} else {
			_sceneMode = 3308;
			_stripManager.start(3308, this);
		}
		break;
	case 3308:
		warning("STUB: sub_1D227()");
		_actor1.setStrip(2);
		R2_GLOBALS._player.setStrip(6);
		_actor2.setStrip(6);
		_actor3.setStrip(3);
		_actor4.setStrip(1);
		_sceneMode = 3403;
		if (R2_GLOBALS._player._characterIndex == 2)
			setAction(&_sequenceManager, this, 3403, &R2_GLOBALS._player, &_actor3, &_actor7, NULL);
		else
			setAction(&_sequenceManager, this, 3403, &_actor1, &_actor3, &_actor7, NULL);
		break;
	case 3309:
		warning("STUB: sub_1D227()");
		_actor4.setStrip(1);
		_sceneMode = 3405;
		if (R2_GLOBALS._player._characterIndex == 3)
			setAction(&_sequenceManager, this, 3405, &R2_GLOBALS._player, &_actor7, NULL);
		else
			setAction(&_sequenceManager, this, 3405, &_actor2, &_actor7, NULL);
		break;
	case 3310:
		warning("STUB: sub_1D227()");
		_actor4.setStrip(1);
		_sceneMode = 3406;
		if (R2_GLOBALS._player._characterIndex == 1)
			setAction(&_sequenceManager, this, 3406, &R2_GLOBALS._player, &_actor7, NULL);
		else if (R2_GLOBALS._player._characterIndex == 2)
			setAction(&_sequenceManager, this, 3406, &_actor1, &_actor7, NULL);
		else if (R2_GLOBALS._player._characterIndex == 3)
			setAction(&_sequenceManager, this, 3406, &_actor2, &_actor7, NULL);
		break;
	case 3311:
		warning("STUB: sub_1D227()");
		_tealSpeaker._object1.hide();
		_actor4.show();
		_actor4.setStrip(1);
		_sceneMode = 3407;
		setAction(&_sequenceManager, this, 3407, &_actor4, &_actor7, NULL);
		break;
	case 3400: {
		_actor8.postInit();
		_actor8.hide();
		_actor4.postInit();
		_actor4._numFrames = 7;
		_actor4._moveDiff = Common::Point(3, 2);
		_actor4.changeZoom(-1);
		_actor4._effect = 1;
		_actor4.setPosition(Common::Point(-15, 90));
		_actor4.setup(3402, 1, 1);
		_actor4.animate(ANIM_MODE_1, NULL);
		Common::Point pt1(115, 90);
		NpcMover *mover1 = new NpcMover();
		_actor4.addMover(mover1, &pt1, this);
		R2_GLOBALS._scrollFollower = &_actor4;
		Common::Point pt2(203, 76);
		NpcMover *mover2 = new NpcMover();
		_actor3.addMover(mover2, &pt2, NULL);
		_sceneMode = 3401;
		}
		break;
	case 3401:
		_sceneMode = 3305;
		_stripManager.start(3305, this);
		break;
	case 3402:
		_sceneMode = 3306;
		_stripManager.start(3306, this);
		break;
	case 3403:
		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
		_sceneMode = 3309;
		_stripManager.start(3309, this);
		break;
	case 3405:
		_sceneMode = 3310;
		_stripManager.start(3310, this);
		break;
	case 3406:
		_sceneMode = 3311;
		_stripManager.start(3311, this);
		break;
	case 3407:
		R2_GLOBALS._sceneManager.changeScene(3600);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3500 -
 *
 *--------------------------------------------------------------------------*/
Scene3500::Action1::Action1() {
	_field1E = 0;
	_field20 = 0;
	_field22 = 0;
	_field24 = 0;
}

void Scene3500::Action1::synchronize(Serializer &s) {
	Action::synchronize(s);

	s.syncAsSint16LE(_field1E);
	s.syncAsSint16LE(_field20);
	s.syncAsSint16LE(_field22);
	s.syncAsSint16LE(_field24);
}

void Scene3500::Action1::sub108670(int arg1) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	_field1E = arg1;
	_field20 = 1;
	_field24 = 1;

	scene->_actor9.setStrip(2);
	scene->_actor9.show();

	if (_field1E == 1)
		scene->_actor6.show();
	else
		scene->_actor5.show();

	if (scene->_actor1._frame % 2 == 0)
	scene->_actor1._frameChange = _field1E;
	scene->_actor1.setFrame(scene->_actor1.changeFrame());

	setActionIndex(0);
}

void Scene3500::Action1::sub108732(int arg1) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	_field20 = arg1;
	_field1E = -_field1E;

	if (_field1E == 1) {
		scene->_actor6.show();
		scene->_actor5.hide();
	} else {
		scene->_actor5.show();
		scene->_actor6.hide();
	}

	switch (_actionIndex) {
	case 4:
		scene->_actor1._frameChange = _field1E;
		scene->_actor1.setFrame(scene->_actor1.changeFrame());
	// No break on purpose
	case 3:
		_actionIndex = 10;
		setDelay(0);
		break;
	case 5: {
		scene->_fieldAF8 = 160;
		Common::Point pt(160, 73);
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, NULL);

		scene->_fieldB9E = 160 - (_field1E * 2 * 160);
		Common::Point pt2(scene->_fieldB9E, 73);
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, this);

		_actionIndex = 11;
		}
		break;
	case 6:
		scene->_actor1._frameChange = _field1E;
		scene->_actor1.setFrame(scene->_actor1.changeFrame());
		setDelay(1);
	// No break on purpose
	case 8:
		scene->_actor9.setStrip(2);
		_actionIndex = 1;
		break;
	default:
		break;
	}
}

Scene3500::Action2::Action2() {
	_field1E = 0;
}

void Scene3500::Action2::synchronize(Serializer &s) {
	Action::synchronize(s);

	s.syncAsSint16LE(_field1E);
}

Scene3500::Item4::Item4() {
	_field34 = 0;
}

void Scene3500::Item4::synchronize(Serializer &s) {
	NamedHotspot::synchronize(s);

	s.syncAsSint16LE(_field34);
}

Scene3500::Actor7::Actor7() {
	_fieldA4 = 0;
	_fieldA6 = 0;
	_fieldA8 = 0;
	_fieldAA = 0;
	_fieldAC = 0;
	_fieldAE = 0;
}

void Scene3500::Actor7::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_fieldA4);
	s.syncAsSint16LE(_fieldA6);
	s.syncAsSint16LE(_fieldA8);
	s.syncAsSint16LE(_fieldAA);
	s.syncAsSint16LE(_fieldAC);
	s.syncAsSint16LE(_fieldAE);
}

void Scene3500::Actor7::sub109466(int arg1, int arg2, int arg3, int arg4, int arg5) {
	_fieldAE = 0;
	_fieldA4 = arg1;
	_fieldA6 = arg2;
	_fieldA8 = arg3;
	_fieldAA = arg4;
	_fieldAC = _fieldAA / _fieldA8;

	postInit();
	setup(10501, 3, 1);
	fixPriority(255);
	sub109663(arg5);
}

void Scene3500::Actor7::sub1094ED() {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	scene->_field1270 = _position.x - _fieldA4;
}

void Scene3500::Actor7::sub109663(int arg1){
	sub109693(Common::Point(_fieldA4 + arg1, _fieldA6 - (_fieldAC * arg1)));
}

void Scene3500::Actor7::sub109693(Common::Point Pt) {
	setPosition(Pt);
}

int Scene3500::UnkObject3500::sub1097C9(int arg1) {
	return (_field2A / 2) + arg1 - (arg1 % _field2A);
}

int Scene3500::UnkObject3500::sub1097EF(int arg1) {
	return (_field2C / 2) + arg1 - (arg1 % _field2C);
}

int Scene3500::UnkObject3500::sub109C09(Common::Point pt) {
	int vx = pt.x / _field2A;
	int vy = pt.y / _field2C;

	if ((vx >= 0) && (_field26 > vx) && (_field28 > vy)) {
		return _field16[((_field26 * vy) + vx) * 2];
	} else
		return -1;
}

int Scene3500::UnkObject3500::sub109C5E(int &x, int &y) {
	int retVal = sub51AFD(Common::Point(x, y));
	x = _field2E;
	y = _field30;

	return retVal;
}

Scene3500::Scene3500() {
	_fieldAF8 = 0;
	_fieldB9E = 0;
	_rotation = NULL;
	_field126E = 0;
	_field1270 = 0;
	_field1272 = 0;
	_field1274 = 0;
	_field1276 = 0;
	_field1278 = 0;
	_field127A = 0;
	_field127C = 0;
	_field127E = 0;
	_field1280 = 0;
	_field1282 = 0;
	_field1284 = 0;
	_field1286 = 0;
}

void Scene3500::synchronize(Serializer &s) {
	SceneExt::synchronize(s);
	SYNC_POINTER(_rotation);

	s.syncAsSint16LE(_fieldAF8);
	s.syncAsSint16LE(_fieldB9E);
	s.syncAsSint16LE(_field126E);
	s.syncAsSint16LE(_field1270);
	s.syncAsSint16LE(_field1272);
	s.syncAsSint16LE(_field1274);
	s.syncAsSint16LE(_field1276);
	s.syncAsSint16LE(_field1278);
	s.syncAsSint16LE(_field127A);
	s.syncAsSint16LE(_field127C);
	s.syncAsSint16LE(_field127E);
	s.syncAsSint16LE(_field1280);
	s.syncAsSint16LE(_field1282);
	s.syncAsSint16LE(_field1284);
	s.syncAsSint16LE(_field1286);
}

void Scene3500::sub107F71(int arg1) {
	switch (arg1) {
	case -1:
		_actor7.sub1094ED();
		if (_field1270 != 0) {
			_field1270--;
			_actor7.sub109663(_field1270);
		}
		if (_action1._field24 != 0)
			_field1270 = 0;
		break;
	case 1:
		_actor7.sub1094ED();
		if (_field1270 < 16) {
			++_field1270;
			_actor7.sub109663(_field1270);
		}
		if (_action1._field24 != 0)
			_field1270 = 0;
		break;
	case 88:
		if ((_action == 0) || (_action1._field24 == 0)) {
		// The original makes a second useless check on action, skipped
			_action2.sub10831F(2);
			if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != 2))) {
				_action2.signal();
			} else {
				_actor9.setAction(&_action2, &_actor9, NULL);
			}
		}
		break;
	case 96:
		if ((_action) && (_action1._field24 != 0) && (_action2._field1E != 1)) {
			_field1278 = 0;
			_action1.sub108732(0);
		} else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
			_field1278 = arg1;
		} else if ((_action) && (_action1._field24 == 0)) {
			_action1.sub108670(1);
			_action1.signal();
		} else if (_action == 0) {
			_action1.sub108670(1);
			setAction(&_action1, &_actor1, NULL);
		}
		break;
	case 104:
		if ((_action == 0) || (_action1._field24 == 0)) {
			_action2.sub10831F(-1);
			if ((_action) && ((_action2.getActionIndex() != 0) || (_action2._field1E != -1))) {
				_action2.signal();
			} else {
				_actor9.setAction(&_action2, &_actor9, NULL);
			}
		}
		break;
	case 112:
		if ((_action) && (_action1._field24 != 0) && (_action2._field1E != -1)) {
			_field1278 = 0;
			_action1.sub108732(0);
		} else if ((_action) && (_field1278 == 0) && (_action1._field24 != 0)) {
			_field1278 = arg1;
		} else if ((_action) && (_action1._field24 == 0)) {
			_action1.sub108670(-1);
			_action1.signal();
		} else if (_action == 0) {
			_action1.sub108670(-1);
			setAction(&_action1, &_actor1, NULL);
		}
		break;
	default:
		_field1270 = arg1;
		_actor7.sub109663(arg1);
		if (_action1._field24 != 0) {
			_field1270 = 0;
		}
		break;
	}
}

void Scene3500::Action1::signal() {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	switch(_actionIndex++) {
	case 0:
		R2_GLOBALS._player.disableControl();
		scene->_field1286 = 0;
		if (scene->_field1270 != 0) {
			scene->_field1270 = 0;
			scene->_field126E = 0;
			scene->_field1272 = 0;
			scene->_rotation->_idxChange = 0;
		}
		break;
	case 1:
		if ((scene->_actor1._frame % 2) == 0) {
			setDelay(1);
			return;
		}
	// No break on purpose
	case 3:
		scene->_actor1._frameChange = _field1E;
		scene->_actor1.setFrame(scene->_actor1.changeFrame());
		setDelay(1);
		break;
	case 4: {
		int si = scene->_unkObj1.sub109C09(Common::Point(scene->_field127A + 70, scene->_field127C + 46));
		int var2 = scene->_unkObj1.sub1097C9(scene->_field127A + 70) - 70;
		int var4 = scene->_unkObj1.sub1097EF(scene->_field127C + 46) - 46;
		int di = abs(var2 - scene->_field127A);
		int var6 = abs(var4 - scene->_field127C);

		if ((scene->_actor1._frame % 2) != 0) {
			scene->_actor1._frameChange = _field1E;
			scene->_actor1.setFrame(scene->_actor1.changeFrame());
		}

		int var8 = (scene->_action1._field1E * 2 + scene->_field1276);
		if (var8 > 7)
			var8 = 1;
		else if (var8 < 1)
			var8 = 7;

		switch (var8) {
		case 0:
			if ( ((si != 2)  && (si != 3)  && (si != 6) && (si != 1) && (si != 23) && (si != 24) && (si != 4) && (si != 11))
				|| (var6 != 0)) {
				if ((si != 25) && (si != 26) && (si != 5) && (si != 14) && (si != 15))
					_field20 = 0;
				else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
					_field20 = 0;
				else
					_field20 = 1;
			} else
				_field20 = 1;
			break;
		case 2:
			if ( ((si != 12)  && (si != 13)  && (si != 11) && (si != 16) && (si != 26) && (si != 24) && (si != 15) && (si != 6) && (si != 31))
				|| (di != 0)) {
				if ((si != 25) && (si != 23) && (si != 14) && (si != 5) && (si != 4))
					_field20 = 0;
				else if ((di != 0) || (var6 <= 3)) // useless, skipped: "|| (var6 == 0)"
					_field20 = 0;
				else
					_field20 = 1;
			} else
				_field20 = 1;
			break;
		case 4:
			if ( ((si != 2)  && (si != 3)  && (si != 6) && (si != 1) && (si != 25) && (si != 26) && (si != 5) && (si != 16) && (si != 31))
				|| (var6 != 0)) {
					if ((si != 23) && (si != 24) && (si != 4) && (si != 14) && (si != 15))
						_field20 = 0;
					else if ((var6 != 0) || (di <= 3)) // useless, skipped: "|| (di == 0)"
						_field20 = 0;
					else
						_field20 = 1;
			} else
				_field20 = 1;
			break;
		case 6:
			if ( ((si != 12)  && (si != 13)  && (si != 11) && (si != 16) && (si != 25) && (si != 23) && (si != 14) && (si != 1) && (si != 31))
				|| (var6 != 0)) {
					if ((si != 26) && (si != 24) && (si != 15) && (si != 5) && (si != 4))
						_field20 = 0;
					else if ((var6 <= 0) || (di != 0)) // useless, skipped: "|| (var6 == 0)"
						_field20 = 0;
					else
						_field20 = 1;
			} else
				_field20 = 1;
		default:
			break;
		}
		}
	// No break on purpose
	case 2: {
		scene->_actor8.setPosition(Common::Point(160, 73));
		scene->_actor8._moveDiff.x = 160 - scene->_field126E;
		scene->_fieldAF8 = 160 - ((_field1E * 2) * 160);
		Common::Point pt(scene->_fieldAF8, 73);
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, this);

		scene->_actor9.setPosition(Common::Point(160 + ((_field1E * 2) * 160), 73));
		scene->_actor9._moveDiff.x = 160 - scene->_field126E;
		scene->_fieldB9E = 160;
		Common::Point pt2(scene->_fieldB9E, 73);
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, NULL);
		}
		break;
	case 5:
		scene->_actor1._frameChange = _field1E;
		scene->_field1276 = scene->_actor1.changeFrame();
		scene->_actor1.setFrame(scene->_field1276);
		setDelay(1);
		break;
	case 6:
		scene->_actor8.setPosition(Common::Point(160, 73));
		if (_field20 == 0)
			scene->_actor8.setStrip(1);
		else
			scene->_actor8.setStrip(2);
		scene->_actor8.fixPriority(1);

		scene->_actor9.setPosition(Common::Point(-160, 73));
		scene->_actor9.setStrip(9);
		scene->_actor9.fixPriority(11);
		scene->_actor9.hide();
		setDelay(1);
		break;
	case 7:
		if ((scene->_actor1._frame % 2) == 0) {
			scene->_actor1._frameChange = _field1E;
			scene->_field1276 = scene->_actor1.changeFrame();
			scene->_actor1.setFrame(scene->_field1276);
		}
		setDelay(1);
		break;
	case 8: {
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		scene->_field1286 = 1;
		if ((scene->_actor1._frame % 2) == 0) {
			scene->_actor1._frameChange = _field1E;
			scene->_actor1.setFrame(scene->_actor1.changeFrame());
		}
		// All the var_8 initialization was missing in the original
		// but it's clearly a cut and paste error from case 4.
		// The following code allows the switch to work properly.
		warning("Checkme: fix for dead code");
		int var_8 = (_field1E * 2 + scene->_field1276);
		if (var_8 > 7)
			var_8 = 1;
		else if (var_8 < 1)
			var_8 = 7;
		//

		switch (var_8 - 1) {
		case 0:
		// No break on purpose
		case 4:
			scene->_field127A = scene->_unkObj1.sub1097C9(scene->_field127A + 70) - 70;
			break;
		case 2:
		// No break on purpose
		case 6:
			scene->_field127C = scene->_unkObj1.sub1097EF(scene->_field127C + 46) - 46;
			break;
		default:
			break;
		}
		scene->_actor5.hide();
		scene->_actor6.hide();
		_field24 = 0;
		if (_field20 == 0) {
			scene->_actor7.sub1094ED();
			if (scene->_field126E == scene->_field1270)
				scene->_aSound1.play(276);
		}
		break;
		}
	case 10: {
		scene->_fieldAF8 = 160;
		Common::Point pt(160, 73);
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, NULL);

		scene->_fieldB9E = 160 - (_field1E * 2 * 160);
		Common::Point pt2(scene->_fieldB9E, 73);
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, this);
		_actionIndex = 6;
		}
		break;
	case 11: {
		scene->_actor8.setStrip(2);
		scene->_actor8.setPosition(Common::Point(160, 73));
		scene->_fieldAF8 = 160 - (_field1E * 2 * 160);
		Common::Point pt(scene->_fieldAF8, 73);
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, NULL);
		scene->_actor8.fixPriority(11);
		if (_field20 == 0)
			scene->_actor9.setStrip(1);
		else
			scene->_actor9.setStrip(2);
		scene->_actor9.setPosition(Common::Point(160 - (_field1E * 2 * 160), 73));
		scene->_fieldB9E = 160;
		Common::Point pt2(scene->_fieldB9E, 73);
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, this);
		scene->_actor9.fixPriority(1);
		_actionIndex = 5;
		}
		break;
	default:
		break;
	}
}

void Scene3500::Action1::dispatch() {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	Action::dispatch();
	if ((_actionIndex == 1) && (scene->_field126E <= 4)) {
		scene->_rotation->_idxChange = 0;
		signal();
	}
}

void Scene3500::Action2::sub10831F(int arg1) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	_field1E = arg1;
	if (_field1E == -1)
		scene->_actor3.setFrame2(3);
	else
		scene->_actor3.setFrame2(1);

	setActionIndex(0);
}

void Scene3500::Action2::signal() {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	int si;
	int di;

	switch (_actionIndex++) {
	case 0: {
		if (scene->_actor8._mover) {
			si = scene->_fieldAF8;
			di = scene->_fieldB9E;
		} else {
			scene->_fieldAF8 = scene->_actor8._position.x;
			si = scene->_fieldAF8;
			scene->_fieldB9E = scene->_actor9._position.y;
			di = scene->_fieldB9E;
		}

		scene->_actor8._moveDiff.y = 9 - (scene->_field126E / 2);
		Common::Point pt(si, 73 - (_field1E * 12));
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, NULL);

		scene->_actor9._moveDiff.y = 9 - (scene->_field126E / 2);
		Common::Point pt2(di, 73 - (_field1E * 12));
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, NULL);
		scene->_field126E = (scene->_field126E / 2) + (scene->_field126E % 2);
		setDelay(17 - scene->_field126E);
		}
		break;
	case 1: {
		R2_GLOBALS._sound2.play(339);
		if (scene->_actor8._mover) {
			si = scene->_fieldAF8;
			di = scene->_fieldB9E;
		} else {
			si = scene->_actor8._position.x;
			di = scene->_actor9._position.x;
		}

		scene->_actor7.sub1094ED();

		scene->_actor8._moveDiff.y = 9 - (scene->_field126E / 2);
		Common::Point pt(si, 73);
		NpcMover *mover = new NpcMover();
		scene->_actor8.addMover(mover, &pt, NULL);

		scene->_actor9._moveDiff.y = 9 - (scene->_field126E / 2);
		Common::Point pt2(di, 73);
		NpcMover *mover2 = new NpcMover();
		scene->_actor9.addMover(mover2, &pt2, NULL);

		scene->_actor3.setFrame2(2);
		}
		break;
	default:
		break;
	}
}

bool Scene3500::Item4::startAction(CursorType action, Event &event) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	if (scene->_field1286 == 0)
		return true;

	if (scene->_field1286 != 4)
		return SceneHotspot::startAction(action, event);

	R2_GLOBALS._sound2.play(14);
	scene->sub107F71(_field34);

	return true;
}

void Scene3500::Actor7::process(Event &event) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	if (scene->_field1286 == 0)
		return;

	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) && (_bounds.contains(event.mousePos))) {
		_fieldAE = 1 + event.mousePos.y - _position.y;
		event.eventType = EVENT_NONE;
	}

	if ((event.eventType == EVENT_BUTTON_UP) && (_fieldAE != 0)) {
		_fieldAE = 0;
		event.handled = true;
		if (scene->_action1._field24 == 0)
			sub1094ED();
	}

	if (_fieldAE == 0)
		return;

	R2_GLOBALS._sound2.play(338);
	event.handled = true;

	int cx = event.mousePos.y - _fieldAE + 1;
	if (_fieldA6 >= cx) {
		if (_fieldA6 - _fieldAA <= cx)
			sub109693(Common::Point(((_fieldA6 - cx) / 2) + _fieldA4 + ((_fieldA6 - cx) % 2), cx));
		else
			sub109693(Common::Point(_fieldA4 + _fieldA8, _fieldA6 - _fieldAA));
	} else {
		sub109693(Common::Point(_fieldA4, _fieldA6));
	}
}

bool Scene3500::Actor7::startAction(CursorType action, Event &event) {
	Scene3500 *scene = (Scene3500 *)R2_GLOBALS._sceneManager._scene;

	if (scene->_field1286 == 0)
		return true;

	if (scene->_field1286 == 4)
		return false;

	return SceneActor::startAction(action, event);
}

void Scene3500::postInit(SceneObjectList *OwnerList) {
	byte tmpPal[768];
	Rect tmpRect;

	loadScene(1050);
	R2_GLOBALS._uiElements._active = false;
	R2_GLOBALS._v5589E.set(0, 0, 320, 200);
	R2_GLOBALS._sound1.play(305);
	R2_GLOBALS._player._characterIndex = R2_QUINN;
	R2_GLOBALS._player._characterScene[1] = 3500;
	R2_GLOBALS._player._characterScene[2] = 3500;
	R2_GLOBALS._player._characterScene[3] = 3500;
	_field1284 = 0;
	_field1282 = 0;
	_field1278 = 0;
	_field1272 = 1;
	_field1270 = 4;
	_field126E = 4;
	_field127A = 860;
	_field127C = 891;
	_rotation = R2_GLOBALS._scenePalette.addRotation(240, 254, -1);
	_rotation->setDelay(0);
	_rotation->_idxChange = 1;

	for (int i = 240; i <= 254; i++) {
		int tmpIndex = _rotation->_currIndex - 240;

		if (tmpIndex > 254)
			tmpIndex--;

		tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
		tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
		tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
	}

	for (int i = 240; i <= 254; i++) {
		R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
		R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
		R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
	}

	_actor7.sub109466(38, 165, 16, 32, _field1270);
	_actor7.setDetails(3500, 6, 7, -1, 1, (SceneItem *)NULL);
	R2_GLOBALS._sound1.play(276);

	_item4._field34 = 88;
	_item4.setDetails(88, 3500, 18, 10, -1);

	_item5._field34 = 112;
	_item5.setDetails(112, 3500, 9, 10, -1);

	_item6._field34 = 104;
	_item6.setDetails(104, 3500, 15, 10, -1);

	_item7._field34 = 96;
	_item7.setDetails(96, 3500, 12, 10, -1);

	_actor8.postInit();
	_actor8.setup(10501, 1, 1);
	_actor8.setPosition(Common::Point(160, 73));
	_actor8.fixPriority(1);

	_actor9.postInit();
	_actor9.setup(1050, 2, 1);
	_actor9.setPosition(Common::Point(-160, 73));
	_actor9.fixPriority(11);
	_actor9.hide();

	_item2.setDetails(27, 3500, 21, -1, -1);
	_item3.setDetails(Rect(160, 89, 299, 182), 3500, 3, -1, -1, 1, NULL);
	_item1.setDetails(Rect(0, 0, 320, 200), 3500, 0, -1, 2, 1, NULL);

	_actor1.postInit();
	_field1276 = 1;
	_actor1.setup(1004, 1, _field1276);
	_actor1.setPosition(Common::Point(230, 135));
	_actor1.fixPriority(200);
	_actor1._frameChange = 1;

	_actor5.postInit();
	_actor5.setup(1004, 3, 1);
	_actor5.setPosition(Common::Point(117, 163));
	_actor5.fixPriority(200);
	_actor5.hide();

	_actor4.postInit();
	_actor4.setup(1004, 3, 2);
	_actor4.setPosition(Common::Point(126, 163));
	_actor4.fixPriority(200);

	_actor6.postInit();
	_actor6.setup(1004, 3, 3);
	_actor6.setPosition(Common::Point(135, 163));
	_actor6.fixPriority(200);
	_actor6.hide();

	_actor2.postInit();
	_actor2.setup(1004, 4, _field126E + 1);
	_actor2.setPosition(Common::Point(126, 137));
	_actor2.fixPriority(200);

	_actor3.postInit();
	_actor3.setup(1004, 5, 2);
	_actor3.setPosition(Common::Point(126, 108));
	_actor3.fixPriority(200);

	tmpRect.set(160, 89, 299, 182);
	_unkObj1.sub9EDE8(tmpRect);
	_unkObj1.sub51AE9(2);
	_unkObj1.sub51AFD(Common::Point(_field127A, _field127C));

	_action1._field24 = 0;
	warning("gfx_set_pane_p()");
	_unkObj1.sub51B02();
	warning("gfx_set_pane_p()");
	_field1286 = 1;

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.enableControl(CURSOR_USE);
	R2_GLOBALS._player._uiEnabled = false;
	R2_GLOBALS._player._canWalk = false;
}

void Scene3500::remove() {
	_rotation->remove();
	R2_GLOBALS._sound2.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3500::signal() {
	R2_GLOBALS._player.enableControl(CURSOR_USE);
	R2_GLOBALS._player._canWalk = false;
	_field1286 = 1;
}

void Scene3500::process(Event &event) {
	if (_field1286 == 0)
		return;

	if (event.eventType == EVENT_KEYPRESS) {
		switch (event.kbd.keycode) {
		case Common::KEYCODE_1:
			warning("FIXME: keycode = 0x4700");
			R2_GLOBALS._sound2.play(338);
			sub107F71(16);
			event.handled = true;
			break;
		case Common::KEYCODE_2:
			warning("FIXME: keycode = 0x4800");
			R2_GLOBALS._sound2.play(14, NULL, 63);
			sub107F71(88);
			event.handled = true;
			break;
		case Common::KEYCODE_3:
			warning("FIXME: keycode = 0x4900");
			if (_field1270 < 16)
				R2_GLOBALS._sound2.play(338);
			sub107F71(1);
			event.handled = true;
			break;
		case Common::KEYCODE_4:
			warning("FIXME: keycode = 0x4B00");
			R2_GLOBALS._sound2.play(14, NULL, 63);
			sub107F71(112);
			event.handled = true;
			break;
		case Common::KEYCODE_5:
			warning("FIXME: keycode = 0x4D00");
			R2_GLOBALS._sound2.play(14, NULL, 63);
			sub107F71(96);
			event.handled = true;
			break;
		case Common::KEYCODE_6:
			warning("FIXME: keycode = 0x4F00");
			R2_GLOBALS._sound2.play(338);
			sub107F71(0);
			event.handled = true;
			break;
		case Common::KEYCODE_7:
			warning("FIXME: keycode = 0x5000");
			R2_GLOBALS._sound2.play(14, NULL, 63);
			sub107F71(104);
			event.handled = true;
			break;
		case Common::KEYCODE_8:
			warning("FIXME: keycode = 0x5100");
			if (_field1270 != 0)
				R2_GLOBALS._sound2.play(338);
			sub107F71(-1);
			event.handled = true;
			break;
		case Common::KEYCODE_9:
			warning("FIXME: keycode = 0x5200");
			R2_GLOBALS._sound2.play(338);
			sub107F71(8);
			event.handled = true;
			break;
		case Common::KEYCODE_0:
			warning("FIXME: keycode = 0x5300");
			R2_GLOBALS._sound2.play(338);
			sub107F71(4);
			event.handled = true;
			break;
		default:
			break;
		}
	}

	if (!event.handled)
		_actor7.process(event);

	if (!event.handled)
		_item4.process(event);

	if (!event.handled)
		_item5.process(event);

	if (!event.handled)
		_item6.process(event);

	if (!event.handled)
		_item7.process(event);

	Scene::process(event);
}

void Scene3500::dispatch() {
	Rect tmpRect;
	Scene::dispatch();
	if (((_actor1._frame % 2) == 0) && (_action1._field24 == 0)) {
		_actor1.setFrame(_actor1.changeFrame());
		_field1276 = _actor1._frame;
	}
	int oldField1278;
	if ((_field1278 != 0) && (_action1._field24 == 0)) {
		oldField1278 = _field1278;
		_field1278 = 0;
		sub107F71(oldField1278);
	}

	if (!_rotation)
		return;

	int var_field127A = 0;
	int di = 0;
	int var_4 = 0;
	int var_6 = 0;
	int var_8 = 0;
	int var_a = 0;
	int dx = 0;
	int tmpVar = 0;

	if ((_field126E == 0) && (_field1282 == 0)) {
		if (_field1284 == 2)
			R2_GLOBALS._sceneManager.changeScene(1000);
	} else {
		_field1282 = 0;
		tmpRect.set(160, 89, 299, 182);

		var_field127A = _field127A;
		di = _field127C;
		var_4 = _unkObj1.sub1097C9(70) - 70;
		var_6 = _unkObj1.sub1097EF(_field127C + 46) - 46;
		var_8 = abs(var_4 - var_field127A);
		var_a = abs(var_6 - di);
		dx = 0;

		switch (_field1276) {
		case 0:
			tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, 46));
			if (    ((tmpVar == 2) || (tmpVar == 3) || (tmpVar == 6) || (tmpVar == 1))
				|| (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 > 3)) ) {
				R2_GLOBALS._sound2.play(339);
				_rotation->_idxChange = 0;
				_field1270 = 0;
				_field126E = 0;
				_field1272 = 0;
				if (_action1._field24 == 0)
					_actor8.hide();
			} else {
				var_6 = _unkObj1.sub1097EF(di + 46) - 46;
				di = _field127C - _field126E;
				dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
				if (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4)) && (tmpVar != dx)) {
					di = var_6;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else if ((tmpVar == 11) && (tmpVar != dx)) {
					di = var_6 + 3;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else {
					var_6 = _unkObj1.sub1097EF(di + 46) - 46;
					var_a = abs(var_6 - di);
					tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));

					if ( (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4)) && (di <= var_6) && (_field127C>= var_6))
						|| (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (_field126E >= var_a) && (_field126E > 3) && (_action1._field24 != 0)) ) {
						di = var_6;
						if ((tmpVar != 25) && (tmpVar != 26) && (tmpVar != 5) && (tmpVar != 14) && (tmpVar == 15))
							R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if ((tmpVar == 11) && (var_6 + 3 >= di) && (_field127C >= var_6 + 3)) {
						R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 != 0) && (var_8 <= 3)) {
						var_field127A = var_4;
						R2_GLOBALS._sound2.play(339);
					} else {
						// Nothing
					}
				}
			}
			break;
		case 2:
			tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
			if (  ((tmpVar == 12) || (tmpVar == 13) || (tmpVar == 11) || (tmpVar == 16) || (tmpVar == 31))
			  || (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (var_a > 3)) ) {
				R2_GLOBALS._sound2.play(339);
				_rotation->_idxChange = 0;
				_field1270 = 0;
				_field126E = 0;
				_field1272 = 0;
				if (_action1._field24 == 0)
					_actor8.hide();
			} else {
				var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
				var_field127A = _field127A + _field126E;
				dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
				if (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15)) && (tmpVar != dx)) {
					var_field127A = var_4;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else if ((tmpVar == 6) && (tmpVar != dx)) {
					var_field127A = var_4 - 5;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else {
					var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
					var_8 = abs(var_field127A - var_4);
					tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, tmpVar + 46));
					if ( (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15)) && (var_field127A >= var_4) && (_field127A <= var_4))
						|| (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (_field126E >= var_8) && (_field126E <= 3) && (_action1._field24 != 0)) ) {
						var_field127A = var_4;
						if ((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4))
							R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if ((tmpVar == 6) && (var_4 - 5 <= var_field127A) && (_field127A <= var_4 - 5)) {
						var_field127A = var_4 - 5;
						R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)) && (var_a != 0) && (var_a <= 3)) {
						di = var_6;
						R2_GLOBALS._sound2.play(339);
					} else {
						// Nothing
					}
				}
			}
			break;
		case 4:
			tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
			if (  ((tmpVar == 2) || (tmpVar == 3) || (tmpVar == 6) || (tmpVar == 1))
			  || (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 > 3)) ) {
				R2_GLOBALS._sound2.play(339);
				_rotation->_idxChange = 0;
				_field1270 = 0;
				_field126E = 0;
				_field1272 = 0;
				if (_action1._field24 == 0)
					_actor8.hide();
			} else {
				var_6 = _unkObj1.sub1097EF(di + 46) - 46;
				di = _field127C + _field126E;
				dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
				if (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5)) && (tmpVar == dx)) {
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else if ((tmpVar == 16) && (tmpVar == dx)) {
					di = var_6 - 3;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else if ((tmpVar == 31) && (tmpVar == dx)) {
					di = var_6 + 4;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else {
					var_6 = _unkObj1.sub1097EF(di + 46) - 46;
					var_a = abs(di - var_6);
					tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
					if ( (((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5)) && (di >= var_6) && (_field127C <= var_6))
					  || (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (_field126E >= var_a) && (_field126E <= 3) && (_action1._field24 != 0)) ){
						if ((tmpVar != 23) && (tmpVar != 24) && (tmpVar != 4) && (tmpVar != 14) && (tmpVar != 15))
							R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if ((tmpVar == 16) && (var_6 - 3 <= di) && (_field127C <= var_6 - 3)) {
						di = var_6 - 3;
						R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if ((tmpVar == 31) && (var_6 + 4 <= di) && (_field127C <= var_6 + 4)) {
						di = var_6 + 4;
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
						if ((var_field127A == 660) && (_field126E + 306 <= di) && (di <= 307))
							 ++_field1284;
						else
							R2_GLOBALS._sound2.play(339);
					} else if (((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)) && (var_8 != 0) && (var_8 <= 3)) {
						var_field127A = var_4;
						R2_GLOBALS._sound2.play(339);
					} else {
						// Nothing
					}
				}
			}
			break;
		case 6:
			tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
			if ( ((tmpVar == 12) || (tmpVar == 13) || (tmpVar == 11) || (tmpVar == 16) || (tmpVar == 31))
			 || (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (var_a > 3)) ) {
				R2_GLOBALS._sound2.play(339);
				_rotation->_idxChange = 0;
				_field1270 = 0;
				_field126E = 0;
				_field1272 = 0;
				if (_action1._field24 == 0)
					_actor8.hide();
			} else {
				var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
				var_field127A = _field127A - _field126E;
				dx = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
				if (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14)) && (tmpVar != dx)) {
					var_field127A = var_4;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else if ((tmpVar == 1) && (tmpVar != dx)) {
					var_field127A = var_4 + 5;
					R2_GLOBALS._sound2.play(339);
					_rotation->_idxChange = 0;
					_field1270 = 0;
					_field126E = 0;
					_field1272 = 0;
					if (_action1._field24 == 0)
						_actor8.hide();
				} else {
					var_4 = _unkObj1.sub1097C9(var_field127A + 70) - 70;
					var_8 = abs(var_4 - var_field127A);
					tmpVar = _unkObj1.sub109C09(Common::Point(var_field127A + 70, di + 46));
					if ( (((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14)) && (var_field127A <= var_4) && (_field127A >= var_4))
					  || (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (_field126E >= var_8) && (_field126E <= 3) && (_action1._field24 != 0)) ) {
						var_field127A = var_4;
						if ((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4))
							R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if ((tmpVar == 1) && (var_field127A >= var_4 + 5) && (_field127A >= var_4 + 5)) {
						var_field127A = var_4 + 5;
						R2_GLOBALS._sound2.play(339);
						_rotation->_idxChange = 0;
						_field1270 = 0;
						_field126E = 0;
						_field1272 = 0;
						if (_action1._field24 == 0)
							_actor8.hide();
					} else if (((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4)) && (var_a != 0) && (var_a <= 3)) {
						di = var_6;
						R2_GLOBALS._sound2.play(339);
					} else {
						// Nothing
					}
				}
			}
			break;
		default:
			break;
		}

		if (_field1284 < 2) {
			_field127A = var_field127A;
			_field127C = di;
			if (_unkObj1.sub109C5E(_field127A, _field127C) != 0) {
				_field1272 = 0;
				_field126E = 0;
				_field1270 = 0;
				_rotation->setDelay(0);
				_rotation->_idxChange = 0;
			}
			warning("gfx_set_pane_p");
			_unkObj1.sub51B02();
			if (_field1284 != 0)
				++_field1284;
		}
	}

	if (_field1272 == 0) {
		if (_field126E != _field1270) {
			if (_field126E >= _field1270) {
				if (_field126E == 1) {
					if (_action1._field24 != 0) {
						if ( ((_field1276 == 1) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((tmpVar == 25) || (tmpVar == 26) || (tmpVar == 5) || (tmpVar == 14) || (tmpVar == 15)))
						  || ((_field1276 == 3) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((tmpVar == 25) || (tmpVar == 23) || (tmpVar == 14) || (tmpVar == 5) || (tmpVar == 4)))
						  || ((_field1276 == 5) && (var_8 == 0) && (var_a != 0) && (var_a <= 3) && ((tmpVar == 23) || (tmpVar == 24) || (tmpVar == 4) || (tmpVar == 14) || (tmpVar == 15)))
						  || ((_field1276 == 7) && (var_a == 0) && (var_8 != 0) && (var_8 <= 3) && ((tmpVar == 26) || (tmpVar == 24) || (tmpVar == 15) || (tmpVar == 5) || (tmpVar == 4))) ){
							_field126E = 1;
						} else
							_field126E--;
					} else
						_field126E--;
				} else
					_field126E--;
			} else
				++_field126E;
			_field1272 = 1;
		}
		_actor2.setFrame2(_field126E);
	}

	if (_field1272 == 1) {
		if (_field126E == 0)
			_rotation->_idxChange = 0;
		else if (_field126E > 8)
			_rotation->_idxChange = 2;
		else
			_rotation->_idxChange = 1;
	}

	if (_field1272 != 0)
		_field1272--;

	if (_field126E != 0) {
		R2_GLOBALS._player._uiEnabled = false;
		if (_field126E != _field1270)
			_aSound1.play(276);
	} else {
		R2_GLOBALS._player._uiEnabled = true;
		_aSound1.fadeOut2(NULL);
	}

	if (_rotation->_currIndex != _field1274)
		_field1274 = _rotation->_currIndex;
}

/*--------------------------------------------------------------------------
 * Scene 3600 -
 *
 *--------------------------------------------------------------------------*/
Scene3600::Scene3600() {
	_field2548 = 0;
	_field254A = 0;
	_field254C = 0;
	_field254E = 0;
	_field2550 = false;
}
void Scene3600::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field2548);
	s.syncAsSint16LE(_field254A);
	s.syncAsSint16LE(_field254C);
	s.syncAsSint16LE(_field254E);
	s.syncAsSint16LE(_field2550);
}

Scene3600::Action3600::Action3600() {
	_field1E = 0;
	_field20 = 0;
}

void Scene3600::Action3600::synchronize(Serializer &s) {
	Action::synchronize(s);

	s.syncAsSint16LE(_field1E);
	s.syncAsSint16LE(_field20);
}

void Scene3600::Action3600::signal() {
	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;

	switch (_actionIndex) {
	case 0:
		++_actionIndex;
		setDelay(60);
		break;
	case 1:
		if (_field1E == 0) {
			_field1E = 1;
			scene->_actor2.setAction(NULL);
			R2_GLOBALS._sound2.play(330, NULL, 0);
			R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
		}
		setDelay(1);
		warning("TODO: Palette fader using parameter 2 = 256");
		R2_GLOBALS._scenePalette.fade((const byte *)&scene->_palette1._palette, true, _field20);
		if (_field20 > 0)
			_field20 -= 2;
		break;
	case 2:
		R2_GLOBALS._sound2.stop();
		++_actionIndex;
		setDelay(3);
		break;
	case 3:
		R2_GLOBALS._sound2.play(330, this, 0);
		R2_GLOBALS._sound2.fade(127, 5, 10, false, NULL);
		_actionIndex = 1;
		break;
	default:
		break;
	}
}

void Scene3600::Action2::signal() {
	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;

	switch (_actionIndex) {
	case 3621:
		R2_GLOBALS._events.proc1();
		R2_GLOBALS._player.enableControl();
		_actionIndex = 3619;
		scene->_actor13._state = 0;
	// No break on purpose
	case 3619: {
		++_actionIndex;
		scene->_actor13.setup(3127, 2, 1);
		scene->_actor13.animate(ANIM_MODE_1, NULL);
		NpcMover *mover = new NpcMover();
		scene->_actor13.addMover(mover, &scene->_actor13._field8A, scene);
		}
		break;
	default:
		_actionIndex = 3619;
		setDelay(360);
		break;
	}
}

bool Scene3600::Item5::startAction(CursorType action, Event &event) {
	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;

	if ((action != CURSOR_USE) || (scene->_action1._field1E == 0))
		return SceneItem::startAction(action, event);

	R2_GLOBALS._walkRegions.disableRegion(2);
	R2_GLOBALS._walkRegions.disableRegion(7);

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 3624;
	scene->_actor10.setStrip2(-1);
	scene->_actor11.setStrip2(-1);
	scene->_actor12.setStrip2(-1);
	scene->_actor4.setStrip2(-1);

	if (R2_GLOBALS._player._characterIndex == 2)
		R2_GLOBALS._player.setAction(&scene->_sequenceManager3, scene, 3611, &R2_GLOBALS._player, NULL);
	else if (R2_GLOBALS._player._characterIndex == 3)
		R2_GLOBALS._player.setAction(&scene->_sequenceManager4, scene, 3612, &R2_GLOBALS._player, NULL);
	else
		R2_GLOBALS._player.setAction(&scene->_sequenceManager2, scene, 3610, &R2_GLOBALS._player, NULL);

	return true;
}

bool Scene3600::Actor13::startAction(CursorType action, Event &event) {
	Scene3600 *scene = (Scene3600 *)R2_GLOBALS._sceneManager._scene;

	switch(action) {
	case CURSOR_TALK:
		if (!_action)
			return SceneActor::startAction(action, event);

		scene->_protectorSpeaker._displayMode = 1;
		if (!R2_GLOBALS._player._mover)
			R2_GLOBALS._player.addMover(NULL);
		if (!scene->_actor10._mover)
			scene->_actor10.addMover(NULL);
		if (!scene->_actor11._mover)
			scene->_actor11.addMover(NULL);
		if (!scene->_actor12._mover)
			scene->_actor12.addMover(NULL);
		if (!scene->_actor4._mover)
			scene->_actor4.addMover(NULL);

		setup(3127, 2, 1);
		scene->_sceneMode = 3327;
		scene->_stripManager.start(3327, scene);

		return true;
	case R2_SONIC_STUNNER:
	// No break on purpose
	case R2_PHOTON_STUNNER:
		if (action == R2_SONIC_STUNNER)
			R2_GLOBALS._sound3.play(43);
		else
			R2_GLOBALS._sound3.play(99);
		if (_state != 0) {
			_state = 1;
			setup(3128, 1, 1);
			addMover(NULL);
		}
		scene->_action2.setActionIndex(3621);

		if (!_action)
			setAction(&scene->_action2, scene, NULL);

		animate(ANIM_MODE_5, &scene->_action2);
		R2_GLOBALS._player.disableControl();
		return true;
		break;
	default:
		return SceneActor::startAction(action, event);
		break;
	}
}

void Scene3600::postInit(SceneObjectList *OwnerList) {
	if (R2_GLOBALS._sceneManager._previousScene == 3600) {
		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
		R2_GLOBALS._v558B6.set(60, 0, 260, 200);
	} else {
		R2_GLOBALS._scrollFollower = &_actor2;
		g_globals->gfxManager()._bounds.moveTo(Common::Point(160, 0));
		R2_GLOBALS._v558B6.set(25, 0, 260, 200);
	}

	loadScene(3600);
	SceneExt::postInit();
	_field254C = 0;

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_tealSpeaker);
	_stripManager.addSpeaker(&_protectorSpeaker);

	setZoomPercents(142, 80, 167, 105);
	R2_GLOBALS._player._characterScene[1] = 3600;
	R2_GLOBALS._player._characterScene[2] = 3600;
	R2_GLOBALS._player._characterScene[3] = 3600;

	_item2.setDetails(33, 3600, 6, -1, -1);
	_item3.setDetails(Rect(3, 3, 22, 45), 3600, 9, -1, -1, 1, NULL);
	_item4.setDetails(Rect(449, 3, 475, 45), 3600, 9, -1, -1, 1, NULL);

	_actor10.postInit();
	_actor10._moveDiff = Common::Point(3, 2);
	_actor10.changeZoom(-1);
	_actor10._effect = 1;

	if (R2_GLOBALS._player._characterIndex != 1)
		_actor10.setDetails(9001, 0, -1, -1, 1, (SceneItem *) NULL);

	_actor11.postInit();
	_actor11._numFrames = 7;
	_actor11._moveDiff = Common::Point(5, 3);
	_actor11.changeZoom(-1);
	_actor11._effect = 1;

	if (R2_GLOBALS._player._characterIndex != 2)
		_actor11.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);

	_actor12.postInit();
	_actor12._moveDiff = Common::Point(3, 2);
	_actor12.changeZoom(-1);
	_actor12._effect = 1;

	if (R2_GLOBALS._player._characterIndex != 3)
		_actor12.setDetails(9003, 1, -1, -1, 1, (SceneItem *) NULL);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.changeZoom(-1);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_actor4.postInit();
	_actor4._numFrames = 7;
	_actor4._moveDiff = Common::Point(5, 3);
	_actor4.changeZoom(-1);
	_actor4._effect = 1;
	_actor4.setDetails(3600, 27, -1, -1, 1, (SceneItem *) NULL);

	_actor5.postInit();
	_actor5._numFrames = 7;
	_actor5._moveDiff = Common::Point(3, 2);
	_actor5.changeZoom(-1);
	_actor5._effect = 1;
	_actor5.setDetails(3600, 12, -1, -1, 1, (SceneItem *) NULL);

	_palette1.loadPalette(0);
	_palette1.loadPalette(3601);

	if (R2_GLOBALS._sceneManager._previousScene == 3600) {
		_item5._sceneRegionId = 200;
		_item5.setDetails(3600, 30, -1, -1, 5, &_actor4);
		_field254A = 1;
		_field2548 = 1;

		R2_GLOBALS._walkRegions.enableRegion(2);
		R2_GLOBALS._walkRegions.enableRegion(7);
		R2_GLOBALS._walkRegions.enableRegion(14);
		R2_GLOBALS._walkRegions.enableRegion(15);
		R2_GLOBALS._walkRegions.enableRegion(16);

		_actor10.setup(10, 5, 11);
		_actor10.animate(ANIM_MODE_1, NULL);

		_actor11.setup(20, 5, 11);
		_actor11.animate(ANIM_MODE_1, NULL);

		_actor12.setup(30, 5, 11);
		_actor12.animate(ANIM_MODE_1, NULL);

		if (R2_GLOBALS._player._characterIndex == 2) {
			_actor10.setPosition(Common::Point(76, 148));
			_actor11.setPosition(Common::Point(134, 148));
			_actor12.setPosition(Common::Point(100, 148));
			R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
			R2_GLOBALS._player.setup(20, _actor11._strip, 1);
			R2_GLOBALS._player.setPosition(_actor11._position);
			_actor11.hide();
		} else if (R2_GLOBALS._player._characterIndex == 3) {
			_actor10.setPosition(Common::Point(110, 148));
			_actor11.setPosition(Common::Point(76, 148));
			_actor12.setPosition(Common::Point(134, 148));
			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
			R2_GLOBALS._player.setup(30, _actor12._strip, 1);
			R2_GLOBALS._player.setPosition(_actor12._position);
			_actor12.hide();
		} else {
			_actor10.setPosition(Common::Point(134, 148));
			_actor11.setPosition(Common::Point(76, 148));
			_actor12.setPosition(Common::Point(110, 148));
			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
			R2_GLOBALS._player.setup(10, _actor10._strip, 1);
			R2_GLOBALS._player.setPosition(_actor10._position);
			_actor10.hide();
		}
		_actor4.setPosition(Common::Point(47, 149));
		_actor4.setup(40, 1, 11);
		_actor4.animate(ANIM_MODE_1, NULL);

		_actor5.setPosition(Common::Point(367, 148));
		_actor5.setup(3601, 7, 5);

		if (!R2_GLOBALS.getFlag(71)) {
			_actor13.postInit();
			_actor13._state = 0;
			_actor13._field8A = Common::Point(226, 152);
			_actor13._moveDiff = Common::Point(3, 2);
			_actor13.setPosition(Common::Point(284, 152));
			_actor13.setup(3127, 2, 1);
			_actor13.changeZoom(-1);
			_actor13.setDetails(3600, 15, -1, 17, 1, (SceneItem *) NULL);
		}

		R2_GLOBALS._sound2.play(330);
		_actor3.postInit();
		_actor3.setPosition(Common::Point(84, 156));
		_actor3.fixPriority(158);
		_actor3.setup(3601, 5, 1);
		_actor3.animate(ANIM_MODE_2, NULL);

		_action1._field1E = 1;
		_action1._field20 = 0;
		_action1.setActionIndex(1);

		_actor3.setAction(&_action1);
		_sceneMode = 3623;

		g_globals->_events.setCursor(CURSOR_ARROW);
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
	} else {
		_field254A = 0;
		_field2548 = 0;

		R2_GLOBALS._walkRegions.enableRegion(17);
		R2_GLOBALS._walkRegions.enableRegion(18);

		_actor10.setPosition(Common::Point(393, 148));
		_actor11.setPosition(Common::Point(364, 153));
		_actor12.setPosition(Common::Point(413, 164));

		R2_GLOBALS._player.hide();

		_actor4.setPosition(Common::Point(373, 164));

		_actor5.setup(3403, 8, 11);
		_actor5.setPosition(Common::Point(403, 155));

		_actor12.setup(3403, 7, 1);

		_actor13.setPosition(Common::Point(405, 155));

		_actor2.postInit();
		_actor2.setup(3600, 2, 1);
		_actor2.setPosition(Common::Point(403, 161));
		_actor2.fixPriority(149);
		_actor2.changeZoom(-1);

		_action1._field1E = 0;
		_action1._field20 = 90;

		_sceneMode = 3600;
		setAction(&_sequenceManager1, this, 3600, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, &_actor2, NULL);
		_field254E = 0;
	}
	_field254E = 0;
	_field2550 = R2_GLOBALS.getFlag(71);

	R2_GLOBALS._sound1.play(326);
	_item1.setDetails(Rect(0, 0, 480, 200), 3600, 0, -1, -1, 1, NULL);
}

void Scene3600::remove() {
	_actor3.animate(ANIM_MODE_NONE, NULL);
	_actor3.setAction(NULL);
	R2_GLOBALS._sound2.fadeOut2(NULL);
	R2_GLOBALS._sound1.fadeOut2(NULL);
	R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
	SceneExt::remove();
}

void Scene3600::signal() {
	switch (_sceneMode) {
	case 3320:
		warning("STUB: sub_1D227()");
		R2_GLOBALS._walkRegions.enableRegion(14);
		R2_GLOBALS._scrollFollower = &_actor11;
		_tealSpeaker._object1.hide();
		_actor5.show();
		_actor5.setStrip(2);
		if (R2_GLOBALS._player._characterIndex == 2)
			_sceneMode = 3602;
		else if (R2_GLOBALS._player._characterIndex == 3)
			_sceneMode = 3603;
		else
			_sceneMode = 3601;
		setAction(&_sequenceManager1, this, _sceneMode, &_actor11, &_actor10, &_actor12, &_actor4, &_actor5, NULL);
		break;
	case 3321:
		warning("STUB: sub_1D227()");
		R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
		_tealSpeaker.proc16();
		_actor5.show();
		_actor5.setStrip(1);
		_actor3.postInit();
		_sceneMode = 3604;
		setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_actor3, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
		break;
	case 3322:
		warning("STUB: sub_1D227()");
		_quinnSpeaker.proc16();
		_quinnSpeaker._displayMode = 1;
		_tealSpeaker.proc16();
		_tealSpeaker._displayMode = 7;
		R2_GLOBALS._scrollFollower = &_actor5;
		_sceneMode = 3605;
		setAction(&_sequenceManager1, this, _sceneMode, &_actor5, &_actor13, &_actor2, NULL);
		break;
	case 3323:
		if (_field254A == 0)
			_field254A = 1;
		else {
			warning("STUB: sub_1D227()");
			_protectorSpeaker.proc16();
			_actor13.show();
			_actor13.setup(3258, 6, 1);
			_sceneMode = 3607;
			_actor13.setAction(&_sequenceManager1, this, _sceneMode, &_actor13, NULL);
			R2_GLOBALS._v558C2 = 1;
			_protectorSpeaker.proc16();
			_protectorSpeaker._displayMode = 1;
			_quinnSpeaker._displayMode = 1;
			_actor13.show();
			R2_GLOBALS._scrollFollower = &R2_GLOBALS._player;
			R2_GLOBALS._walkRegions.disableRegion(17);
			R2_GLOBALS._walkRegions.disableRegion(18);
			R2_GLOBALS._walkRegions.enableRegion(2);
			R2_GLOBALS._walkRegions.enableRegion(7);
			R2_GLOBALS._walkRegions.enableRegion(14);
			R2_GLOBALS._walkRegions.enableRegion(15);
			R2_GLOBALS._walkRegions.enableRegion(16);
			_actor13.setAction(&_action1);
		}
		break;
	case 3324:
	// No break on purpose
	case 3607:
		g_globals->_events.setCursor(CURSOR_ARROW);
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		_actor13.fixPriority(-1);
		_sceneMode = 3623;
		_field2548 = 1;
		break;
	case 3327:
		g_globals->_events.setCursor(CURSOR_ARROW);
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		_sceneMode = 3623;
		break;
	case 3450:
		R2_GLOBALS._sound1.stop();
		_actor1.hide();
		_actor6.hide();
		g_globals->gfxManager()._bounds.moveTo(Common::Point(40, 0));
		setZoomPercents(142, 80, 167, 105);
		loadScene(3600);
		R2_GLOBALS._uiElements.show();
		_item5._sceneRegionId = 200;
		_item5.setDetails(3600, 30, -1, -1, 5, &_actor4);

		_actor3.show();
		_actor10.show();
		_actor11.show();
		_actor12.show();
		_actor4.show();
		_actor5.show();

		_actor5.setPosition(Common::Point(298, 151));

		_actor13.postInit();
		_actor13._state = 0;
		_actor13._field8A = Common::Point(226, 152);
		_actor13._moveDiff = Common::Point(5, 3);
		_actor13.setup(3403, 7, 1);
		_actor13.setPosition(Common::Point(405, 155));
		_actor13.changeZoom(-1);
		_actor13.addMover(NULL);
		_actor13.animate(ANIM_MODE_NONE);
		_actor13.hide();
		_actor13.setDetails(3600, 15, -1, 17, 5, &_item5);

		_actor2.setup(3600, 2, 1);
		_actor2.setPosition(Common::Point(403, 161));
		_actor2.fixPriority(149);
		_actor2.changeZoom(-1);
		_actor2.show();

		_quinnSpeaker._displayMode = 2;
		_tealSpeaker._displayMode = 2;

		if (R2_GLOBALS._player._characterIndex == 2) {
			R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
			R2_GLOBALS._player.setup(20, _actor11._strip, 1);
			R2_GLOBALS._player.setPosition(_actor11._position);
			_actor11.hide();
		} else if (R2_GLOBALS._player._characterIndex == 3) {
			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
			R2_GLOBALS._player.setup(30, _actor12._strip, 1);
			R2_GLOBALS._player.setPosition(_actor12._position);
			_actor12.hide();
		} else {
			R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
			R2_GLOBALS._player.setup(10, _actor10._strip, 1);
			R2_GLOBALS._player.setPosition(_actor10._position);
			_actor10.hide();
		}
		R2_GLOBALS._player.show();
		R2_GLOBALS._sound1.play(326);
		_sceneMode = 3322;
		_stripManager.start(3322, this);
		R2_GLOBALS._sound2.play(329);
		break;
	case 3600:
		_sceneMode = 3320;
		_stripManager.start(3320, this);
		break;
	case 3601:
	// No break on purpose
	case 3602:
	// No break on purpose
	case 3603:
		R2_GLOBALS._walkRegions.enableRegion(2);
		R2_GLOBALS._walkRegions.enableRegion(7);
		R2_GLOBALS._v558B6.set(60, 0, 260, 200);
		_tealSpeaker._displayMode = 1;
		_sceneMode = 3321;
		_stripManager.start(3321, this);
		break;
	case 3604:
		R2_GLOBALS._sound2.fadeOut2(NULL);
		R2_GLOBALS._sound1.stop();
		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(7);

		_actor2.hide();
		_actor3.hide();
		R2_GLOBALS._player.hide();
		_actor10.hide();
		_actor11.hide();
		_actor12.hide();
		_actor4.hide();
		_actor5.hide();

		g_globals->gfxManager()._bounds.moveTo(Common::Point(60, 0));
		setZoomPercents(51, 46, 180, 200);

		loadScene(3400);
		R2_GLOBALS._uiElements.show();
		_actor1.postInit();

		_actor2.setup(3403, 1, 1);
		_actor2.setPosition(Common::Point(190, 103));
		_actor2.fixPriority(89);
		_actor2.show();

		_actor6.postInit();
		_actor6.setup(3400, 1, 6);
		_actor6.setPosition(Common::Point(236, 51));
		_actor6.fixPriority(51);
		R2_GLOBALS._scrollFollower = &_actor6;

		R2_GLOBALS._sound1.play(323);
		_sceneMode = 3450;
		setAction(&_sequenceManager1, this, 3450, &_actor1, &_actor6, NULL);
		break;
	case 3605:
		_actor13.setup(3258, 4, 1);
		_actor13.setAction(&_sequenceManager1, this, 3606, &_actor5, &_actor13, &_actor2, NULL);
		_sceneMode = 3323;
		_stripManager.start(3323, this);

		break;
	case 3620:
	// No break on purpose
	case 3623:
		if ((_actor13._position.x == 226) && (_actor13._position.y == 152) && (_action1._field1E != 0) && (_actor13._visage == 3127) && (!R2_GLOBALS.getFlag(71))) {
			R2_GLOBALS._sound2.stop();
			R2_GLOBALS._sound2.play(331);
			R2_GLOBALS.setFlag(71);
			_sceneMode = 3626;
			setAction(&_sequenceManager1, this, 3626, &_actor13, NULL);
		}
		break;
	case 3624:
		R2_GLOBALS._player.disableControl();
		if ((_field254E != 0) && (_actor10._position.x == 229) && (_actor10._position.y == 154) && (_actor11._position.x == 181) && (_actor11._position.y == 154) && (_actor12._position.x == 207) && (_actor12._position.y == 154) && (_actor4._position.x == 155) && (_actor4._position.y == 154)) {
			R2_GLOBALS._sound2.stop();
			R2_GLOBALS._sound2.play(331);
			_sceneMode = 3625;
			setAction(&_sequenceManager1, this, 3625, &_actor10, &_actor11, &_actor12, &_actor4, NULL);
		}
		break;
	case 3625:
		R2_GLOBALS._sound2.stop();
		R2_GLOBALS._sceneManager.changeScene(3700);
		break;
	case 3626:
		_actor13.setPosition(Common::Point(0, 0));
		_action1.setActionIndex(2);
		if (R2_GLOBALS._events.getCursor() > R2_LAST_INVENT) {
			R2_GLOBALS._events.setCursor(CURSOR_USE);
			R2_GLOBALS._player.enableControl(CURSOR_USE);
		} else {
			R2_GLOBALS._player.enableControl();
		}
		R2_GLOBALS._sound2.stop();
		_sceneMode = 3623;
		break;
	default:
		break;
	}
}

void Scene3600::process(Event &event) {
	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_ARROW) && (event.mousePos.x > 237) && (!R2_GLOBALS.getFlag(71))) {
		SceneItem::display(3600, 17, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7 -999);
		event.handled = true;
	}
	Scene::process(event);
}

void Scene3600::dispatch() {
	if ((R2_GLOBALS._player.getRegionIndex() == 200) && (_action1._field1E != 0) && (_field254E == 0)){
		R2_GLOBALS._sound2.fadeOut2(NULL);
		if (_actor13._mover)
			_actor13.addMover(NULL);
		if (R2_GLOBALS._player._action)
			R2_GLOBALS._player.setAction(NULL);
		if (R2_GLOBALS._player._mover)
			R2_GLOBALS._player.addMover(NULL);

		_field254C = 0;
		_field254E = 1;

		R2_GLOBALS._walkRegions.disableRegion(2);
		R2_GLOBALS._walkRegions.disableRegion(7);
		R2_GLOBALS._player.disableControl();

		_sceneMode = 3624;

		_actor10.setStrip(-1);
		_actor11.setStrip(-1);
		_actor12.setStrip(-1);
		_actor4.setStrip(-1);

		R2_GLOBALS._player.hide();

		if (R2_GLOBALS._player._characterIndex == 2) {
			_actor11.setPosition(R2_GLOBALS._player._position);
			_actor11.show();
		} else if (R2_GLOBALS._player._characterIndex == 3) {
			_actor12.setPosition(R2_GLOBALS._player._position);
			_actor12.show();
		} else {
			_actor10.setPosition(R2_GLOBALS._player._position);
			_actor10.show();
		}
		_actor10.setAction(&_sequenceManager2, this, 3610, &_actor10, NULL);
		_actor11.setAction(&_sequenceManager3, this, 3611, &_actor11, NULL);
		_actor12.setAction(&_sequenceManager4, this, 3612, &_actor12, NULL);
		_actor4.setAction(&_sequenceManager1, this, 3613, &_actor4, NULL);
	}

	if ((_actor13.getRegionIndex() == 200) && (_action1._field1E != 0) && (_field254E == 0)){
		R2_GLOBALS._sound2.fadeOut2(NULL);
		_sceneMode = 3620;
		_field2550 = 1;
		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS._player._mover)
			R2_GLOBALS._player.addMover(NULL);
		if (_actor10._mover)
			_actor10.addMover(NULL);
		if (_actor11._mover)
			_actor11.addMover(NULL);
		if (_actor12._mover)
			_actor12.addMover(NULL);
		if (_actor4._mover)
			_actor4.addMover(NULL);
	}
	Scene::dispatch();
}

/*--------------------------------------------------------------------------
 * Scene 3700 - Cutscene - Teleport outside
 *
 *--------------------------------------------------------------------------*/
void Scene3700::postInit(SceneObjectList *OwnerList) {
	loadScene(3700);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_mirandaSpeaker);

	_actor1.postInit();
	_actor1._moveDiff = Common::Point(3, 2);

	_actor2.postInit();
	_actor2._numFrames = 7;
	_actor2._moveDiff = Common::Point(5, 3);
	_actor2.hide();

	_actor3.postInit();
	_actor3._moveDiff = Common::Point(3, 2);
	_actor3.hide();

	_actor4.postInit();
	_actor4._numFrames = 7;
	_actor4._moveDiff = Common::Point(5, 3);
	_actor4.hide();

	_actor5.postInit();

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._sound1.play(332);

	_sceneMode = 3700;
	setAction(&_sequenceManager, this, 3700, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, NULL);
}

void Scene3700::remove() {
	R2_GLOBALS._sound1.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene3700::signal() {
	switch (_sceneMode) {
	case 3328:
	// No break on purpose
	case 3329:
		warning("STUB: sub_1D227()");
		_sceneMode = 3701;
		setAction(&_sequenceManager, this, 3701, &_actor2, &_actor3, &_actor4, NULL);
		break;
	case 3700:
		_actor1.setup(10, 6, 1);
		_actor2.setup(20, 5, 1);
		if (R2_GLOBALS.getFlag(71)) {
			_sceneMode = 3329;
			_stripManager.start(3329, this);
		} else {
			_sceneMode = 3328;
			_stripManager.start(3328, this);
		}
		break;
	case 3701:
		R2_GLOBALS._sceneManager.changeScene(1000);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 3800 -
 *
 *--------------------------------------------------------------------------*/
Scene3800::Scene3800() {
	_field412 = 0;
}
void Scene3800::synchronize(Serializer &s) {
	SceneExt::synchronize(s);

	s.syncAsSint16LE(_field412);
}

void Scene3800::Exit1::changeScene() {
	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_field412 = 1;

	if (R2_GLOBALS.getFlag(46)) {
		if (scene->_field412 == R2_GLOBALS._v566A9) {
			R2_GLOBALS._v566AA = 3;
			if (R2_GLOBALS._v56A93 + 1 == 0) {
				R2_GLOBALS._v566A8--;
				R2_GLOBALS._v566A9 = 0;
			} else {
				R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
				R2_GLOBALS._v56A93--;
			}
		} else {
			++R2_GLOBALS._v56A93;
			if (R2_GLOBALS._v56A93 > 999)
				R2_GLOBALS._v56A93 = 999;
			R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
			R2_GLOBALS._v566A9 = 3;
		}
	}

	if (R2_GLOBALS._v566A8 == 0)
		scene->_sceneMode = 16;
	else
		scene->_sceneMode = 11;

	Common::Point pt(160, 115);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3800::Exit2::changeScene() {
	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_field412 = 2;

	if (R2_GLOBALS.getFlag(46)) {
		if (scene->_field412 == R2_GLOBALS._v566A9) {
			R2_GLOBALS._v566AA = 4;
			if (R2_GLOBALS._v56A93 + 1 == 0) {
				R2_GLOBALS._v566A8--;
				R2_GLOBALS._v566A9 = 0;
			} else {
				R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
				R2_GLOBALS._v56A93--;
			}
		} else {
			++R2_GLOBALS._v56A93;
			if (R2_GLOBALS._v56A93 > 999)
				R2_GLOBALS._v56A93 = 999;
			R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
			R2_GLOBALS._v566A9 = 4;
		}
	}

	if (R2_GLOBALS._v566A8 == 0)
		scene->_sceneMode = 16;
	else
		scene->_sceneMode = 12;

	Common::Point pt(330, 145);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3800::Exit3::changeScene() {
	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_field412 = 3;

	if (R2_GLOBALS.getFlag(46)) {
		if (scene->_field412 == R2_GLOBALS._v566A9) {
			R2_GLOBALS._v566AA = 1;
			if (R2_GLOBALS._v56A93 + 1 == 0) {
				R2_GLOBALS._v566A8--;
				R2_GLOBALS._v566A9 = 0;
			} else {
				R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
				R2_GLOBALS._v56A93--;
			}
		} else {
			++R2_GLOBALS._v56A93;
			if (R2_GLOBALS._v56A93 > 999)
				R2_GLOBALS._v56A93 = 999;
			R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
			R2_GLOBALS._v566A9 = 1;
		}
	}

	if (R2_GLOBALS._v566A8 == 0)
		scene->_sceneMode = 16;
	else
		scene->_sceneMode = 13;

	Common::Point pt(160, 220);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3800::Exit4::changeScene() {
	Scene3800 *scene = (Scene3800 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_field412 = 4;

	if (R2_GLOBALS.getFlag(46)) {
		if (scene->_field412 == R2_GLOBALS._v566A9) {
			R2_GLOBALS._v566AA = 2;
			if (R2_GLOBALS._v56A93 + 1 == 0) {
				R2_GLOBALS._v566A8--;
				R2_GLOBALS._v566A9 = 0;
			} else {
				R2_GLOBALS._v566A9 = R2_GLOBALS._v566AB[R2_GLOBALS._v56A93];
				R2_GLOBALS._v56A93--;
			}
		} else {
			++R2_GLOBALS._v56A93;
			if (R2_GLOBALS._v56A93 > 999)
				R2_GLOBALS._v56A93 = 999;
			R2_GLOBALS._v566AB[R2_GLOBALS._v56A93] = R2_GLOBALS._v566A9;
			R2_GLOBALS._v566A9 = 2;
		}
	}

	if (R2_GLOBALS._v566A8 == 0)
		scene->_sceneMode = 16;
	else
		scene->_sceneMode = 14;

	Common::Point pt(-10, 145);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3800::initScene3800() {
	_exit1._enabled = true;
	_exit2._enabled = true;
	_exit3._enabled = true;
	_exit4._enabled = true;
	_exit1._insideArea = false;
	_exit2._insideArea = false;
	_exit3._insideArea = false;
	_exit4._insideArea = false;
	_exit1._moving = false;
	_exit2._moving = false;
	_exit3._moving = false;
	_exit4._moving = false;

	loadScene(R2_GLOBALS._v566A6);

	R2_GLOBALS._uiElements.draw();
}

void Scene3800::sub110BBD() {
	R2_GLOBALS._player.disableControl();
	switch (_field412) {
	case 0:
		R2_GLOBALS._player.postInit();
		R2_GLOBALS._player.setVisage(10);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setPosition(Common::Point(160, 145));
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.changeZoom(-1);
		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
		_actor1.postInit();
		_actor1.fixPriority(10);
		_actor1.changeZoom(-1);
		_actor1.setVisage(1110);
		_actor1._effect = 5;
		_actor1._field9C = this->_field312;
		R2_GLOBALS._player._linkedActor = &_actor1;
		switch (R2_GLOBALS._sceneManager._previousScene) {
		case 2600:
			_object1.postInit();
			_object2.postInit();
			_actor1.hide();
			_sceneMode = 3800;
			setAction(&_sequenceManager1, this, 3800, &R2_GLOBALS._player, &_object1, &_object2, NULL);
			break;
		case 3900:
			_sceneMode = 15;
			switch (R2_GLOBALS._v566AA - 1) {
			case 0: {
				R2_GLOBALS._player.setPosition(Common::Point(160, 220));
				Common::Point pt(160, 160);
				NpcMover *mover = new NpcMover();
				R2_GLOBALS._player.addMover(mover, &pt, this);
				}
				break;
			case 1: {
				R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
				Common::Point pt(19, 145);
				NpcMover *mover = new NpcMover();
				R2_GLOBALS._player.addMover(mover, &pt, this);
				}
				break;
			case 2: {
				R2_GLOBALS._player.setPosition(Common::Point(160, 115));
				Common::Point pt(160, 120);
				NpcMover *mover = new NpcMover();
				R2_GLOBALS._player.addMover(mover, &pt, this);
				}
				break;
			case 3: {
				R2_GLOBALS._player.setPosition(Common::Point(330, 145));
				Common::Point pt(300, 145);
				NpcMover *mover = new NpcMover();
				R2_GLOBALS._player.addMover(mover, &pt, this);
				}
				break;
			default:
				break;
			}
		default:
			R2_GLOBALS._player.enableControl(CURSOR_ARROW);
			break;
		}
		break;
	case 1: {
		_sceneMode = 15;
		R2_GLOBALS._player.setPosition(Common::Point(160, 220));
		Common::Point pt(160, 160);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 2: {
		_sceneMode = 15;
		R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
		Common::Point pt(19, 145);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 3: {
		_sceneMode = 15;
		R2_GLOBALS._player.setPosition(Common::Point(160, 115));
		Common::Point pt(160, 120);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 4: {
		_sceneMode = 15;
		R2_GLOBALS._player.setPosition(Common::Point(330, 145));
		Common::Point pt(300, 145);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	default:
		break;
	}
}

void Scene3800::postInit(SceneObjectList *OwnerList) {
	_field412 = 0;

	initScene3800();

	SceneExt::postInit();
	R2_GLOBALS._sound1.play(231);

	scalePalette(65, 65, 65);

	setZoomPercents(87, 40, 144, 100);

	_exit1.setDetails(Rect(14, 87, 305, 125), SHADECURSOR_UP, 3800);
	_exit1.setDest(Common::Point(160, 126));
	_exit2.setDetails(Rect(305, 87, 320, 128), EXITCURSOR_E, 3800);
	_exit2.setDest(Common::Point(312, 145));
	_exit3.setDetails(Rect(14, 160, 305, 168), SHADECURSOR_DOWN, 3800);
	_exit3.setDest(Common::Point(160, 165));
	_exit4.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3800);
	_exit4.setDest(Common::Point(7, 145));

	_rect1.set(0, 0, 320, 87);
	_item1.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *) NULL);

	sub110BBD();
}

void Scene3800::signal() {
	switch (_sceneMode) {
	case 11:
		R2_GLOBALS._v566A6 += 15;
		if (R2_GLOBALS._v566A6 > 3815)
			R2_GLOBALS._v566A6 -= 20;
		initScene3800();
		sub110BBD();
		break;
	case 12:
		R2_GLOBALS._v566A6 += 5;
		if (R2_GLOBALS._v566A6 > 3815)
			R2_GLOBALS._v566A6 = 3800;
		initScene3800();
		sub110BBD();
		break;
	case 13:
		R2_GLOBALS._v566A6 -= 15;
		if (R2_GLOBALS._v566A6 < 3800)
			R2_GLOBALS._v566A6 += 20;
		initScene3800();
		sub110BBD();
		break;
	case 14:
		R2_GLOBALS._v566A6 -= 5;
		if (R2_GLOBALS._v566A6 < 3800)
			R2_GLOBALS._v566A6 = 3815;
		initScene3800();
		sub110BBD();
		break;
	case 15:
		R2_GLOBALS._v56AAB = 0;
		R2_GLOBALS._player.disableControl(CURSOR_ARROW);
		break;
	case 16:
		g_globals->_sceneManager.changeScene(3900);
		break;
	case 3800:
		_actor1.show();
		_object1.remove();
		_object2.remove();
		R2_GLOBALS._v56AAB = 0;
		R2_GLOBALS._player.disableControl(CURSOR_ARROW);
		break;
	case 3805:
		_exit1._enabled = false;
		_exit2._enabled = false;
		_exit3._enabled = false;
		_exit4._enabled = false;
		R2_GLOBALS._player._canWalk = false;
		R2_GLOBALS._events.setCursor(CURSOR_USE);
		break;
	case 3806:
		_exit1._enabled = true;
		_exit2._enabled = true;
		_exit3._enabled = true;
		_exit4._enabled = true;
		R2_GLOBALS._player.disableControl(CURSOR_ARROW);
		break;
	default:
		break;
	}
}

void Scene3800::process(Event &event) {
	if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == 1) && (_rect1.contains(event.mousePos))) {
		event.handled = true;
		switch (R2_GLOBALS._events.getCursor()) {
		case R2_NEGATOR_GUN:
			R2_GLOBALS._player.addMover(NULL);
			R2_GLOBALS._player.updateAngle(event.mousePos);
			break;
		case R2_STEPPING_DISKS:
			SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
			break;
		case R2_ATTRACTOR_UNIT:
			SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
			break;
		default:
			event.handled = false;
			break;
		}
	}

	Scene::process(event);
}

/*--------------------------------------------------------------------------
 * Scene 3900 -
 *
 *--------------------------------------------------------------------------*/
void Scene3900::Exit1::changeScene() {
	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	R2_GLOBALS._v566A9 = 3;
	R2_GLOBALS._v566AA = 1;
	R2_GLOBALS._v566A8 = 1;
	scene->_sceneMode = 14;

	Common::Point pt(160, 115);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3900::Exit2::changeScene() {
	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	R2_GLOBALS._v566A9 = 4;
	R2_GLOBALS._v566AA = 2;
	R2_GLOBALS._v566A8 = 1;
	scene->_sceneMode = 14;

	Common::Point pt(330, 145);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3900::Exit3::changeScene() {
	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	R2_GLOBALS._v566A9 = 1;
	R2_GLOBALS._v566AA = 3;
	R2_GLOBALS._v566A8 = 1;
	scene->_sceneMode = 14;

	Common::Point pt(160, 220);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3900::Exit4::changeScene() {
	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	R2_GLOBALS._v566A9 = 2;
	R2_GLOBALS._v566AA = 4;
	R2_GLOBALS._v566A8 = 1;
	scene->_sceneMode = 14;

	Common::Point pt(-10, 145);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);
}

void Scene3900::Exit5::changeScene() {
	Scene3900 *scene = (Scene3900 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_ARROW);
	scene->_sceneMode = 13;

	if (R2_GLOBALS._v566A9 == 4) {
		Common::Point pt(-10, 135);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, scene);
	} else {
		Common::Point pt(330, 135);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, scene);
	}

	R2_GLOBALS._v566A9 = 0;
}

void Scene3900::postInit(SceneObjectList *OwnerList) {
	if ((R2_GLOBALS._v566AA == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700))
		loadScene(3825);
	else
		loadScene(3820);
	SceneExt::postInit();
	R2_GLOBALS._sound1.changeSound(231);
	setZoomPercents(87, 40, 144, 100);
	R2_GLOBALS._player.disableControl();
	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.setStrip(3);
	R2_GLOBALS._player.changeZoom(-1);
	R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
	_actor1.postInit();
	_actor1.fixPriority(10);
	_actor1.changeZoom(-1);
	_actor1.setVisage(1110);
	_actor1._effect = 5;
	_actor1._field9C = _field312;
	R2_GLOBALS._player._linkedActor = &_actor1;
	if ((R2_GLOBALS._v566AA == 2) && (R2_GLOBALS._sceneManager._previousScene != 2700)) {
//		loadScene(3825);
		R2_GLOBALS._v566AA = 4;
		_exit1.setDetails(Rect(29, 87, 305, 125), SHADECURSOR_UP, 3900);
		_exit3.setDetails(Rect(29, 160, 305, 168), SHADECURSOR_DOWN, 3900);

		_exit2.setDetails(Rect(305, 87, 320, 168), EXITCURSOR_E, 3900);
		_exit2.setDest(Common::Point(312, 145));
		_exit2._enabled = true;
		_exit2._insideArea = false;
		_exit2._moving = false;

		_exit4._enabled = false;

		_exit5.setDetails(Rect(0, 87, 29, 168), EXITCURSOR_W, 3900);
		_exit5.setDest(Common::Point(24, 135));
	} else {
//		loadScene(3820);
		R2_GLOBALS._v566AA = 2;
		_exit1.setDetails(Rect(14, 87, 290, 125), SHADECURSOR_UP, 3900);
		_exit3.setDetails(Rect(14, 160, 290, 168), SHADECURSOR_DOWN, 3900);


		_exit2._enabled = false;

		_exit4.setDetails(Rect(0, 87, 14, 168), EXITCURSOR_W, 3900);
		_exit4.setDest(Common::Point(7, 145));
		_exit4._enabled = true;
		_exit4._insideArea = false;
		_exit4._moving = false;

		_exit5.setDetails(Rect(290, 87, 320, 168), EXITCURSOR_E, 3900);
		_exit5.setDest(Common::Point(295, 135));
	}
	_exit5._enabled = true;
	_exit5._insideArea = false;
	_exit5._moving = false;

	scalePalette(65, 65, 65);

	_exit1.setDest(Common::Point(160, 126));
	_exit1._enabled = true;
	_exit1._insideArea = false;
	_exit1._moving = false;

	_exit3.setDest(Common::Point(160, 165));
	_exit3._enabled = true;
	_exit3._insideArea = false;
	_exit3._moving = false;

	R2_GLOBALS._uiElements.draw();

	_rect1.set(0, 0, 320, 87);
	_item1.setDetails(Rect(0, 0, 320, 200), 3800, 0, 1, 2, 1, (SceneItem *)NULL);
	if (R2_GLOBALS._sceneManager._previousScene == 3800) {
		_sceneMode = 11;
		switch (R2_GLOBALS._v566AA - 1) {
		case 0: {
			R2_GLOBALS._player.setPosition(Common::Point(160, 115));
			Common::Point pt(160, 120);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
			}
			break;
		case 1: {
			R2_GLOBALS._player.setPosition(Common::Point(330, 145));
			Common::Point pt(300, 145);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
			}
			break;
		case 2: {
			R2_GLOBALS._player.setPosition(Common::Point(160, 220));
			Common::Point pt(160, 160);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
			}
			break;
		case 3: {
			R2_GLOBALS._player.setPosition(Common::Point(-10, 145));
			Common::Point pt(19, 145);
			NpcMover *mover = new NpcMover();
			R2_GLOBALS._player.addMover(mover, &pt, this);
			}
			break;
		default:
			break;
		}
	} else if (R2_GLOBALS._sceneManager._previousScene == 2700) {
		_sceneMode = 12;
		R2_GLOBALS._player.setPosition(Common::Point(330, 135));
		Common::Point pt(265, 135);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
	} else {
		R2_GLOBALS._player.setPosition(Common::Point(160, 145));
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
	}
}

void Scene3900::signal() {
	switch (_sceneMode) {
	case 11:
	// No break on purpose
	case 12:
		R2_GLOBALS._v56AAB = 0;
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	case 13:
		R2_GLOBALS._sceneManager.changeScene(2700);
		break;
	case 14:
		R2_GLOBALS._sceneManager.changeScene(3800);
		break;
	case 3805:
		_exit1._enabled = false;
		_exit2._enabled = false;
		_exit3._enabled = false;
		_exit4._enabled = false;
		R2_GLOBALS._player._canWalk = false;
		R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS);
		break;
	case 3806:
		_exit1._enabled = true;
		_exit2._enabled = true;
		_exit3._enabled = true;
		_exit4._enabled = true;
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	default:
		break;
	}
}

void Scene3900::process(Event &event) {
	if ((R2_GLOBALS._player._uiEnabled) && (event.eventType == 1) && (_rect1.contains(event.mousePos))) {
		event.handled = true;
		switch (R2_GLOBALS._events.getCursor()) {
		case R2_NEGATOR_GUN:
			R2_GLOBALS._player.addMover(NULL);
			R2_GLOBALS._player.updateAngle(event.mousePos);
			break;
		case R2_STEPPING_DISKS:
			SceneItem::display(3800, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
			break;
		case R2_ATTRACTOR_UNIT:
			SceneItem::display(3800, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
			break;
		default:
			event.handled = false;
			break;
		}
	}
	Scene::process(event);
}

} // End of namespace Ringworld2
} // End of namespace TsAGE