/* 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_dialogs.h"
#include "tsage/ringworld2/ringworld2_scenes0.h"
#include "tsage/ringworld2/ringworld2_speakers.h"

namespace TsAGE {

namespace Ringworld2 {

/*--------------------------------------------------------------------------
 * Scene 50 - Waking up cutscene
 *
 *--------------------------------------------------------------------------*/

void Scene50::Action1::signal() {
	switch (_actionIndex++) {
	case 0:
		setDelay(2);
		break;
	case 1:
		setDelay(180);
		break;
	case 2:
		R2_GLOBALS._sceneManager.changeScene(100);
		break;
	default:
		break;
	}
}

void Scene50::postInit(SceneObjectList *OwnerList) {
	loadScene(110);
	SceneExt::postInit(OwnerList);

	R2_GLOBALS._uiElements._active = false;
	R2_GLOBALS._scenePalette.loadPalette(0);

	R2_GLOBALS._sound2.play(10);
	R2_GLOBALS._player.disableControl();

	setAction(&_action1);
}

void Scene50::process(Event &event) {
	if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType != EVENT_KEYPRESS) && (event.eventType == EVENT_UNK27)) {
		event.handled = true;
		g_globals->_events.setCursor(CURSOR_ARROW);
		HelpDialog::show();
		R2_GLOBALS._sceneManager.changeScene(100);
	}
}

/*--------------------------------------------------------------------------
 * Scene 100 - Quinn's Room
 *
 *--------------------------------------------------------------------------*/

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

	switch (action) {
	case CURSOR_USE:
		if (_state) {
			SceneItem::display2(100, 6);
		} else {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 101;
			scene->setAction(&scene->_sequenceManager1, scene, 101, &R2_GLOBALS._player, this, NULL);
		}
		return true;
	case CURSOR_TALK:
		if (_state) {
			SceneItem::display2(100, 26);
			_state = 0;
			scene->_doorDisplay.setFrame(1);
		} else {
			SceneItem::display2(100, 27);
			_state = 1;
			scene->_doorDisplay.setFrame(2);
		}
		return true;
	default:
		return SceneActor::startAction(action, event);
	}
}

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

	switch (action) {
	case CURSOR_USE:
		R2_GLOBALS._player.disableControl();
		if (_strip == 2) {
			scene->_sceneMode = 108;
			scene->_tableLocker.postInit();
			scene->_stasisNegator.postInit();

			if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
				scene->_stasisNegator.setup(100, 7, 2);
			} else {
				scene->_stasisNegator.setup(100, 7, 1);
				scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
			}

			// Open table locker
			scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_tableLocker,
				&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
		} else {
			scene->_sceneMode = 109;
			// Close table locker
			scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_tableLocker,
				&scene->_stasisNegator, &R2_GLOBALS._player, NULL);
		}
		return true;
	case CURSOR_TALK:
		R2_GLOBALS._player.disableControl();

		if (_strip == 2) {
			SceneItem::display2(100, 18);
			scene->_sceneMode = 102;
			scene->_tableLocker.postInit();
			scene->_stasisNegator.postInit();

			if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) {
				scene->_stasisNegator.setup(100, 7, 2);
			} else {
				scene->_stasisNegator.setup(100, 7, 1);
				scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, (SceneItem *)NULL);
			}

			scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_tableLocker,
				&scene->_stasisNegator, NULL);
		} else {
			SceneItem::display2(100, 19);
			scene->_sceneMode = 103;
			scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_tableLocker,
				&scene->_stasisNegator, NULL);
		}
		return true;
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene100::StasisNegator::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 107;
		scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_stasisNegator, NULL);
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene100::DoorDisplay::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_LOOK:
		SceneItem::display2(100, _state ? 24 : 25);
		return true;
	case CURSOR_TALK:
		SceneItem::display2(100, _state ? 26 : 27);
		return true;
	case CURSOR_USE: {
		Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 110;
		scene->setAction(&scene->_sequenceManager1, scene, 110, &R2_GLOBALS._player, NULL);
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 111;
		scene->setAction(&scene->_sequenceManager1, scene, 111, &R2_GLOBALS._player, this, NULL);
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

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

bool Scene100::Terminal::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 105;
		scene->setAction(&scene->_sequenceManager1, scene, 105, &R2_GLOBALS._player, this, NULL);
		return true;
		}
	default:
		return NamedHotspot::startAction(action, event);
	}
}

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

void Scene100::postInit(SceneObjectList *OwnerList) {
	loadScene(100);
	SceneExt::postInit();

	if (R2_GLOBALS._sceneManager._previousScene != 125)
		R2_GLOBALS._sound1.play(10);

	_door.postInit();
	_door._state = 0;
	_door.setVisage(100);
	_door.setPosition(Common::Point(160, 84));
	_door.setDetails(100, 3, 4, 5, 1, (SceneItem *)NULL);

	_doorDisplay.postInit();
	_doorDisplay.setup(100, 2, 1);
	_doorDisplay.setPosition(Common::Point(202, 53));
	_doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);

	_table.postInit();
	_table.setup(100, 2, 3);
	_table.setPosition(Common::Point(175, 157));
	_table.setDetails(100, 17, 18, 20, 1, (SceneItem *)NULL);

	_bedLights1.postInit();
	_bedLights1.setup(100, 3, 1);
	_bedLights1.setPosition(Common::Point(89, 79));
	_bedLights1.fixPriority(250);
	_bedLights1.animate(ANIM_MODE_2, NULL);
	_bedLights1._numFrames = 3;

	_bedLights2.postInit();
	_bedLights2.setup(100, 3, 1);
	_bedLights2.setPosition(Common::Point(89, 147));
	_bedLights2.fixPriority(250);
	_bedLights2.animate(ANIM_MODE_7, 0, NULL);
	_bedLights2._numFrames = 3;

	_wardrobe.postInit();
	_wardrobe.setVisage(101);
	_wardrobe.setPosition(Common::Point(231, 126));
	_wardrobe.fixPriority(10);
	_wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) {
		_steppingDisks.postInit();
		_steppingDisks.setup(100, 8, 1);
		_steppingDisks.setPosition(Common::Point(274, 130));
		_steppingDisks.setDetails(100, 40, -1, 42, 1, (SceneItem *)NULL);
	}

	_terminal.setDetails(11, 100, 14, 15, 16);
	_desk.setDetails(12, 100, 11, -1, 13);
	_bed.setDetails(13, 100, 8, 9, 10);
	_duct.setDetails(14, 100, 34, -1, 36);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL);

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 50:
	case 180:
		_wardrobeColorAnim.postInit();
		_wardrobeTopAnim.postInit();
		_sceneMode = 104;
		setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_wardrobe, &_wardrobeTopAnim, &_wardrobeColorAnim, NULL);
		break;
	case 125:
		_sceneMode = 100;
		setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
		break;
	case 200:
		_sceneMode = 100;
		setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(180, 100));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene100::remove() {
	R2_GLOBALS._sound1.play(10);
	SceneExt::remove();
}

void Scene100::signal() {
	switch (_sceneMode) {
	case 101:
		R2_GLOBALS._sceneManager.changeScene(200);
		break;
	case 103:
	case 109:
		_table.setStrip(2);
		_table.setFrame(3);

		_tableLocker.remove();
		_stasisNegator.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 104:
		_sceneMode = 0;
		_wardrobeColorAnim.remove();
		_wardrobeTopAnim.remove();

		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player._numFrames = 10;
		R2_GLOBALS._player.fixPriority(-1);
		R2_GLOBALS._player.enableControl();
		break;
	case 105:
		R2_GLOBALS._sceneManager.changeScene(125);
		break;
	case 107:
		R2_GLOBALS._sceneItems.remove(&_stasisNegator);

		_stasisNegator.setFrame(2);
		R2_INVENTORY.setObjectScene(R2_NEGATOR_GUN, 1);
		R2_GLOBALS._player.enableControl();
		break;
	case 110:
		if (_door._state) {
			_door._state = 0;
			_doorDisplay.setFrame(1);
		} else {
			_door._state = 1;
			_doorDisplay.setFrame(2);
		}
		R2_GLOBALS._player.enableControl();
		break;
	case 111:
		R2_INVENTORY.setObjectScene(R2_STEPPING_DISKS, 1);
		_steppingDisks.remove();
		R2_GLOBALS._player.enableControl();
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene100::dispatch() {
	int regionIndex = R2_GLOBALS._player.getRegionIndex();
	if (regionIndex == 13)
		R2_GLOBALS._player._shade = 4;

	if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101))
	R2_GLOBALS._player._shade = 0;

	SceneExt::dispatch();

	if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) {
		_table.setAction(&_sequenceManager2, NULL, 103, &_table, &_tableLocker, &_stasisNegator, NULL);
	}
}

/*--------------------------------------------------------------------------
 * Scene 125 - Computer Terminal
 *
 *--------------------------------------------------------------------------*/

bool Scene125::Food::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE)
		return true;

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

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

Scene125::Icon::Icon(): SceneActor()  {
	_lookLineNum = 0;
	_iconId = 0;
	_pressed = false;
}

void Scene125::Icon::postInit(SceneObjectList *OwnerList) {
	SceneObject::postInit();

	_glyph.postInit();
	_glyph.fixPriority(255);
	_glyph.hide();

	_sceneText1._color1 = 92;
	_sceneText1._color2 = 0;
	_sceneText1._width = 200;
	_sceneText2._color1 = 0;
	_sceneText2._color2 = 0;
	_sceneText2._width = 200;
	setDetails(125, -1, -1, -1, 2, (SceneItem *)NULL);
}

void Scene125::Icon::synchronize(Serializer &s) {
	SceneActor::synchronize(s);
	s.syncAsSint16LE(_lookLineNum);
	s.syncAsSint16LE(_iconId);
	s.syncAsSint16LE(_pressed);
}

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

	if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {

		if (event.eventType == EVENT_BUTTON_DOWN) {
			int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);

			switch (R2_GLOBALS._events.getCursor()) {
			case CURSOR_LOOK:
				if (regionIndex == _sceneRegionId) {
					event.handled = true;
					if (_lookLineNum == 26) {
						SceneItem::display2(130, 7);
					} else {
						SceneItem::display2(130, _lookLineNum);
					}
				}
				break;

			case CURSOR_USE:
				if ((regionIndex == _sceneRegionId) && !_pressed) {
					scene->_sound1.play(14);
					setFrame(2);

					switch (_glyph._strip) {
					case 1:
						_glyph.setStrip(2);
						break;
					case 3:
						_glyph.setStrip(4);
						break;
					case 5:
						_glyph.setStrip(6);
						break;
					default:
						break;
					}

					_pressed = true;
					event.handled = true;
				}
				break;

			default:
				break;
			}
		}

		if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
			setFrame(1);

			switch (_glyph._strip) {
			case 2:
				_glyph.setStrip(1);
				break;
			case 4:
				_glyph.setStrip(3);
				break;
			case 6:
				_glyph.setStrip(5);
				break;
			default:
				break;
			}

			_pressed = false;
			event.handled = true;
			scene->consoleAction(_lookLineNum);
		}
	}
}

void Scene125::Icon::setIcon(int id) {
	_lookLineNum = _iconId = id;
	SceneActor::_lookLineNum = id;

	_sceneText1.remove();
	_sceneText2.remove();

	if (_lookLineNum) {
		Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;

		showIcon();
		_glyph.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
		_glyph.setPosition(_position);

		_sceneText1._fontNumber = scene->_iconFontNumber;
		_sceneText1.setup(CONSOLE125_MESSAGES[id]);
		_sceneText1.fixPriority(20);

		_sceneText2._fontNumber = scene->_iconFontNumber;
		_sceneText2.setup(CONSOLE125_MESSAGES[id]);
		_sceneText2.fixPriority(20);

		_sceneText2._fontNumber = scene->_iconFontNumber;
		_sceneText2.setup(CONSOLE125_MESSAGES[id]);
		_sceneText2.fixPriority(10);

		switch (_lookLineNum) {
		case 5:
			_sceneText1.setPosition(Common::Point(62, _position.y + 8));
			_sceneText2.setPosition(Common::Point(64, _position.y + 10));
			break;
		case 6:
		case 7:
		case 24:
		case 25:
			_sceneText1.setPosition(Common::Point(65, _position.y + 8));
			_sceneText2.setPosition(Common::Point(67, _position.y + 10));
			break;
		case 26:
			_sceneText1.setPosition(Common::Point(83, _position.y + 8));
			_sceneText2.setPosition(Common::Point(85, _position.y + 10));
			break;
		default:
			_sceneText1.setPosition(Common::Point(121, _position.y + 8));
			_sceneText2.setPosition(Common::Point(123, _position.y + 10));
			break;
		}
	} else {
		hideIcon();
	}
}

void Scene125::Icon::showIcon() {
	_sceneText1.show();
	_sceneText2.show();
	_glyph.show();
	_horizLine.show();
	show();
}

void Scene125::Icon::hideIcon() {
	_sceneText1.hide();
	_sceneText2.hide();
	_glyph.hide();
	_horizLine.hide();
	hide();
}

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

bool Scene125::DiskSlot::startAction(CursorType action, Event &event) {
	Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene;
	switch (action) {
	case CURSOR_USE:
		if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 126;
			scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_infoDisk, NULL);
			return true;
		}
		break;
	case R2_OPTO_DISK:
		if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) {
			R2_GLOBALS._player.disableControl();
			scene->_infoDisk.postInit();
			scene->_sceneMode = 125;
			scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_infoDisk, NULL);
			return true;
		}
		break;
	default:
		break;
	}

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

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

Scene125::Scene125(): SceneExt() {
	_iconFontNumber = 50;
	_consoleMode = 5;
	_logIndex = _databaseIndex = _infodiskIndex = 0;

	_soundCount = _soundIndex = 0;
	for (int i = 0; i < 10; ++i)
		_soundIndexes[i] = 0;
}

void Scene125::postInit(SceneObjectList *OwnerList) {
	loadScene(160);
	SceneExt::postInit();
	_palette.loadPalette(0);

	if ((R2_GLOBALS._sceneManager._previousScene != 125) && (R2_GLOBALS._sceneManager._previousScene != 1337) && (R2_GLOBALS._sceneManager._previousScene != 1330))
		// Save the prior scene to return to when the console is turned off
		R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = R2_GLOBALS._sceneManager._previousScene;

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

	if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
		_infoDisk.postInit();
		_infoDisk.setup(160, 3, 5);
		_infoDisk.setPosition(Common::Point(47, 167));
	}

	_foodDispenser.postInit();
	_foodDispenser.setup(162, 1, 1);
	_foodDispenser.setPosition(Common::Point(214, 168));

	_diskSlot.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL);
	_item3.setDetails(Rect(144, 119, 286, 167), 126, 6, 7, 8, 1, NULL);
	_item2.setDetails(1, 126, 3, 4, 5);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 126, 0, 1, -1, 1, NULL);

	_sceneMode = 1;
	signal();
}

void Scene125::signal() {
	switch (_sceneMode) {
	case 1:
		_icon1.postInit();
		_icon1._sceneRegionId = 2;
		_icon2.postInit();
		_icon2._sceneRegionId = 3;
		_icon3.postInit();
		_icon3._sceneRegionId = 4;
		_icon4.postInit();
		_icon4._sceneRegionId = 5;

		setAction(&_sequenceManager, this, 127, &_icon1, &_icon2, &_icon3, &_icon4, &R2_GLOBALS._player, NULL);
		_sceneMode = 2;
		break;
	case 2:
		_icon1.setup(160, 1, 1);
		_icon1.setPosition(Common::Point(65, 17));
		_icon1._horizLine.postInit();
		_icon1._horizLine.setup(160, 7, 1);
		_icon1._horizLine.setPosition(Common::Point(106, 41));

		_icon2.setup(160, 1, 1);
		_icon2.setPosition(Common::Point(80, 32));
		_icon2._horizLine.postInit();
		_icon2._horizLine.setup(160, 7, 2);
		_icon2._horizLine.setPosition(Common::Point(106, 56));

		_icon3.setup(160, 1, 1);
		_icon3.setPosition(Common::Point(65, 47));
		_icon3._horizLine.postInit();
		_icon3._horizLine.setup(160, 7, 1);
		_icon3._horizLine.setPosition(Common::Point(106, 71));

		_icon4.setup(160, 1, 1);
		_icon4.setPosition(Common::Point(80, 62));
		_icon4._sceneRegionId = 5;
		_icon4._horizLine.postInit();
		_icon4._horizLine.setup(160, 7, 2);
		_icon4._horizLine.setPosition(Common::Point(106, 86));

		_icon5.postInit();
		_icon5.setup(160, 1, 1);
		_icon5.setPosition(Common::Point(37, 92));
		_icon5.setIcon(6);
		_icon5._sceneRegionId = 7;

		_icon6.postInit();
		_icon6.setup(160, 1, 1);
		_icon6.setPosition(Common::Point(106, 110));
		_icon6.setIcon(5);
		_icon6._sceneRegionId = 8;

		consoleAction(5);
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		R2_GLOBALS._player._canWalk = false;
		break;
	case 10:
		switch (_consoleMode) {
		case 12:
			_sceneMode = 129;

			_starchart1.postInit();
			_starchart2.postInit();
			_starchart3.postInit();

			if (R2_GLOBALS.getFlag(13)) {
				// Show starchart with Ringworld present
				_starchart4.postInit();
				setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_starchart1, &_starchart2,
					&_starchart3, &_starchart4, NULL);
			} else {
				// Show starchart without Ringworld
				setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_starchart1, &_starchart2,
					&_starchart3, NULL);
			}
			break;
		case 13:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_infodiskIndex = 0;
			setDetails(129, 0);
			break;
		case 23:
			R2_GLOBALS._sceneManager.changeScene(1330);
			break;
		case 27:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databaseIndex = 0;
			setDetails(128, 0);
			break;
		case 28:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databaseIndex = 37;
			setDetails(128, 37);
			break;
		case 29:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databaseIndex = 68;
			setDetails(128, 68);
			break;
		case 30:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databaseIndex = 105;
			setDetails(128, 105);
			break;
		default:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_logIndex = 0;
			setDetails(127, 0);
			break;
		}
		break;
	case 11:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;

		if ((_consoleMode >= 27) && (_consoleMode <= 30)) {
			consoleAction(11);
		}
		consoleAction(2);
		_icon6.setIcon(5);
		break;
	case 12:
		if (_soundCount > 0)
			--_soundCount;
		if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
			_soundIndex = 0;
			R2_GLOBALS._playStream.stop();
		} else {
			_sceneMode = 12;
			R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
		}
		break;
	case 125:
		R2_INVENTORY.setObjectScene(R2_OPTO_DISK, R2_GLOBALS._player._oldCharacterScene[R2_QUINN]);
		R2_GLOBALS._player.enableControl();
		break;
	case 126:
		R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
		_infoDisk.remove();
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	case 128:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		SceneItem::display2(126, 12);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	}
}

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

	s.syncAsSint16LE(_consoleMode);
	s.syncAsSint16LE(_iconFontNumber);
	s.syncAsSint16LE(_logIndex);
	s.syncAsSint16LE(_databaseIndex);
	s.syncAsSint16LE(_infodiskIndex);
	s.syncAsSint16LE(_soundCount);
	s.syncAsSint16LE(_soundIndex);

	for (int i = 0; i < 10; ++i)
		s.syncAsSint16LE(_soundIndexes[i]);
}

void Scene125::process(Event &event) {
	SceneExt::process(event);

	if (R2_GLOBALS._player._uiEnabled) {
		_icon1.process(event);
		_icon2.process(event);
		_icon3.process(event);
		_icon4.process(event);
		_icon5.process(event);
		_icon6.process(event);
	}
}

void Scene125::dispatch() {
	if (_soundCount)
		R2_GLOBALS._playStream.dispatch();

	Scene::dispatch();
}

/**
 * Handles actions on the console screen.
 */
void Scene125::consoleAction(int id) {
	_icon3.setIcon(0);
	_icon4.setIcon(0);

	if (id == 5)
		_icon5.setIcon(6);
	else {
		switch (_consoleMode) {
		case 10:
		case 12:
		case 13:
		case 27:
		case 28:
		case 29:
		case 30:
			break;
		default:
			_icon5.setIcon(7);
			break;
		}
	}

	switch (id) {
	case 1:
		_icon1.setIcon(8);
		_icon2.setIcon(9);
		break;
	case 2:
		_icon1.setIcon(10);
		_icon2.setIcon(11);
		_icon3.setIcon(12);
		_icon4.setIcon(13);
		break;
	case 3:
		_icon1.setIcon(15);
		_icon2.setIcon(16);
		_icon3.setIcon(17);
		break;
	case 4:
		_icon1.setIcon(22);
		_icon2.setIcon(23);
		break;
	case 6:
		R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._oldCharacterScene[R2_QUINN]);
		break;
	case 7:
		if (_consoleMode == 11)
			consoleAction(2);
		else if (_consoleMode == 22)
			consoleAction(4);
		else
			consoleAction(5);
		break;
	case 8:
		_iconFontNumber = 50;
		stop();
		_icon6.setIcon(5);
		consoleAction(1);
		break;
	case 9:
		_iconFontNumber = 52;
		stop();
		_icon6.setIcon(5);
		consoleAction(1);
		break;
	case 10:
		R2_GLOBALS._player.disableControl();
		consoleAction(2);
		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();
		_icon5.setIcon(24);

		_icon4.setPosition(Common::Point(52, 107));
		_icon4._sceneRegionId = 9;
		_icon4.setIcon(25);
		_icon4._horizLine.hide();

		_icon6.setIcon(26);
		_sceneMode = 10;

		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		break;
	case 11:
		_icon1.setIcon(27);
		_icon2.setIcon(28);
		_icon3.setIcon(29);
		_icon4.setIcon(30);
		break;
	case 12:
		R2_GLOBALS._player.disableControl();
		consoleAction(2);
		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();
		_icon4.hideIcon();
		_icon5.hideIcon();

		_icon6.setIcon(26);
		_sceneMode = 10;
		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		break;
	case 13:
		consoleAction(2);
		if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != R2_GLOBALS._player._oldCharacterScene[R2_QUINN]) {
			SceneItem::display2(126, 17);
		} else {
			R2_GLOBALS._player.disableControl();

			_icon1.hideIcon();
			_icon2.hideIcon();
			_icon3.hideIcon();
			_icon5.setIcon(24);

			_icon4.setPosition(Common::Point(52, 107));
			_icon4._sceneRegionId = 9;
			_icon4.setIcon(25);
			_icon4._horizLine.hide();

			_icon6.setIcon(26);
			_sceneMode = 10;

			_palette.loadPalette(161);
			R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		}
		break;
	case 15:
		consoleAction(3);

		if (R2_GLOBALS._foodCount < 3) {
			R2_GLOBALS._player.disableControl();
			_food.postInit();
			_food.setup(162, 2, 2);
			_food.setPosition(Common::Point(216, UI_INTERFACE_Y));

			R2_GLOBALS._foodCount += 2;

			_sceneMode = 128;
			this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
		} else if (R2_GLOBALS._foodCount == 3) {
			SceneItem::display2(126, 13);
		} else {
			SceneItem::display2(126, 14);
		}
		break;
	case 16:
		consoleAction(3);

		if (R2_GLOBALS._foodCount < 4) {
			R2_GLOBALS._player.disableControl();
			_food.postInit();
			_food.setup(162, 2, 3);
			_food.setPosition(Common::Point(218, UI_INTERFACE_Y));

			++R2_GLOBALS._foodCount;

			_sceneMode = 128;
			this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
		} else {
			SceneItem::display2(126, 15);
		}
		break;
	case 17:
		consoleAction(3);

		if (R2_GLOBALS._foodCount < 4) {
			R2_GLOBALS._player.disableControl();
			_food.postInit();
			_food.setup(162, 2, 1);
			_food.setPosition(Common::Point(215, UI_INTERFACE_Y));

			++R2_GLOBALS._foodCount;

			_sceneMode = 128;
			this->setAction(&_sequenceManager, this, 128, &_foodDispenser, &_food, NULL);
		} else {
			SceneItem::display2(126, 16);
		}
		break;
	case 22:
		_icon1.setIcon(31);
		_icon2.setIcon(32);
		_icon3.setIcon(33);
		_icon4.setIcon(34);
		break;
	case 23:
		R2_GLOBALS._player.disableControl();
		consoleAction(4);
		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();
		_icon4.hideIcon();
		_icon5.hideIcon();
		_icon6.hideIcon();

		_sceneMode = 10;
		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		break;
	case 24:
		_icon4.setIcon(25);
		_icon4._horizLine.hide();

		if (_consoleMode == 10) {
			setDetails(127, --_logIndex);
		} else if (_consoleMode == 13) {
			setDetails(129, --_infodiskIndex);
		} else {
			setDetails(128, --_databaseIndex);
		}
		break;
	case 25:
		_icon4.setIcon(25);
		_icon4._horizLine.hide();

		if (_consoleMode == 10) {
			setDetails(127, ++_logIndex);
		} else if (_consoleMode == 13) {
			setDetails(129, ++_infodiskIndex);
		} else {
			setDetails(128, ++_databaseIndex);
		}
		break;
	case 26:
		R2_GLOBALS._player.disableControl();
		stop();
		_icon4.setPosition(Common::Point(80, 62));
		_icon4._sceneRegionId = 5;
		_icon4.hideIcon();

		R2_GLOBALS._player.hide();
		_starchart1.hide();
		_starchart2.hide();
		_starchart3.hide();
		_starchart4.hide();

		_sceneMode = 11;
		_palette.loadPalette(160);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		break;
	case 27:
	case 28:
	case 29:
	case 30:
		R2_GLOBALS._player.disableControl();
		consoleAction(11);
		_consoleMode = id;

		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();
		_icon4.hideIcon();
		_icon5.setIcon(24);

		_icon4.setPosition(Common::Point(52, 107));
		_icon4._sceneRegionId = 9;
		_icon4.setIcon(25);
		_icon4._horizLine.hide();

		_icon6.setIcon(26);
		_sceneMode = 10;

		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
		break;
	case 31:
		consoleAction(22);
		R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 63 : 10);
		break;
	case 32:
		consoleAction(22);
		R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 64 : 10);
		break;
	case 33:
		consoleAction(22);
		R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 65 : 10);
		break;
	case 34:
		consoleAction(22);
		R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 66 : 10);
		break;
	default:
		_icon1.setIcon(1);
		_icon2.setIcon(2);
		_icon3.setIcon(3);
		_icon4.setIcon(4);
		break;
	}

	if ((id != 6) && (id != 7) && (id != 24) && (id != 25))
		_consoleMode = id;
}

/**
 * Sets the message to be displayed on the console screen.
 */
void Scene125::setDetails(int resNum, int lineNum) {
	stop();

	Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);

	if (!msg.empty()) {
		// Check for any specified sound numbers embedded in the message
		msg = parseMessage(msg);

		_sceneText._fontNumber = _iconFontNumber;
		_sceneText._color1 = 92;
		_sceneText._color2 = 0;
		_sceneText._width = 221;
		_sceneText.fixPriority(20);
		_sceneText.setup(msg);
		_sceneText.setPosition(Common::Point(49, 19));

		R2_GLOBALS._sceneObjects->draw();

		if ((_soundCount > 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
			_sceneMode = 12;
			R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this);
		}
	} else {
		// Passed the start or end of the message set, so return to the menu
		R2_GLOBALS._player.disableControl();
		R2_GLOBALS._player.hide();

		_icon4.setPosition(Common::Point(80, 62));
		_icon4._sceneRegionId = 5;
		_icon4.hideIcon();

		_consoleMode = 0;
		_palette.loadPalette(160);
		_sceneMode = 11;
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this);
	}
}

/**
 * Stops any playing console sounds and hides any current console message.
 */
void Scene125::stop() {
	_sceneText.remove();
	_soundIndex = 0;
	_soundCount = 0;

	R2_GLOBALS._playStream.stop();
}

/**
 * Parses a message to be displayed on the console to see whether there are any sounds to be played.
 */
Common::String Scene125::parseMessage(const Common::String &msg) {
	_soundIndex = 0;
	_soundCount = 0;

	const char *msgP = msg.c_str();
	while (*msgP == '!') {
		// Get the sound number
		_soundIndexes[_soundCount++] = atoi(++msgP);

		while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
			++msgP;
	}

	return Common::String(msgP);
}

/*--------------------------------------------------------------------------
 * Scene 150 - Empty Bedroom
 *
 *--------------------------------------------------------------------------*/

void Scene150::postInit(SceneObjectList *OwnerList) {
	loadScene(100);
	SceneExt::postInit();

	_door.postInit();
	_door._state = 0;
	_door.setVisage(100);
	_door.setPosition(Common::Point(160, 84));
	_door.setDetails(100, 3, -1, -1, 1, (SceneItem *)NULL);

	_doorDisplay.postInit();
	_doorDisplay.setup(100, 2, 1);
	_doorDisplay.setPosition(Common::Point(202, 53));
	_doorDisplay.setDetails(100, -1, -1, -1, 1, (SceneItem *)NULL);

	_emptyRoomTable.postInit();
	_emptyRoomTable.setVisage(100);
	_emptyRoomTable.setStrip(4);
	_emptyRoomTable.setFrame(1);
	_emptyRoomTable.setPosition(Common::Point(175, 157));
	_emptyRoomTable.setDetails(150, 3, 4, 5, 1, (SceneItem *)NULL);

	_wardrobe.postInit();
	_wardrobe.setVisage(101);
	_wardrobe.setPosition(Common::Point(231, 126));
	_wardrobe.fixPriority(10);
	_wardrobe.setDetails(100, 37, -1, 39, 1, (SceneItem *)NULL);

	_terminal.setDetails(11, 100, 14, 15, 16);
	_desk.setDetails(12, 100, 11, -1, 13);
	_bed.setDetails(13, 100, 8, 9, 10);
	_duct.setDetails(14, 100, 34, -1, 36);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 150, 0, 1, -1, 1, NULL);
	_sceneMode = 100;

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 100:
		setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL);
		break;
	case 200:
		setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(180, 100));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

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

void Scene150::signal() {
	switch (_sceneMode) {
	case 101:
		R2_GLOBALS._sceneManager.changeScene(200);
		break;
	case 105:
		R2_GLOBALS._sceneManager.changeScene(125);
		break;
	case 110:
		if (_door._state) {
			_door._state = 0;
			_doorDisplay.setFrame(1);
		} else {
			_door._state = 1;
			_doorDisplay.setFrame(2);
		}
		R2_GLOBALS._player.enableControl();
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 160 - Credits
 *
 *--------------------------------------------------------------------------*/

void Scene160::Action1::signal() {
	Scene160 *scene = (Scene160 *)R2_GLOBALS._sceneManager._scene;
	bool breakFlag;
	SynchronizedList<SceneText *>::iterator i;
	SceneText *topItem;

	switch (_actionIndex) {
	case 0:
		scene->_yChange = 1;
		scene->_lineNum = 0;
		++_actionIndex;
		// Deliberate fall-through

	case 1:
		setDelay(5);
		breakFlag = true;
		do {
			if (!scene->_lineNum || ((scene->_lineNum != -1) &&
					(((*scene->_creditsList.reverse_begin())->_position.y < 164) || !breakFlag))) {
				breakFlag = true;
				Common::String msg = g_resourceManager->getMessage(160, scene->_lineNum++);

				if (*msg.c_str() == '^') {
					scene->_lineNum = -1;
				} else {
					if (msg.size() == 0)
						msg = " ";

					SceneText *sceneText = new SceneText();
					sceneText->_fontNumber = 50;

					switch (*msg.c_str()) {
					case '$': {
						// Centered text
						msg.deleteChar(0);
						int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());

						sceneText->_textMode = ALIGN_CENTER;
						sceneText->setPosition(Common::Point(160 - (width / 2), 175));
						sceneText->_width = 320;
						break;
					}

					case '%': {
						// Text for position name
						msg.deleteChar(0);
						int width = R2_GLOBALS.gfxManager()._font.getStringWidth(msg.c_str());

						sceneText->_textMode = ALIGN_RIGHT;
						sceneText->setPosition(Common::Point(151 - width, 175));
						sceneText->_width = 320;
						breakFlag = false;
						break;
					}

					case '@':
						// Text for who was in the position
						msg.deleteChar(0);
						sceneText->_textMode = ALIGN_LEFT;
						sceneText->_position = Common::Point(167, 175);
						sceneText->_width = 153;
						break;

					default:
						sceneText->_width = 151;
						sceneText->setPosition(Common::Point(151, 175));
						sceneText->_textMode = ALIGN_RIGHT;
						break;
					}

					sceneText->_color1 = 191;
					sceneText->_color2 = 191;
					sceneText->_color3 = 191;
					sceneText->setup(msg);
					sceneText->_flags |= OBJFLAG_CLONED;
					sceneText->fixPriority(5);

					scene->_creditsList.push_back(sceneText);
				}
			}

		} while (!breakFlag);

		// Move all the active credits
		for (i = scene->_creditsList.begin(); i != scene->_creditsList.end(); ++i) {
			SceneObject *item = *i;
			item->setPosition(Common::Point(item->_position.x, item->_position.y - scene->_yChange));
		}

		topItem = *scene->_creditsList.begin();
		if (topItem->_position.y < 25) {
			// Credit has reached the top, so remove it
			topItem->remove();
			scene->_creditsList.remove(topItem);

			if (scene->_creditsList.size() == 0) {
				// No more items left
				setDelay(10);
				++_actionIndex;
			}
		}
		break;

	case 2:
		HelpDialog::show();
		setDelay(4);
		break;
	}
}

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

Scene160::Scene160(): SceneExt() {
	_frameNumber = _yChange = 0;
	_lineNum = 0;
}

void Scene160::postInit(SceneObjectList *OwnerList) {
	loadScene(4001);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	R2_GLOBALS._player._uiEnabled = false;
	R2_GLOBALS._player.enableControl();
	R2_GLOBALS._player._canWalk = false;

	R2_GLOBALS._uiElements.hide();
	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;

	_lineNum = 0;
	_frameNumber = R2_GLOBALS._events.getFrameNumber();

	_sound1.play(337);
	setAction(&_action1);
}

void Scene160::synchronize(Serializer &s) {
	SceneExt::synchronize(s);
	s.syncAsSint16LE(_frameNumber);
	s.syncAsSint16LE(_yChange);
	s.syncAsSint16LE(_lineNum);

	_creditsList.synchronize(s);
}

void Scene160::remove() {
	// Clear the credit list
	SynchronizedList<SceneText *>::iterator i;
	for (i = _creditsList.begin(); i != _creditsList.end(); ++i) {
		SceneText *item = *i;

		item->remove();
	}
	_creditsList.clear();

	_sound1.fadeOut(NULL);
	SceneExt::remove();
}

void Scene160::process(Event &event) {
	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
		event.handled = true;
		HelpDialog::show();
	}

	if (!event.handled)
		SceneExt::process(event);
}

/*--------------------------------------------------------------------------
 * Scene 180 - Title Screen
 *
 *--------------------------------------------------------------------------*/

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

	switch (_actionIndex++) {
	case 0:
	case 1:
	case 2:
		scene->_shipDisplay.setStrip((_actionIndex == 1) ? 1 : 2);
		scene->_shipDisplay.setFrame(1);
		scene->_shipDisplay.animate(ANIM_MODE_5, this);
		break;
	case 4:
		scene->_shipDisplay.setStrip(3);
		scene->_shipDisplay.setFrame(1);
		scene->_shipDisplay.animate(ANIM_MODE_5, this);
		_actionIndex = 0;
		break;
	}
}

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

Scene180::Scene180(): SceneExt() {
	_helpEnabled = false;
	_frameInc = 0;
	_frameNumber = R2_GLOBALS._events.getFrameNumber();
	_fontNumber = R2_GLOBALS.gfxManager()._font._fontNumber;

	GfxFont font;
	font.setFontNumber(7);
	_fontHeight = font.getHeight() + 1;

	_sceneMode = (R2_GLOBALS._sceneManager._previousScene == 205) ? 10 : 0;
	_gameTextSpeaker._displayMode = 9;
}

void Scene180::postInit(SceneObjectList *OwnerList) {
	loadScene(9999);
	SceneExt::postInit();

	R2_GLOBALS._uiElements._active = true;
	R2_GLOBALS._player.disableControl();

	_stripManager.addSpeaker(&_gameTextSpeaker);
	_stripManager.addSpeaker(&_webbsterSpeaker);
	_stripManager.addSpeaker(&_tealSpeaker);
	_stripManager.addSpeaker(&_dutyOfficerSpeaker);

	signal();
}

void Scene180::remove() {
	_stripManager._currObj44Id = -1;
//	_stripManager._field2EA = -1;
	SceneExt::remove();

	R2_GLOBALS._scenePalette.loadPalette(0);
	R2_GLOBALS._scenePalette.setEntry(255, 255, 255, 255);

	R2_GLOBALS._events.setCursor(CURSOR_WALK);
	// word_575F7 = 0;
	R2_GLOBALS._playStream.stop();
	R2_GLOBALS._sound2.fadeOut2(NULL);
	R2_GLOBALS._sound1.fadeOut2(NULL);
}

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

	s.syncAsSint16LE(_frameNumber);
	s.syncAsSint16LE(_helpEnabled);
	s.syncAsSint16LE(_frameInc);
	s.syncAsSint16LE(_fontNumber);
	s.syncAsSint16LE(_fontHeight);
}

void Scene180::signal() {
	R2_GLOBALS._playStream.stop();

	switch (_sceneMode++) {
	case 0:
		setSceneDelay(6);
		break;

	case 1:
		_helpEnabled = true;
		R2_GLOBALS._sceneManager._hasPalette = true;
		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
		_animationPlayer._isActive = true;
		_animationPlayer._objectMode = ANIMOBJMODE_1;
		R2_GLOBALS._scene180Mode = 1;

		_animationPlayer.load(1);
		R2_GLOBALS._scenePalette.loadPalette(_animationPlayer._subData._palData, 0, 256);

		R2_GLOBALS._sound1.play(1);
		break;

	case 2:
		R2_GLOBALS._scene180Mode = 1;
		R2_GLOBALS._paneRefreshFlag[0] = 3;

		if (R2_GLOBALS._sound1.isPlaying()) {
			setSceneDelay(1);
		} else {
			setSceneDelay(180);
		}
		break;

	case 3:
		R2_GLOBALS._scene180Mode = 1;

		if (R2_GLOBALS._sound1.isPlaying())
			_sceneMode = 3;

		setSceneDelay(1);
		break;

	case 4:
	case 8:
	case 30:
	case 43:
	case 47:
		_helpEnabled = false;
		R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
		_palette.loadPalette(0);
		_palette.loadPalette(9998);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
		break;

	case 5:
		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
		_animationPlayer._isActive = true;
		_animationPlayer._objectMode = ANIMOBJMODE_1;
		R2_GLOBALS._scene180Mode = 2;
		_animationPlayer.load(2);

		_helpEnabled = true;
		R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
		R2_GLOBALS._sound1.play(2);
		break;

	case 6:
		R2_GLOBALS._scene180Mode = 2;
		R2_GLOBALS._paneRefreshFlag[0] = 3;

		if (R2_GLOBALS._sound1.isPlaying()) {
			setSceneDelay(1);
		} else {
			setSceneDelay(180);
		}
		break;

	case 7:
		// Title screen. Wait until title music finishes playing
		R2_GLOBALS._scene180Mode = 2;
		if (R2_GLOBALS._sound1.isPlaying())
			_sceneMode = 7;
		setSceneDelay(1);
		break;

	case 9:
		R2_GLOBALS._sound1.play(3);
		clearScreen();
		setSceneDelay(2);
		break;

	case 10:
		loadScene(4002);
		R2_GLOBALS._scenePalette.loadPalette(0);
		setSceneDelay(6);
		break;

	case 11:
		_helpEnabled = true;
		_door.postInit();
		_shipDisplay.postInit();
		setAction(&_sequenceManager, this, 4000, &_door, &_shipDisplay, NULL);
		break;

	case 12:
	case 14:
	case 16:
	case 18:
	case 20:
	case 22:
	case 24:
	case 26:
	case 46:
		setSceneDelay((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) ? 1 : 18);
		break;

	case 13:
		setAction(&_sequenceManager, this, 4001, &_door, &_shipDisplay, NULL);
		break;

	case 15:
		setAction(&_sequenceManager, this, 4002, &_door, &_shipDisplay, NULL);
		break;

	case 17:
		setAction(&_sequenceManager, this, 4003, &_door, &_shipDisplay, NULL);
		break;

	case 19:
		setAction(&_sequenceManager, this, 4004, &_door, &_shipDisplay, NULL);
		break;

	case 21:
		setAction(&_sequenceManager, this, 4005, &_door, &_shipDisplay, NULL);
		break;

	case 23:
		setAction(&_sequenceManager, this, 4006, &_door, &_shipDisplay, NULL);
		break;

	case 25:
		setAction(&_sequenceManager, this, 4007, &_door, &_shipDisplay, NULL);
		break;

	case 27:
		_helpEnabled = false;
		_door.remove();
		_shipDisplay.remove();
		setSceneDelay(2);
		break;

	case 28:
		_helpEnabled = false;
		_palette.loadPalette(0);
		_palette.loadPalette(9998);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 100, this);
		break;

	case 29:
		_helpEnabled = true;
		_animationPlayer._paletteMode = ANIMPALMODE_REPLACE_PALETTE;
		_animationPlayer._isActive = true;
		_animationPlayer._objectMode = ANIMOBJMODE_42;
		R2_GLOBALS._scene180Mode = 3;
		_animationPlayer.load(3);
		break;

	case 31:
		R2_GLOBALS._sound2.play(7);

		_door.postInit();
		_door.setVisage(76);
		_door.setStrip(1);
		_door.setFrame(1);
		_door.setPosition(Common::Point(288, 143));
		_door.fixPriority(210);

		loadScene(75);

		R2_GLOBALS._scenePalette.loadPalette(0);
		R2_GLOBALS._scenePalette.loadPalette(75);

		if (R2_GLOBALS._sceneManager._hasPalette)
			R2_GLOBALS._scenePalette.refresh();
		setSceneDelay(6);
		break;

	case 32:
		_helpEnabled = true;

		_teal.postInit();
		_teal.setPosition(Common::Point(161, 97));
		_teal.hide();

		_webbster.postInit();
		_webbster.setPosition(Common::Point(60, 96));
		_webbster.hide();
		_stripManager.start(11, this);
		break;

	case 33:
		_teal.hide();

		_webbster.setup(76, 4, 1);
		_webbster.setFrame(_webbster.getFrameCount());

		_shipDisplay.postInit();
		_shipDisplay.setup(75, 1, 1);
		_shipDisplay.setPosition(Common::Point(221, 125));
		_shipDisplay.fixPriority(210);
		_shipDisplay.setAction(&_action1);
		_stripManager.start(12, this);
		break;

	case 34:
		_teal.hide();
		_webbster.remove();

		_dutyOfficer.postInit();
		_dutyOfficer.setup(76, 2, 1);
		_dutyOfficer.setPosition(Common::Point(287, 135));
		_dutyOfficer.fixPriority(200);

		_sound1.play(19);
		_door.animate(ANIM_MODE_5, this);
		break;

	case 35:
		_stripManager.start(13, this);
		break;

	case 36:
		_teal.remove();
		_sound1.play(19);
		_door.animate(ANIM_MODE_6, this);
		break;

	case 37:
		_helpEnabled = false;
		_dutyOfficer.remove();
		_palette.loadPalette(9998);
		R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 8, this);
		break;

	case 38:
		_door.remove();
		_shipDisplay.setAction(NULL);
		_shipDisplay.remove();

		_backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
		R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
		R2_GLOBALS._sound2.fadeOut2(NULL);
		R2_GLOBALS._sound1.fadeOut2(this);
		break;

	case 39:
		R2_GLOBALS._sound1.changeSound(8);
		setSceneDelay(1);
		break;

	case 40:
		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
		_animationPlayer._objectMode = ANIMOBJMODE_1;
		R2_GLOBALS._scene180Mode = 4;
		if (_animationPlayer.load(4)) {
			_animationPlayer.dispatch();
			R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 8, this);
		} else {
			_sceneMode = 43;
			setSceneDelay(1);
		}
		break;

	case 41:
		_helpEnabled = true;
		_animationPlayer._isActive = true;
		break;

	case 42:
		R2_GLOBALS._scene180Mode = 4;
		R2_GLOBALS._paneRefreshFlag[0] = 3;
		setSceneDelay(1);
		break;

	case 44:
		loadScene(9997);
		R2_GLOBALS._scenePalette.loadPalette(9997);
		if (R2_GLOBALS._sceneManager._hasPalette)
			R2_GLOBALS._scenePalette.refresh();

		setSceneDelay(6);
		break;

	case 45:
		_helpEnabled = true;
		_stripManager.start(28, this);
		break;

	case 48:
		_helpEnabled = true;
		_animationPlayer._paletteMode = ANIMPALMODE_NONE;
		_animationPlayer._isActive = true;
		_animationPlayer._objectMode = ANIMOBJMODE_1;
		R2_GLOBALS._scene180Mode = 15;
		_animationPlayer.load(15, NULL);

		R2_GLOBALS._sound1.play(9);
		R2_GLOBALS._scenePalette.addFader(_animationPlayer._subData._palData, 256, 6, NULL);
		break;

	case 49:
		R2_GLOBALS._scene180Mode = 15;
		R2_GLOBALS._paneRefreshFlag[0] = 3;

		_backSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);
		R2_GLOBALS._screenSurface.fillRect(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 0);

		setSceneDelay(1);
		break;

	case 50:
		R2_GLOBALS._scene180Mode = 0;
		_helpEnabled = false;

		// WORKAROUND: The original changed to scene 100 here, Quinn's Bedroom,
		// but instead we're changing to the previously unused scene 50, which shows
		// a closeup of Quinn in the floatation bed first
		R2_GLOBALS._sceneManager.changeScene(50);
		break;
	}
}

void Scene180::setSceneDelay(int v) {
	_frameInc = v;
	_frameNumber = R2_GLOBALS._events.getFrameNumber();
}

void Scene180::process(Event &event) {
	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
		event.handled = true;
		if (_helpEnabled) {
			if (R2_GLOBALS._scenePalette._listeners.size() == 0)
				HelpDialog::show();
		}
	}

	if (!event.handled)
		SceneExt::process(event);
}

void Scene180::dispatch() {
	if (_frameInc) {
		uint32 gameFrame = R2_GLOBALS._events.getFrameNumber();

		if (gameFrame >= (uint32)_frameNumber) {
			_frameInc -= gameFrame - _frameNumber;
			_frameNumber = gameFrame;

			if (_frameInc <= 0) {
				_frameInc = 0;
				signal();
			}
		}
	}

	if (_animationPlayer._isActive) {
		if (_animationPlayer.isCompleted()) {
			_animationPlayer._isActive = false;
			_animationPlayer.close();
			_animationPlayer.remove();

			signal();
		} else {
			_animationPlayer.dispatch();
		}
	}

	Scene::dispatch();
}

void Scene180::restore() {
	R2_GLOBALS._gfxColors.background = 0;
	R2_GLOBALS._gfxColors.foreground = 0xff;
	R2_GLOBALS._fontColors.background = 0;
	R2_GLOBALS._fontColors.foreground = 0xff;

	switch (R2_GLOBALS._scene180Mode) {
	case 0:
		R2_GLOBALS._events.setCursor(SHADECURSOR_HAND);

		R2_GLOBALS._gfxColors.foreground = 4;
		R2_GLOBALS._gfxColors.background = 3;
		R2_GLOBALS._fontColors.background = 3;
		R2_GLOBALS._frameEdgeColor = 3;
		break;

	case 1:
		R2_GLOBALS._events.setCursor(R2_CURSOR_20);

		R2_GLOBALS._gfxColors.foreground = 25;
		R2_GLOBALS._gfxColors.background = 43;
		R2_GLOBALS._fontColors.background = 48;
		R2_GLOBALS._frameEdgeColor = 48;
		break;

	case 2:
		R2_GLOBALS._events.setCursor(R2_CURSOR_21);

		R2_GLOBALS._gfxColors.foreground = 106;
		R2_GLOBALS._gfxColors.background = 136;
		R2_GLOBALS._fontColors.background = 48;
		R2_GLOBALS._fontColors.foreground = 253;
		R2_GLOBALS._frameEdgeColor = 48;
		break;

	case 3:
		R2_GLOBALS._events.setCursor(R2_CURSOR_22);

		R2_GLOBALS._gfxColors.foreground = 84;
		R2_GLOBALS._gfxColors.background = 118;
		R2_GLOBALS._fontColors.background = 47;
		R2_GLOBALS._frameEdgeColor = 48;
		break;

	case 14:
		R2_GLOBALS._events.setCursor(R2_CURSOR_23);

		R2_GLOBALS._fontColors.background = 38;
		R2_GLOBALS._fontColors.foreground = 38;
		R2_GLOBALS._gfxColors.foreground = 192;
		R2_GLOBALS._gfxColors.background = 30;
		R2_GLOBALS._frameEdgeColor = 48;
		break;

	default:
		R2_GLOBALS._gfxColors.background = 0;
		R2_GLOBALS._gfxColors.foreground = 59;
		R2_GLOBALS._fontColors.background = 4;
		R2_GLOBALS._fontColors.foreground = 15;

		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 200 - Ship Corridor
 *
 *--------------------------------------------------------------------------*/

bool Scene200::NorthDoor::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 202;
		scene->setAction(&scene->_sequenceManager, scene, 202, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene200::EastDoor::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 200;
		scene->setAction(&scene->_sequenceManager, scene, 200, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene200::WestDoor::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 204;
		scene->setAction(&scene->_sequenceManager, scene, 204, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

void Scene200::EastExit::changeScene() {
	Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	scene->_sceneMode = 206;
	scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL);
}

void Scene200::WestExit::changeScene() {
	Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene;

	_enabled = false;
	R2_GLOBALS._player.disableControl(CURSOR_WALK);
	scene->_sceneMode = 208;
	scene->setAction(&scene->_sequenceManager, scene, 208, &R2_GLOBALS._player, NULL);
}

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

void Scene200::postInit(SceneObjectList *OwnerList) {
	loadScene(200);
	SceneExt::postInit();

	_westExit.setDetails(Rect(94, 0, 123, 58), EXITCURSOR_W, 175);
	_westExit.setDest(Common::Point(125, 52));
	_eastExit.setDetails(Rect(133, 0, 167, 58), EXITCURSOR_E, 150);
	_eastExit.setDest(Common::Point(135, 52));

	_northDoor.postInit();
	_northDoor.setVisage(200);
	_northDoor.setPosition(Common::Point(188, 79));
	_northDoor.setDetails(200, 3, -1, -1, 1, (SceneItem *)NULL);

	_eastDoor.postInit();
	_eastDoor.setVisage(200);
	_eastDoor.setStrip(2);
	_eastDoor.setPosition(Common::Point(305, 124));
	_eastDoor.setDetails(200, 6, -1, -1, 1, (SceneItem *)NULL);

	_westDoor.postInit();
	_westDoor.setVisage(200);
	_westDoor.setStrip(3);
	_westDoor.setPosition(Common::Point(62, 84));
	_westDoor.setDetails(200, 9, -1, -1, 1, (SceneItem *)NULL);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_compartment.setDetails(Rect(4, 88, 153, 167), 200, 12, -1, -1, 1, NULL);
	_westDoorDisplay.setDetails(Rect(41, 51, 48, 61), 200, 15, -1, -1, 1, NULL);
	_eastDoorDisplay.setDetails(Rect(279, 67, 286, 78), 200, 18, -1, -1, 1, NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 200, 0, -1, -1, 1, NULL);

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 100:
		_sceneMode = 201;
		setAction(&_sequenceManager, this, 201, &R2_GLOBALS._player, &_eastDoor, NULL);
		break;
	case 150:
		_sceneMode = 207;
		setAction(&_sequenceManager, this, 207, &R2_GLOBALS._player, NULL);
		break;
	case 175:
		_sceneMode = 209;
		setAction(&_sequenceManager, this, 209, &R2_GLOBALS._player, NULL);
		break;
	case 250:
		_sceneMode = 203;
		setAction(&_sequenceManager, this, 203, &R2_GLOBALS._player, &_northDoor, NULL);
		break;
	case 400:
		_sceneMode = 205;
		setAction(&_sequenceManager, this, 205, &R2_GLOBALS._player, &_westDoor, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(215, 115));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene200::signal() {
	switch (_sceneMode) {
	case 200:
		R2_GLOBALS._sceneManager.changeScene(100);
		break;
	case 202:
		R2_GLOBALS._sceneManager.changeScene(250);
		break;
	case 204:
		R2_GLOBALS._sceneManager.changeScene(400);
		break;
	case 206:
		R2_GLOBALS._sceneManager.changeScene(150);
		break;
	case 208:
		R2_GLOBALS._sceneManager.changeScene(175);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 205 - Star-field Credits
 *
 *--------------------------------------------------------------------------*/

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

	switch (_actionIndex++) {
	case 0:
		setDelay(2);
		break;

	case 1:
		scene->_yp = 100 - (scene->_fontHeight * 3 / 2);
		scene->handleText();

		for (int idx = 1; idx <= 2; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}
		setDelay(240);
		break;

	case 2:
	case 4:
	case 6:
	case 8:
	case 10:
	case 12:
	case 14:
	case 16:
	case 18:
	case 20:
		textLoop();
		setDelay(120);
		break;

	case 3:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 2) / 2);
		scene->handleText();

		++scene->_textIndex;
		scene->_yp += scene->_fontHeight;
		scene->handleText();
		setDelay(240);
		break;

	case 5:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 7) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 6; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(480);
		break;

	case 7:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 6) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 5; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(300);
		break;

	case 9:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 8) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 7; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(480);
		break;

	case 11:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 2; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(240);
		break;

	case 13:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 2; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(240);
		break;

	case 15:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 4; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(240);
		break;

	case 17:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 5) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 4; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(360);
		break;

	case 19:
		scene->_textIndex = 1;
		scene->_yp = 100 - ((scene->_fontHeight * 3) / 2);
		scene->handleText();

		for (int idx = 1; idx <= 2; ++idx) {
			++scene->_textIndex;
			scene->_yp += scene->_fontHeight;
			scene->handleText();
		}

		setDelay(480);
		break;

	case 21:
		R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);

	default:
		break;
	}
}

void Scene205::Action1::textLoop() {
	Scene205 *scene = (Scene205 *)R2_GLOBALS._sceneManager._scene;

	for (int idx = 1; idx <= 14; ++idx) {
		if (R2_GLOBALS._sceneObjects->contains(&scene->_textList[idx])) {
			scene->_textList[idx].remove();
		}
	}
}

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

Scene205::Scene205(): SceneExt() {
	_yp = 0;
	_textIndex = 1;
	_lineNum = -1;

	GfxFont font;
	font.setFontNumber(4);
	_fontHeight = font.getHeight();

	for (int i = 0; i < 3; i++) {
		_starList1[i] = nullptr;
		_starList2[i] = nullptr;
	}

	for (int i = 0; i < 4; i++)
		_starList3[i] = nullptr;
}

void Scene205::postInit(SceneObjectList *OwnerList) {
	loadScene(4000);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();
	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
	R2_GLOBALS._player._uiEnabled = false;

	R2_GLOBALS._sound1.play(337);
	R2_GLOBALS._scenePalette.loadPalette(0);
	R2_GLOBALS._player.disableControl();

	setup();
	setAction(&_action1);
}

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

	for (int idx = 0; idx < 3; ++idx)
		SYNC_POINTER(_starList1[idx]);
	for (int idx = 0; idx < 3; ++idx)
		SYNC_POINTER(_starList2[idx]);
	for (int idx = 0; idx < 4; ++idx)
		SYNC_POINTER(_starList3[idx]);

	s.syncAsSint16LE(_textIndex);
	s.syncAsSint16LE(_lineNum);
	s.syncAsSint16BE(_yp);
}

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

void Scene205::process(Event &event) {
	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
		event.handled = true;
		R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
	} else {
		Scene::process(event);
	}
}

void Scene205::dispatch() {
	processList(_starList3, 4, Common::Rect(0, 0, 319, 200), 1, 1, 160, 100);
	processList(_starList2, 3, Common::Rect(0, 0, 319, 200), 2, 2, 160, 100);
	processList(_starList1, 3, Common::Rect(0, 0, 319, 200), 4, 3, 160, 100);

	Scene::dispatch();
}

void Scene205::setup() {
	const Common::Point pointList1[3] = { Common::Point(2, 50), Common::Point(100, 28), Common::Point(53, 15) };
	const Common::Point pointList2[3] = { Common::Point(289, 192), Common::Point(125, 60), Common::Point(130, 40) };
	const Common::Point pointList3[4] = {
		Common::Point(140, 149), Common::Point(91, 166), Common::Point(299, 46), Common::Point(314, 10)
	};

	// Set up the first star list
	for (int idx = 0; idx < 3; ++idx) {
		Star *obj = new Star();
		_starList1[idx] = obj;

		obj->postInit();
		obj->_flags |= OBJFLAG_CLONED;
		obj->setVisage(205);
		obj->_strip = 1;
		obj->_frame = 1;
		obj->setPosition(pointList1[idx]);
		obj->_x100 = obj->_position.x * 100;
		obj->_y100 = obj->_position.y * 100;
		obj->fixPriority(12);
	}

	// Setup the second star list
	for (int idx = 0; idx < 3; ++idx) {
		Star *obj = new Star();
		_starList2[idx] = obj;

		obj->postInit();
		obj->_flags |= OBJFLAG_CLONED;
		obj->setVisage(205);
		obj->_strip = 1;
		obj->_frame = 2;
		obj->setPosition(pointList2[idx]);
		obj->_x100 = obj->_position.x * 100;
		obj->_y100 = obj->_position.y * 100;
		obj->fixPriority(11);
	}

	// Setup the third star list
	for (int idx = 0; idx < 4; ++idx) {
		Star *obj = new Star();
		_starList3[idx] = obj;

		obj->postInit();
		obj->_flags |= OBJFLAG_CLONED;
		obj->setVisage(205);
		obj->_strip = 1;
		obj->_frame = 3;
		obj->setPosition(pointList3[idx]);
		obj->_x100 = obj->_position.x * 100;
		obj->_y100 = obj->_position.y * 100;
		obj->fixPriority(10);
	}
}

/**
 * Handles moving a group of stars in the scene background
 */
void Scene205::processList(Star **ObjList, int count, const Common::Rect &bounds,
						   int xMultiply, int yMultiply, int xCenter, int yCenter) {
	for (int idx = 0; idx < count; ++idx) {
		Star *obj = ObjList[idx];
		Common::Point pt(obj->_position.x - xCenter, obj->_position.y - yCenter);

		if ((obj->_position.x <= 319) && (obj->_position.x >= 0) &&
				(obj->_position.y <= 199) && (obj->_position.y >= 0)) {
			if (!pt.x && !pt.y) {
				pt.x = pt.y = 1;
			}

			pt.x *= xMultiply;
			pt.y *= yMultiply;
			obj->_x100 += pt.x;
			obj->_y100 += pt.y;
		} else {
			obj->_x100 = (bounds.left + R2_GLOBALS._randomSource.getRandomNumber(bounds.right)) * 100;
			obj->_y100 = (bounds.top + R2_GLOBALS._randomSource.getRandomNumber(bounds.bottom)) * 100;
		}

		obj->setPosition(Common::Point(obj->_x100 / 100, obj->_y100 / 100));
   }
}

void Scene205::handleText() {
	_message = g_resourceManager->getMessage(205, ++_lineNum);

	_textList[_textIndex]._fontNumber = 4;
	_textList[_textIndex]._color1 = 0;
	_textList[_textIndex]._color2 = 10;
	_textList[_textIndex]._color3 = 7;
	_textList[_textIndex]._width = 400;
	_textList[_textIndex].setup(_message);
	_textList[_textIndex].fixPriority(199);

	GfxFont font;
	font.setFontNumber(4);
	int width = font.getStringWidth(_message.c_str());

	_textList[_textIndex].setPosition(Common::Point(160 - (width / 2), _yp));
}

/*--------------------------------------------------------------------------
 * Scene 205 Demo - End of Demo
 *
 *--------------------------------------------------------------------------*/

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

	switch (_actionIndex++) {
	case 0:
		setDelay(2);
		break;
	case 1:
		MessageDialog::show2(BUY_FULL_GAME_MSG, OK_BTN_STRING);
		setDelay(1);
		break;
	case 2:
		scene->leaveScene();
		break;
	default:
		break;
	}
}

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

void Scene205Demo::leaveScene() {
	if (g_globals->getFlag(85))
		R2_GLOBALS._sceneManager.changeScene(160);
	else
		R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);

	BF_GLOBALS._scenePalette.loadPalette(0);
	BF_GLOBALS._scenePalette.refresh();
}

void Scene205Demo::postInit(SceneObjectList *OwnerList) {
	R2_GLOBALS._sceneManager._hasPalette = true;
	R2_GLOBALS._scenePalette.loadPalette(0);

	loadScene(1000);
	R2_GLOBALS._uiElements._active = false;
	R2_GLOBALS._player.enableControl();

	SceneExt::postInit();

	_sound1.play(337);
	_stripManager.addSpeaker(&_animationPlayer);

	setAction(&_action1);
}

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

void Scene205Demo::process(Event &event) {
	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE)) {
		event.handled = true;
		leaveScene();
	} else {
		Scene::process(event);
	}
}

/*--------------------------------------------------------------------------
 * Scene 250 - Lift
 *
 *--------------------------------------------------------------------------*/

Scene250::Button::Button(): SceneActor() {
	_floorNumber = 0;
}

void Scene250::Button::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_floorNumber);
}

bool Scene250::Button::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene250 *scene = (Scene250 *)R2_GLOBALS._sceneManager._scene;

		if (scene->_destButtonY) {
			SceneItem::display2(250, 15);
		} else {
			switch (_floorNumber) {
			case 1:
			case 2:
			case 5:
			case 9:
				scene->_sound1.play(14);
				scene->changeFloor(_floorNumber);
				break;
			case 10:
				// Current Floor
				scene->_sound1.play(14);
				R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._sceneManager._previousScene);
				break;
			default:
				SceneItem::display2(250, 16);
				break;
			}
		}
		return true;
		}

	case CURSOR_LOOK:
		switch (_floorNumber) {
		case 1:
		case 2:
		case 5:
		case 9:
			SceneItem::display2(250, 12);
			break;
		case 10:
			SceneItem::display2(250, 13);
			break;
		case 11:
			SceneItem::display2(250, 14);
			break;
		default:
			SceneItem::display2(250, 16);
			break;
		}
		return true;

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

void Scene250::Button::setFloor(int floorNumber) {
	SceneActor::postInit();
	_floorNumber = floorNumber;

	if (_floorNumber <= 9) {
		SceneObject::setup(250, 1, 4);

		switch (_floorNumber) {
		case 1:
		case 2:
		case 5:
		case 9:
			setFrame(6);
			break;
		default:
			break;
		}

		setPosition(Common::Point(111, (_floorNumber - 1) * 12 + 43));
		fixPriority(10);
		setDetails(250, -1, -1, -1, 1, (SceneItem *)NULL);
	}
}

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

Scene250::Scene250(): SceneExt() {
	_currButtonY = _destButtonY = _elevatorSpeed = 0;
	_skippingFl = _skippableFl = false;
}

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

	s.syncAsSint16LE(_currButtonY);
	s.syncAsSint16LE(_destButtonY);
	s.syncAsSint16LE(_elevatorSpeed);
	s.syncAsSint16LE(_skippableFl);
	s.syncAsSint16LE(_skippingFl);
}

void Scene250::postInit(SceneObjectList *OwnerList) {
	loadScene(250);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();
	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.enableControl();
	R2_GLOBALS._player._canWalk = false;

	_currentFloor.setFloor(10);
	_currentFloor.setup(250, 1, 5);
	_currentFloor.setDetails(250, 13, -1, -1, 1, (SceneItem *)NULL);

	_destinationFloor.setFloor(11);
	_destinationFloor.setup(250, 1, 3);
	_destinationFloor.setPosition(Common::Point(400, 100));
	_destinationFloor.setDetails(250, 14, -1, -1, 1, (SceneItem *)NULL);
	_destinationFloor.fixPriority(190);
	_destinationFloor.hide();

	_floor1.setFloor(1);
	_floor2.setFloor(2);
	_floor3.setFloor(3);
	_floor4.setFloor(4);
	_floor5.setFloor(5);
	_floor6.setFloor(6);
	_floor7.setFloor(7);
	_floor8.setFloor(8);
	_floor9.setFloor(9);

	_door.setDetails(Rect(0, 0, 73, SCREEN_HEIGHT), 250, 9, -1, 9, 1, NULL);
	_directionIndicator.setDetails(Rect(239, 16, 283, 164), 250, 6, -1, -1, 1, NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 250, 0, 1, -1, 1, NULL);

	R2_GLOBALS._events.setCursor(CURSOR_USE);

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 200:
		_currButtonY = 55;
		break;
	case 300:
		_currButtonY = 43;
		break;
	case 700:
		_currButtonY = 139;
		break;
	case 850:
		_currButtonY = 91;
		break;
	default:
		R2_GLOBALS._sceneManager._previousScene = 200;
		_currButtonY = 55;
		break;
	}

	_currentFloor.setPosition(Common::Point(111, _currButtonY));
}

void Scene250::signal() {
	if (_skippingFl)
		_sceneMode = 20;

	switch (_sceneMode) {
	case 1:
		_sound1.play(22);
		R2_GLOBALS._player.show();
		R2_GLOBALS._player.setup(250, 1, 2);
		R2_GLOBALS._player.setPosition(Common::Point(261, 185));
		ADD_MOVER(R2_GLOBALS._player, 261, 15);

		_elevatorSpeed = 0;
		_sceneMode = 2;
		break;
	case 2:
		if (_destButtonY - 12 == _currButtonY)
			_sceneMode = 4;
		else
			_sceneMode = 3;

		signal();
		break;
	case 3:
		_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
		_currButtonY += 12;
		R2_GLOBALS._player.setPosition(Common::Point(261, 185));
		ADD_MOVER(R2_GLOBALS._player, 261, 15);

		if ((_destButtonY - 12) == _currButtonY)
			_sceneMode = 4;
		break;
	case 4:
		_sound1.play(21);

		_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y + 12));
		R2_GLOBALS._player.setPosition(Common::Point(261, 185));
		ADD_MOVER(R2_GLOBALS._player, 261, 15);
		_sceneMode = 5;
		break;
	case 5:
		R2_GLOBALS._player.disableControl();
		_sceneMode = 20;
		signal();
		break;
	case 6:
		_sound1.play(22);
		R2_GLOBALS._player.show();
		R2_GLOBALS._player.setup(250, 1, 2);
		R2_GLOBALS._player.setPosition(Common::Point(261, 15));
		ADD_MOVER(R2_GLOBALS._player, 261, 185);
		_elevatorSpeed = 0;
		_sceneMode = 7;
		break;
	case 7:
		_skippableFl = true;
		if ((_destButtonY + 12) == _currButtonY)
			_sceneMode = 9;
		else
			_sceneMode = 8;
		signal();
		break;
	case 8:
		_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
		_currButtonY -= 12;
		R2_GLOBALS._player.setPosition(Common::Point(261, 15));
		ADD_MOVER(R2_GLOBALS._player, 261, 185);

		if ((_destButtonY + 12) == _currButtonY)
			_sceneMode = 9;
		break;
	case 9:
		_sound1.play(21);
		_currentFloor.setPosition(Common::Point(111, _currentFloor._position.y - 12));
		R2_GLOBALS._player.setPosition(Common::Point(261, 15));
		ADD_MOVER(R2_GLOBALS._player, 261, 185);
		_sceneMode = 10;
		break;
	case 10:
		_sceneMode = 20;
		signal();
		break;
	case 20:
		// Handle changing scene
		switch (_destButtonY) {
		case 55:
			R2_GLOBALS._sceneManager.changeScene(200);
			break;
		case 43:
			R2_GLOBALS._sceneManager.changeScene(300);
			break;
		case 139:
			R2_GLOBALS._sceneManager.changeScene(700);
			break;
		case 91:
			R2_GLOBALS._sceneManager.changeScene(850);
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
}

void Scene250::changeFloor(int floorNumber) {
	_destButtonY = (floorNumber - 1) * 12 + 43;
	_destinationFloor.setPosition(Common::Point(111, _destButtonY));
	_destinationFloor.show();

	_skippableFl = true;
	_sceneMode = (_currButtonY >= _destButtonY) ? 6 : 1;
	if (_destButtonY == _currButtonY)
		_sceneMode = 20;

	signal();
}

void Scene250::process(Event &event) {
	if (!event.handled) {
		if (((event.eventType == EVENT_KEYPRESS) || (event.btnState == BTNSHIFT_RIGHT)) && _skippableFl) {
			_skippingFl = true;
			event.handled = true;
		}

		SceneExt::process(event);
	}
}

void Scene250::dispatch() {
	SceneExt::dispatch();

	if (((_sceneMode == 2) || (_sceneMode == 7)) && (_elevatorSpeed < 100)) {
		++_elevatorSpeed;
		R2_GLOBALS._player._moveDiff.y = _elevatorSpeed / 5;
	}

	if (((_sceneMode == 5) || (_sceneMode == 10)) && (R2_GLOBALS._player._moveDiff.y > 4)) {
		--_elevatorSpeed;
		R2_GLOBALS._player._moveDiff.y = (_elevatorSpeed / 7) + 3;
	}
}

/*--------------------------------------------------------------------------
 * Scene 300 - Bridge
 *
 *--------------------------------------------------------------------------*/

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

	switch (_actionIndex) {
	case 0:
		setAction(&scene->_sequenceManager2, this, 311, (R2_GLOBALS._player._characterIndex == R2_QUINN) ?
			(SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
		_actionIndex = 2;
		break;
	case 1:
		setAction(&scene->_sequenceManager2, this, 312, (R2_GLOBALS._player._characterIndex == R2_QUINN) ?
			(SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn);
		_actionIndex = 0;
		break;
	case 2:
		if (!R2_GLOBALS._playStream.isPlaying())
			_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);
		break;
	default:
		break;
	}
}

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

	switch (_actionIndex) {
	case 0:
		setAction(&scene->_sequenceManager3, this, 302, &scene->_seeker, NULL);
		_actionIndex = 2;
		break;
	case 1:
		setAction(&scene->_sequenceManager3, this, 303, &scene->_seeker, NULL);
		_actionIndex = 2;
		break;
	case 2:
		if (!R2_GLOBALS._playStream.isPlaying())
			_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);

		setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
		break;
	default:
		break;
	}
}

void Scene300::Action3::signal() {
	Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;

	switch (_actionIndex) {
	case 0:
		setAction(&scene->_sequenceManager3, this, 304, &scene->_miranda, NULL);
		_actionIndex = 2;
		break;
	case 1:
		setAction(&scene->_sequenceManager3, this, 305, &scene->_miranda, NULL);
		_actionIndex = 2;
		break;
	case 2:
		if (!R2_GLOBALS._playStream.isPlaying())
			_actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1);

		setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119));
		break;
	default:
		break;
	}
}


void Scene300::Action4::signal() {
	if (!R2_GLOBALS._playStream.isPlaying()) {
		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;

		scene->_mirandaScreen.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2));
		scene->_mirandaScreen.setFrame(1);

		scene->_quinnScreen.setStrip2(3);
		scene->_quinnScreen.setFrame(1);
	}

	setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(479));
}

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

bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE:
		if (R2_GLOBALS._player._characterIndex != R2_QUINN)
			SceneItem::display2(300, 46);
		else if (R2_GLOBALS.getFlag(44)) {
			R2_GLOBALS._player.setAction(NULL);
			R2_GLOBALS._sceneManager.changeScene(325);
		} else {
			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;

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

	case CURSOR_LOOK:
		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			SceneItem::display2(300, 47);
			return true;
		}
		break;

	default:
		break;
	}

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

bool Scene300::MirandaWorkstation::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE:
		if (R2_GLOBALS._player._characterIndex != R2_MIRANDA)
			SceneItem::display2(300, 49);
		else
			R2_GLOBALS._sceneManager.changeScene(325);
		return true;

	case CURSOR_LOOK:
		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
			SceneItem::display2(300, 47);
			return true;
		}
		break;

	default:
		break;
	}

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

bool Scene300::SeekerWorkstation::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_LOOK:
		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
			SceneItem::display2(300, 47);
			return true;
		}
		break;

	case CURSOR_USE:
		if (R2_GLOBALS._player._characterIndex != R2_SEEKER)
			SceneItem::display2(300, 48);
		else
			R2_GLOBALS._sceneManager.changeScene(325);
		return true;

	default:
		break;
	}

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

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

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

	switch (action) {
	case CURSOR_TALK:
		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			// Quinn talking to Miranda
			R2_GLOBALS._player.disableControl();

			if (!R2_GLOBALS.getFlag(44)) {
				if (R2_GLOBALS.getFlag(40))
					scene->_stripId = 119;
				else if (R2_GLOBALS.getFlag(38))
					scene->_stripId = 101;
				else {
					R2_GLOBALS._sound1.play(69);
					scene->_stripId = 100;
				}

				scene->_sceneMode = 309;
				scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
			} else if (!R2_GLOBALS.getFlag(55)) {
				R2_GLOBALS._events.setCursor(CURSOR_ARROW);
				scene->_sceneMode = 10;
				scene->_stripManager.start3(201, scene, R2_GLOBALS._stripManager_lookupList);
			} else {
				scene->_sceneMode = 16;

				if (!R2_GLOBALS.getFlag(57)) {
					R2_GLOBALS._events.setCursor(CURSOR_ARROW);
					scene->_stripManager.start3(434, scene, R2_GLOBALS._stripManager_lookupList);
				} else if (R2_GLOBALS._player._characterScene[R2_SEEKER] != 500) {
					R2_GLOBALS._events.setCursor(CURSOR_ARROW);
					scene->_stripManager.start3(407, scene, R2_GLOBALS._stripManager_lookupList);
				} else {
					scene->_stripId = 433;
					scene->_sceneMode = 309;
					scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
				}
			}
		} else {
			// Seeker talking to Miranda
			scene->_sceneMode = 10;
			R2_GLOBALS._events.setCursor(CURSOR_ARROW);

			if (!R2_GLOBALS.getFlag(44))
				scene->_stripId = 174 + R2_GLOBALS._randomSource.getRandomNumber(2);
			else if (!R2_GLOBALS.getFlag(55))
				scene->_stripId = 211;
			else
				scene->_stripId = 438;

			scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
		}
		return true;

	case R2_OPTO_DISK:
		SceneItem::display2(300, 54);
		return true;

	case R2_READER:
		if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
			SceneItem::display2(300, 55);
		else {
			R2_GLOBALS._player.disableControl();
			scene->_stripId = R2_GLOBALS.getFlag(4) ? 121 : 120;
			scene->_sceneMode = 309;
			scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
		}
		return true;

	default:
		break;
	}

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

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

	switch (action) {
	case CURSOR_TALK:
		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			if (!R2_GLOBALS.getFlag(44)) {
				if (!R2_GLOBALS.getFlag(38)) {
					R2_GLOBALS._sound1.play(69);
					scene->_stripId = 181;
					scene->_sceneMode = 310;
					scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
				} else {
					scene->_stripId = R2_GLOBALS.getFlag(40) ? 170 : 150;
					scene->_sceneMode = 310;
					scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL);
				}
			} else {
				R2_GLOBALS._events.setCursor(CURSOR_ARROW);
				if (!R2_GLOBALS.getFlag(55)) {
					scene->_sceneMode = 10;
					scene->_stripManager.start3(205, scene, R2_GLOBALS._stripManager_lookupList);
				} else {
					scene->_sceneMode = 16;
					scene->_stripManager.start3(R2_GLOBALS.getFlag(57) ? 407 : 401, scene, R2_GLOBALS._stripManager_lookupList);
				}
			}
		} else {
			scene->_sceneMode = 10;
			R2_GLOBALS._events.setCursor(CURSOR_ARROW);

			if (!R2_GLOBALS.getFlag(44))
				scene->_stripId = 122 + R2_GLOBALS._randomSource.getRandomNumber(2);
			else if (!R2_GLOBALS.getFlag(55))
				scene->_stripId = 209;
			else
				scene->_stripId = 440;

			scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
		}
		return true;

	case R2_OPTO_DISK:
		if (R2_GLOBALS.getFlag(13)) {
			SceneItem::display2(300, 53);
		} else {
			R2_GLOBALS._player.disableControl();
			scene->_stripId = 171;

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

	case R2_READER:
		if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1))
			break;

		R2_GLOBALS._player.disableControl();
		scene->_stripId = R2_GLOBALS.getFlag(4) ? 173 : 172;
		scene->_sceneMode = 310;
		scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL);
		return true;

	default:
		break;
	}

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

bool Scene300::Quinn::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_TALK: {
		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		scene->_sceneMode = 10;

		if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) {
			if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500)
				scene->_stripId = 442;
			else if (!R2_GLOBALS.getFlag(44))
				scene->_stripId = 125 + R2_GLOBALS._randomSource.getRandomNumber(2);
			else if (!R2_GLOBALS.getFlag(55))
				scene->_stripId = 439;
			else
				scene->_stripId = 210;
		} else if (R2_GLOBALS.getFlag(44)) {
			scene->_stripId = R2_GLOBALS.getFlag(55) ? 439 : 210;
		} else {
			scene->_stripId = 177 + R2_GLOBALS._randomSource.getRandomNumber(2);
		}

		scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList);
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene300::Doorway::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		if ((R2_GLOBALS._player._characterIndex == R2_QUINN) &&
				(!R2_GLOBALS.getFlag(44) || R2_GLOBALS._player._characterScene[R2_SEEKER] == 500)) {
			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;

			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 301;
			scene->setAction(&scene->_sequenceManager1, scene, 301, &R2_GLOBALS._player, this, NULL);
		} else {
			SceneItem::display2(300, 45);
		}

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

Scene300::Scene300(): SceneExt() {
	_stripId = 0;
	_rotation = NULL;

	_stripManager.setColors(60, 255);
	_stripManager.setFontNumber(3);
}

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

	s.syncAsSint16LE(_stripId);
	SYNC_POINTER(_rotation);
}

void Scene300::postInit(SceneObjectList *OwnerList) {
	loadScene(300);
	SceneExt::postInit();

	_sound1.play(23);
	setZoomPercents(75, 93, 120, 100);

	if (R2_GLOBALS._sceneManager._previousScene == -1) {
		R2_GLOBALS._sceneManager._previousScene = 1000;
		R2_GLOBALS._player._characterIndex = R2_QUINN;
	}

	_stripManager.addSpeaker(&_mirandaSpeaker);
	_stripManager.addSpeaker(&_seekerSpeaker);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_stripManager.addSpeaker(&_quinnLSpeaker);
	_stripManager.addSpeaker(&_seekerLSpeaker);
	_stripManager.addSpeaker(&_tealSpeaker);
	_stripManager.addSpeaker(&_soldierSpeaker);

	_rotation = R2_GLOBALS._scenePalette.addRotation(237, 254, -1);
	_rotation->setDelay(3);
	_rotation->_countdown = 1;

	if (R2_GLOBALS.getFlag(51) && !R2_GLOBALS.getFlag(25)) {
		_atmosphereLeftWindow.postInit();
		_atmosphereLeftWindow.setup(301, 7, 2);
		_atmosphereLeftWindow.setPosition(Common::Point(65, 24));

		_atmosphereRightWindow.postInit();
		_atmosphereRightWindow.setup(301, 8, 2);
		_atmosphereRightWindow.setPosition(Common::Point(254, 24));
	}

	_doorway.postInit();
	_doorway.setVisage(300);
	_doorway.setPosition(Common::Point(159, 79));

	_leftVerticalBarsAnim.postInit();
	_leftVerticalBarsAnim.setup(300, 4, 1);
	_leftVerticalBarsAnim.setPosition(Common::Point(84, 48));
	_leftVerticalBarsAnim.animate(ANIM_MODE_2, NULL);
	_leftVerticalBarsAnim._numFrames = 5;

	_rightVerticalBarsAnim.postInit();
	_rightVerticalBarsAnim.setup(300, 5, 1);
	_rightVerticalBarsAnim.setPosition(Common::Point(236, 48));
	_rightVerticalBarsAnim.animate(ANIM_MODE_2, NULL);

	_protocolDisplay.postInit();
	_protocolDisplay.setup(300, 6, 1);
	_protocolDisplay.setPosition(Common::Point(287, 71));
	_protocolDisplay.animate(ANIM_MODE_7, 0, NULL);
	_protocolDisplay._numFrames = 5;

	_rightTextDisplay.postInit();
	_rightTextDisplay.setup(300, 7, 1);
	_rightTextDisplay.setPosition(Common::Point(214, 37));
	_rightTextDisplay.animate(ANIM_MODE_2, NULL);
	_rightTextDisplay._numFrames = 3;

	_mirandaScreen.postInit();
	_mirandaScreen.setup(301, 1, 1);
	_mirandaScreen.setPosition(Common::Point(39, 97));
	_mirandaScreen.fixPriority(124);
	_mirandaScreen.animate(ANIM_MODE_2, NULL);
	_mirandaScreen._numFrames = 5;
	_mirandaScreen.setAction(&_action4);

	_leftTextDisplay.postInit();
	_leftTextDisplay.setup(300, 8, 1);
	_leftTextDisplay.setPosition(Common::Point(105, 37));
	_leftTextDisplay.animate(ANIM_MODE_2, NULL);
	_leftTextDisplay._numFrames = 5;

	_quinnScreen.postInit();
	_quinnScreen.setup(301, 6, 1);
	_quinnScreen.setPosition(Common::Point(274, 116));
	_quinnScreen.fixPriority(143);
	_quinnScreen.animate(ANIM_MODE_2, NULL);
	_quinnScreen._numFrames = 5;

	_quinnWorkstation1.setDetails(Rect(243, 148, 315, 167), 300, 30, 31, 32, 1, NULL);
	_mirandaWorkstation1.setDetails(Rect(4, 128, 69, 167), 300, 33, 31, 35, 1, NULL);

	switch (R2_GLOBALS._player._characterIndex) {
	case R2_QUINN:
		_miranda.postInit();
		_miranda.setup(302, 2, 1);
		_miranda.setPosition(Common::Point(47, 128));
		_miranda.setAction(&_action3);
		_miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);

		if ((R2_GLOBALS._player._characterScene[R2_SEEKER] == 300) || (R2_GLOBALS._player._characterScene[R2_SEEKER] == 325)) {
			_seeker.postInit();
			_seeker.setVisage(302);
			_seeker.setPosition(Common::Point(158, 108));
			_seeker.fixPriority(130);
			_seeker.setAction(&_action2);
			_seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
		}

		R2_GLOBALS._player.postInit();
		R2_GLOBALS._player.setVisage(10);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.disableControl();
		break;

	case R2_SEEKER:
		_miranda.postInit();
		_miranda.setup(302, 2, 1);
		_miranda.setPosition(Common::Point(47, 128));
		_miranda.setAction(&_action3);
		_miranda.setDetails(300, 39, 40, 41, 1, (SceneItem *)NULL);

		if ((R2_GLOBALS._player._characterScene[R2_QUINN] == 300) || (R2_GLOBALS._player._characterScene[R2_QUINN] == 325)) {
			_quinn.postInit();
			_quinn.setup(302, 3, 1);
			_quinn.setPosition(Common::Point(271, 150));
			_quinn.setAction(&_action1);
			_quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
		}

		R2_GLOBALS._player.postInit();
		R2_GLOBALS._player.setup(302, 1, 3);
		R2_GLOBALS._player.setPosition(Common::Point(158, 108));
		R2_GLOBALS._player.fixPriority(130);
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		R2_GLOBALS._player._canWalk = false;
		break;

	case R2_MIRANDA:
		if ((R2_GLOBALS._player._characterScene[R2_SEEKER] == 300) || (R2_GLOBALS._player._characterScene[R2_SEEKER] == 325)) {
			_seeker.postInit();
			_seeker.setVisage(302);
			_seeker.setPosition(Common::Point(158, 108));
			_seeker.fixPriority(130);
			_seeker.setAction(&_action2);
			_seeker.setDetails(300, 42, 43, 44, 1, (SceneItem *)NULL);
		}

		if ((R2_GLOBALS._player._characterScene[R2_QUINN] == 300) || (R2_GLOBALS._player._characterScene[R2_QUINN] == 325)) {
			_quinn.postInit();
			_quinn.setup(302, 3, 1);
			_quinn.setPosition(Common::Point(271, 150));
			_quinn.setAction(&_action1);
			_quinn.setDetails(300, 50, 51, 52, 1, (SceneItem *)NULL);
		}

		R2_GLOBALS._player.postInit();
		R2_GLOBALS._player.setup(302, 2, 1);
		R2_GLOBALS._player.setPosition(Common::Point(47, 128));
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		R2_GLOBALS._player._canWalk = false;
		break;

	default:
		break;
	}

	_seekerWorkstation.setDetails(Rect(101, 95, 217, 143), 300, 36, 31, 35, 1, NULL);
	_quinnWorkstation2.setDetails(Rect(224, 102, 315, 143), 300, 30, 31, 32, 1, NULL);
	_mirandaWorkstation2.setDetails(Rect(4, 83, 84, 124), 300, 33, 31, 35, 1, NULL);
	_hull.setDetails(11, 300, 6, -1, -1);
	_statusDisplays.setDetails(12, 300, 9, 10, -1);
	_damageControl.setDetails(13, 300, 12, -1, -1);
	_manualOverrides.setDetails(14, 300, 15, -1, 17);
	_scanners1.setDetails(Rect(126, 15, 183, 25), 300, 18, -1, 20, 1, NULL);
	_scanners2.setDetails(Rect(126, 80, 183, 90), 300, 18, -1, 20, 1, NULL);
	_protocolDisplay.setDetails(300, 27, -1, 29, 1, (SceneItem *)NULL);
	_indirectLighting1.setDetails(Rect(74, 71, 122, 89), 300, 21, -1, -1, 1, NULL);
	_indirectLighting2.setDetails(Rect(197, 71, 245, 89), 300, 21, -1, -1, 1, NULL);
	_lighting.setDetails(Rect(129, 3, 190, 14), 300, 24, -1, -1, 1, NULL);
	_doorway.setDetails(300, 3, -1, 5, 1, (SceneItem *)NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 300, 0, -1, -1, 1, NULL);

	switch (R2_GLOBALS._player._characterIndex) {
	case R2_QUINN:
		_sceneMode = 300;

		switch (R2_GLOBALS._sceneManager._previousScene) {
		case 250:
			setAction(&_sequenceManager1, this, 300, &R2_GLOBALS._player, &_doorway, NULL);
			break;
		case 325:
			if (!R2_GLOBALS.getFlag(44) || R2_GLOBALS.getFlag(25))
				setAction(&_sequenceManager1, this, 307, &R2_GLOBALS._player, NULL);
			else {
				R2_GLOBALS.setFlag(60);
				R2_GLOBALS._player.setup(302, 3, 1);
				R2_GLOBALS._player.setPosition(Common::Point(271, 150));
				R2_GLOBALS._player.setAction(&_action1);

				if (R2_GLOBALS.getFlag(55)) {
					if (R2_GLOBALS.getFlag(57)) {
						// Little hack to get the correct sentence order
						R2_GLOBALS._stripManager_lookupList[8] = 2;

						R2_GLOBALS.clearFlag(60);
						R2_GLOBALS._events.setCursor(CURSOR_ARROW);
						_sceneMode = 16;
						_stripManager.start3(404, this, R2_GLOBALS._stripManager_lookupList);
					} else {
						R2_GLOBALS._player.enableControl();
						R2_GLOBALS._player._canWalk = false;
					}
				} else {
					if (R2_GLOBALS.getFlag(45)) {
						R2_GLOBALS.clearFlag(60);
						R2_GLOBALS._events.setCursor(CURSOR_ARROW);
						_sceneMode = 12;
						_stripManager.start3(204, this, R2_GLOBALS._stripManager_lookupList);
					} else {
						R2_GLOBALS._player.enableControl();
						R2_GLOBALS._player._canWalk = false;
					}
				}
			}
			break;
		case 1000:
			R2_GLOBALS.setFlag(60);
			R2_GLOBALS._player.setup(302, 3, 1);
			R2_GLOBALS._player.setPosition(Common::Point(271, 150));
			R2_GLOBALS._events.setCursor(CURSOR_ARROW);

			if (R2_GLOBALS.getFlag(51)) {
				// Things don't seem right
				_sceneMode = 13;
				_stripManager.start3(300, this, R2_GLOBALS._stripManager_lookupList);
			} else {
				// Back in Ringworld space
				_sceneMode = 11;
				_stripManager.start3(200, this, R2_GLOBALS._stripManager_lookupList);
			}
			break;

		case 1100:
			R2_GLOBALS._player.setVisage(10);
			R2_GLOBALS._player.setPosition(Common::Point(160, 95));
			_stripId = 400;
			_sceneMode = 309;
			setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL);
			break;

		case 1500:
			R2_GLOBALS.clearFlag(60);
			R2_GLOBALS._player.setup(302, 3, 1);
			R2_GLOBALS._player.setPosition(Common::Point(271, 150));
			_sceneMode = 17;
			R2_GLOBALS._events.setCursor(CURSOR_ARROW);
			_stripManager.start(413, this);
			break;

		default:
			if (R2_GLOBALS.getFlag(60)) {
				R2_GLOBALS._player.setup(302, 3, 1);
				R2_GLOBALS._player.setPosition(Common::Point(271, 150));
				R2_GLOBALS._player.setAction(&_action1);
				R2_GLOBALS._player.enableControl(CURSOR_USE);
				R2_GLOBALS._player._canWalk = false;
			} else {
				R2_GLOBALS._player.setStrip(3);
				R2_GLOBALS._player.setPosition(Common::Point(200, 150));
				R2_GLOBALS._player.enableControl();
			}
			break;
		}
		break;

	case R2_MIRANDA:
		if (R2_GLOBALS._sceneManager._previousScene == 1500) {
			R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
			R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
			R2_GLOBALS._player._effect = EFFECT_NONE;
			R2_GLOBALS._player.setAction(NULL);
			R2_GLOBALS._player.disableControl();

			_quinn.postInit();
			_quinn.setVisage(10);
			_quinn.setPosition(Common::Point(10, 10));
			_quinn.hide();

			_seeker.postInit();
			_seeker.setVisage(20);
			_seeker.setPosition(Common::Point(20, 20));
			_seeker.hide();

			_teal.postInit();
			_soldier.postInit();
			_object12.postInit();

			R2_GLOBALS._sound1.play(107);
			_sceneMode = 308;

			setAction(&_sequenceManager1, this, 308, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, &_doorway, NULL);
		}
		break;
	default:
		break;
	}
}

void Scene300::remove() {
	R2_GLOBALS._player.setAction(NULL);
	SceneExt::remove();
}

void Scene300::signal() {
	switch (_sceneMode) {
	case 10:
		switch (_stripManager._exitMode) {
		case 1:
			R2_GLOBALS._sound1.changeSound(10);
			R2_GLOBALS.setFlag(38);
			break;
		case 2:
			R2_GLOBALS.setFlag(3);
			break;
		case 3:
			R2_GLOBALS.setFlag(4);
			break;
		case 4:
			R2_GLOBALS.setFlag(13);
			if (R2_GLOBALS._stripManager_lookupList[1] == 6)
				R2_GLOBALS.setFlag(40);
			break;
		case 5:
			if (R2_GLOBALS._stripManager_lookupList[0] == 6)
				R2_GLOBALS.setFlag(40);
			break;
		case 6:
			if (g_vm->getFeatures() & GF_DEMO) {
				R2_GLOBALS.setFlag(85);
				R2_GLOBALS._sceneManager.changeScene(205);
			} else
				R2_GLOBALS._sceneManager.changeScene(1000);
			break;
		default:
			break;
		}

		_stripManager._currObj44Id = 0;
		switch (_stripId) {
		case 400:
			R2_GLOBALS._player.disableControl();
			_sceneMode = 15;
			setAction(&_sequenceManager1, this, 306, &R2_GLOBALS._player, NULL);
			break;
		case 181:
			R2_GLOBALS._player.setStrip(6);
			// Deliberate fall-through
		default:
			R2_GLOBALS._player.enableControl(CURSOR_TALK);

			if ((R2_GLOBALS._player._characterIndex != R2_QUINN) || R2_GLOBALS.getFlag(44))
				R2_GLOBALS._player._canWalk = false;
			break;
		}
		break;

	case 11:
		R2_GLOBALS.setFlag(44);
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		break;

	case 12:
		R2_GLOBALS._player.setAction(NULL);
		R2_GLOBALS._sceneManager.changeScene(1010);
		break;

	case 13:
		R2_GLOBALS._player.disableControl();
		_seeker.changeZoom(-1);
		_sceneMode = 313;
		_seeker.setAction(NULL);
		setAction(&_sequenceManager1, this, 313, &R2_GLOBALS._player, &_seeker, NULL);
		break;

	case 14:
		if (_seeker._action)
			R2_GLOBALS._player.disableControl();
		_sceneMode = 314;
		break;

	case 15:
		R2_GLOBALS.setFlag(55);
		R2_GLOBALS.setFlag(38);
		R2_GLOBALS.setFlag(44);
		R2_GLOBALS.setFlag(51);
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_sceneMode = 16;
		_stripManager.start3(401, this, R2_GLOBALS._stripManager_lookupList);
		break;

	case 16:
		if (_stripManager._exitMode == 1) {
			if (g_vm->getFeatures() & GF_DEMO) {
				R2_GLOBALS._player.setAction(NULL);
				R2_GLOBALS.setFlag(85);
				R2_GLOBALS._sceneManager.changeScene(205);
			} else {
				R2_GLOBALS._player.setAction(NULL);
				R2_GLOBALS._sceneManager.changeScene(1000);
			}
		} else {
			R2_GLOBALS._player.setAction(&_action1);
			R2_GLOBALS._player.enableControl(CURSOR_TALK);
		}
		break;

	case 17:
		R2_GLOBALS._player.disableControl();
		_sceneMode = 316;
		_seeker.changeZoom(-1);
		_seeker.setAction(&_sequenceManager3, this, 316, &_seeker, &_doorway, NULL);
		R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 307, &R2_GLOBALS._player, NULL);
		break;

	case 18:
		R2_GLOBALS._player.disableControl();
		_sceneMode = 317;
		setAction(&_sequenceManager1, this, 317, &_teal, &_doorway, NULL);
		break;

	case 19:
		R2_GLOBALS._player.disableControl();
		_sceneMode = 318;
		setAction(&_sequenceManager1, this, 318, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, NULL);
		break;

	case 20:
		R2_GLOBALS._player._characterIndex = R2_QUINN;
		R2_GLOBALS._sceneManager.changeScene(1500);
		break;

	case 300:
	case 307:
		R2_GLOBALS._player.enableControl();
		break;

	case 301:
		R2_GLOBALS._sceneManager.changeScene(250);
		break;

	case 306:
		R2_GLOBALS._sceneManager.changeScene(325);
		break;

	case 308:
		_sceneMode = 18;
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_stripManager.start(418, this);
		break;

	case 310:
		R2_GLOBALS._player.setStrip(5);
		// Deliberate fall-through
	case 309:
		signal309();
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		R2_GLOBALS._events._currentCursor = CURSOR_ARROW;

		_sceneMode = 10;
		_stripManager.start3(_stripId, this, R2_GLOBALS._stripManager_lookupList);
		break;

	case 313:
		_sceneMode = 14;
		R2_GLOBALS._player._effect = EFFECT_NONE;
		_seeker.setAction(&_sequenceManager3, this, 314, &_seeker, &_doorway, NULL);
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_stripManager.start(301, this);
		break;

	case 314:
		R2_GLOBALS._player.disableControl();
		_sceneMode = 315;
		R2_GLOBALS._player._effect = EFFECT_SHADED;
		setAction(&_sequenceManager1, this, 315, &R2_GLOBALS._player, &_doorway, NULL);
		break;

	case 315:
		R2_GLOBALS._sceneManager.changeScene(1100);
		break;

	case 316:
		R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;
		_seeker.remove();
		R2_GLOBALS._player.enableControl(CURSOR_WALK);
		break;

	case 317:
		_sceneMode = 19;
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_stripManager.start(419, this);
		break;

	case 318:
		_sceneMode = 20;
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_stripManager.start(420, this);
		break;

	default:
		break;
	}
}

void Scene300::signal309() {
	// Sets up what conversation items will be available when to talking to the
	// others on the Bridge, and will be set dependent on game flags
	if (R2_GLOBALS.getFlag(2))
		R2_GLOBALS._stripManager_lookupList[0] = (R2_INVENTORY.getObjectScene(R2_READER) == 1) ? 3 : 2;

	if (R2_GLOBALS.getFlag(4))
		R2_GLOBALS._stripManager_lookupList[0] = 4;

	if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1)
		R2_GLOBALS._stripManager_lookupList[0] = 5;

	if (R2_GLOBALS.getFlag(13)) {
		R2_GLOBALS._stripManager_lookupList[0] = 6;
		R2_GLOBALS._stripManager_lookupList[2] = 2;
	}

	if (R2_GLOBALS.getFlag(39))
		R2_GLOBALS._stripManager_lookupList[1] = 2;

	if (R2_GLOBALS.getFlag(5))
		R2_GLOBALS._stripManager_lookupList[1] = 3;

	if (R2_GLOBALS.getFlag(6))
		R2_GLOBALS._stripManager_lookupList[1] = 4;

	if (R2_GLOBALS.getFlag(8))
		R2_GLOBALS._stripManager_lookupList[1] = 5;

	if (R2_GLOBALS.getFlag(9)) {
		R2_GLOBALS._stripManager_lookupList[1] = 6;
		R2_GLOBALS._stripManager_lookupList[3] = 2;
	}

	if (R2_GLOBALS.getFlag(48))
		R2_GLOBALS._stripManager_lookupList[4] = 2;

	if (R2_GLOBALS.getFlag(49))
		R2_GLOBALS._stripManager_lookupList[4] = 3;
}

/*--------------------------------------------------------------------------
 * Scene 325 - Bridge Console
 *
 *--------------------------------------------------------------------------*/

const double ADJUST_FACTOR = 0.06419999999999999;

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

Scene325::Icon::Icon(): SceneActor()  {
	_lookLineNum = 0;
	_iconId = 0;
	_pressed = false;
}

void Scene325::Icon::postInit(SceneObjectList *OwnerList) {
	SceneObject::postInit();

	_glyph.postInit();
	_glyph.fixPriority(21);
	_glyph.hide();

	_sceneText1._color1 = 92;
	_sceneText1._color2 = 0;
	_sceneText1._width = 200;
	_sceneText2._color1 = 0;
	_sceneText2._color2 = 0;
	_sceneText2._width = 200;
	fixPriority(20);
}

void Scene325::Icon::synchronize(Serializer &s) {
	SceneActor::synchronize(s);
	s.syncAsSint16LE(_lookLineNum);
	s.syncAsSint16LE(_iconId);
	s.syncAsSint16LE(_pressed);
}

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

	if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) {

		if (event.eventType == EVENT_BUTTON_DOWN) {
			int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);

			switch (R2_GLOBALS._events.getCursor()) {
			case CURSOR_LOOK:
				if (regionIndex == _sceneRegionId) {
					event.handled = true;
					SceneItem::display2(326, _lookLineNum);
				}
				break;

			case CURSOR_USE:
				if ((regionIndex == _sceneRegionId) && !_pressed) {
					scene->_sound1.play(14);
					setFrame(2);

					switch (_glyph._strip) {
					case 1:
						_glyph.setStrip(2);
						break;
					case 3:
						_glyph.setStrip(4);
						break;
					case 5:
						_glyph.setStrip(6);
						break;
					case 7:
						_glyph.setStrip(8);
						break;
					default:
						break;
					}

					_pressed = true;
					event.handled = true;
				}
				break;

			default:
				break;
			}
		}

		if ((event.eventType == EVENT_BUTTON_UP) && _pressed) {
			setFrame(1);

			switch (_glyph._strip) {
			case 2:
				_glyph.setStrip(1);
				break;
			case 4:
				_glyph.setStrip(3);
				break;
			case 6:
				_glyph.setStrip(5);
				break;
			default:
				break;
			}

			_pressed = false;
			event.handled = true;
			scene->consoleAction(_lookLineNum);
		}
	}
}

void Scene325::Icon::setIcon(int id) {
	_lookLineNum = _iconId = id;
	SceneActor::_lookLineNum = id;

	_sceneText1.remove();
	_sceneText2.remove();

	if (_lookLineNum) {
		Scene325 *scene = (Scene325 *)R2_GLOBALS._sceneManager._scene;

		showIcon();
		_glyph.setup(325, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1);
		_glyph.setPosition(_position);

		_sceneText1._fontNumber = scene->_iconFontNumber;
		_sceneText1.setup(CONSOLE325_MESSAGES[id]);
		_sceneText1.fixPriority(20);

		_sceneText2._fontNumber = scene->_iconFontNumber;
		_sceneText2.setup(CONSOLE325_MESSAGES[id]);
		_sceneText2.fixPriority(20);

		_sceneText2._fontNumber = scene->_iconFontNumber;
		_sceneText2.setup(CONSOLE325_MESSAGES[id]);
		_sceneText2.fixPriority(10);

		switch (_lookLineNum) {
		case 7:
			_sceneText1.setPosition(Common::Point(62, _position.y + 8));
			_sceneText2.setPosition(Common::Point(64, _position.y + 10));
			break;
		case 8:
		case 9:
			_sceneText1.setPosition(Common::Point(65, _position.y + 8));
			_sceneText2.setPosition(Common::Point(67, _position.y + 10));
			break;
		case 12:
			_sceneText1.setPosition(Common::Point(83, _position.y + 8));
			_sceneText2.setPosition(Common::Point(85, _position.y + 10));
			break;
		default:
			_sceneText1.setPosition(Common::Point(121, _position.y + 8));
			_sceneText2.setPosition(Common::Point(123, _position.y + 10));
			break;
		}
	} else {
		hideIcon();
	}
}

void Scene325::Icon::showIcon() {
	_sceneText1.show();
	_sceneText2.show();
	_glyph.show();
	_horizLine.show();
	show();
}

void Scene325::Icon::hideIcon() {
	_sceneText1.hide();
	_sceneText2.hide();
	_glyph.hide();
	_horizLine.hide();
	hide();
}

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

Scene325::Scene325(): SceneExt() {
	_consoleAction = 7;
	_iconFontNumber = 50;
	_databasePage = _priorConsoleAction = 0;
	_moveCounter = _yChange = _yDirection = _scannerLocation = 0;
	_soundCount = _soundIndex = 0;

	for (int idx = 0; idx < 10; ++idx)
		_soundQueue[idx] = 0;
}

void Scene325::postInit(SceneObjectList *OwnerList) {
	loadScene(325);
	SceneExt::postInit();

	R2_GLOBALS.clearFlag(50);
	_stripManager.addSpeaker(&_quinnSpeaker);
	_palette.loadPalette(0);

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

	_terminal.setDetails(1, 325, 3, 4, 5);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 325, 0, 1, 2, 1, (SceneItem *)NULL);
	_sceneMode = 1;
	signal();
}

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

	s.syncAsSint16LE(_consoleAction);
	s.syncAsSint16LE(_iconFontNumber);
	s.syncAsSint16LE(_databasePage);
	s.syncAsSint16LE(_priorConsoleAction);
	s.syncAsSint16LE(_moveCounter);
	s.syncAsSint16LE(_yChange);
	s.syncAsSint16LE(_yDirection);
	s.syncAsSint16LE(_scannerLocation);
	s.syncAsSint16LE(_soundCount);
	s.syncAsSint16LE(_soundIndex);

	for (int idx = 0; idx < 10; ++idx)
		s.syncAsSint16LE(_soundQueue[idx]);
}

void Scene325::remove() {
	removeText();
	SceneExt::remove();
}

void Scene325::signal() {
	switch (_sceneMode - 1) {
	case 0:
		_icon1.postInit();
		_icon1._sceneRegionId = 2;
		_icon2.postInit();
		_icon2._sceneRegionId = 3;
		_icon3.postInit();
		_icon3._sceneRegionId = 4;
		_icon4.postInit();
		_icon4._sceneRegionId = 5;

		setAction(&_sequenceManager1, this, 127, &_icon1, &_icon2, &_icon3, &_icon4,
			&R2_GLOBALS._player, NULL);
		_sceneMode = 2;
		break;
	case 1:
		_icon1.setup(160, 1, 1);
		_icon1.setPosition(Common::Point(65, 17));
		_icon1._horizLine.postInit();
		_icon1._horizLine.setup(160, 7, 1);
		_icon1._horizLine.setPosition(Common::Point(106, 41));

		_icon2.setup(160, 1, 1);
		_icon2.setPosition(Common::Point(80, 32));
		_icon2._horizLine.postInit();
		_icon2._horizLine.setup(160, 7, 2);
		_icon2._horizLine.setPosition(Common::Point(106, 56));

		_icon3.setup(160, 1, 1);
		_icon3.setPosition(Common::Point(65, 47));
		_icon3._horizLine.postInit();
		_icon3._horizLine.setup(160, 7, 1);
		_icon3._horizLine.setPosition(Common::Point(106, 71));

		_icon4.setup(160, 1, 1);
		_icon4.setPosition(Common::Point(80, 62));
		_icon4._sceneRegionId = 5;
		_icon4._horizLine.postInit();
		_icon4._horizLine.setup(160, 7, 2);
		_icon4._horizLine.setPosition(Common::Point(106, 86));

		_icon5.postInit();
		_icon5.setup(160, 1, 1);
		_icon5._sceneRegionId = 7;
		_icon5.setPosition(Common::Point(37, 92));
		_icon5.setIcon(8);

		_icon6.postInit();
		_icon6.setup(160, 1, 1);
		_icon6.setPosition(Common::Point(106, 110));
		_icon6.setIcon(7);
		_icon6._sceneRegionId = 8;

		consoleAction(7);
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		R2_GLOBALS._player._canWalk = false;
		break;
	case 9:
		// Fade to black for console sub-section: database, or starchart
		switch (_consoleAction) {
		case 3:
			// Starchart
			_sceneMode = 129;
			_starGrid1.postInit();
			_starGrid2.postInit();
			_starGrid3.postInit();
			if (R2_GLOBALS.getFlag(13)) {
				// Show starchart with Ringworld present
				_starGrid4.postInit();
				setAction(&_sequenceManager1, this, 130, &R2_GLOBALS._player, &_starGrid1,
					&_starGrid2, &_starGrid3, &_starGrid4, NULL);
			} else {
				// Show starchart without Ringworld
				setAction(&_sequenceManager1, this, 129, &R2_GLOBALS._player, &_starGrid1,
					&_starGrid2, &_starGrid3, NULL);
			}
			break;
		case 17:
		case 18:
		case 19:
		case 20: {
			int v = 10 - ((21 - _consoleAction) * 2);
			if (R2_GLOBALS.getFlag(50))
				--v;
			if (_priorConsoleAction == 5)
				v += 8;

			if (R2_GLOBALS.getFlag(51) && (v == 2))
				R2_GLOBALS.setFlag(57);

			if (R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51)) {
				if (v != 13) {
					if (_priorConsoleAction == 6) {
					// Fix for original game bug.
					// The passive short scan geographical and astronomical sentences
					// are inverted in the original game.
						if (v == 6)
							v = 8;
						else if (v == 8)
							v = 6;
					}

					setMessage(328, v);
				} else {
					_scannerLocation = 864;

					_starGrid12.postInit();
					_starGrid12.setup(326, 4, 1);
					_starGrid12.setPosition(Common::Point(149, 128));
					_starGrid12.fixPriority(20);

					_starGrid13.postInit();
					_starGrid13.setup(326, 4, 2);
					_starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));
					_starGrid13.fixPriority(21);

					_starGrid10.postInit();
					_starGrid10.setup(326, 1, 1);
					_starGrid10.setPosition(Common::Point(210, 20));
					_starGrid10.fixPriority(10);

					_starGrid1.postInit();
					_starGrid1.setup(326, 1, 1);
					_starGrid1.setPosition(Common::Point(210, 32));
					_starGrid1.fixPriority(10);

					_starGrid2.postInit();
					_starGrid2.setup(326, 1, 1);
					_starGrid2.setPosition(Common::Point(210, 44));
					_starGrid2.fixPriority(10);

					_starGrid3.postInit();
					_starGrid3.setup(326, 1, 1);
					_starGrid3.setPosition(Common::Point(210, 56));
					_starGrid3.fixPriority(10);

					_starGrid4.postInit();
					_starGrid4.setup(326, 1, 1);
					_starGrid4.setPosition(Common::Point(210, 68));
					_starGrid4.fixPriority(10);

					_starGrid5.postInit();
					_starGrid5.setup(326, 1, 1);
					_starGrid5.setPosition(Common::Point(210, 80));
					_starGrid5.fixPriority(10);

					_starGrid6.postInit();
					_starGrid6.setup(326, 1, 1);
					_starGrid6.setPosition(Common::Point(210, 92));
					_starGrid6.fixPriority(10);

					_starGrid7.postInit();
					_starGrid7.setup(326, 1, 1);
					_starGrid7.setPosition(Common::Point(210, 104));
					_starGrid7.fixPriority(10);

					_starGrid8.postInit();
					_starGrid8.setup(326, 1, 1);
					_starGrid8.setPosition(Common::Point(210, 116));
					_starGrid8.fixPriority(10);

					_starGrid9.postInit();
					_starGrid9.setup(326, 1, 1);
					_starGrid9.setPosition(Common::Point(210, 128));
					_starGrid9.fixPriority(10);

					_starGrid11.postInit();
					_starGrid11.setup(326, 1, 1);
					_starGrid11.setPosition(Common::Point(210, 150));
					_starGrid11.fixPriority(10);
				}
			} else if (R2_GLOBALS.getFlag(51)) {
				setMessage(329, (v == 12) ? 10 : v);
			} else {
				setMessage(327, (v >= 15) ? 1 : v);
			}
			break;
		}
		case 21:
			_sceneMode = 129;

			_starGrid1.postInit();
			_starGrid1.setup(327, 1, 1);
			_starGrid1.setPosition(Common::Point(170, 80));
			_starGrid1.fixPriority(10);
			_starGrid1.animate(ANIM_MODE_5, NULL);
			break;
		case 22:
			_sceneMode = 129;

			_starGrid1.postInit();
			_starGrid1.setup(327, 2, 1);
			_starGrid1.setPosition(Common::Point(160, 80));
			_starGrid1.fixPriority(10);
			_starGrid1.animate(ANIM_MODE_5, NULL);
			break;
		case 24:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databasePage = 37;
			setMessage(128, _databasePage);
			break;
		case 25:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databasePage = 68;
			setMessage(128, _databasePage);
			break;
		case 26:
			R2_GLOBALS._player.enableControl();
			R2_GLOBALS._player._canWalk = false;
			_databasePage = 105;
			setMessage(128, _databasePage);
			break;
		default:
			_databasePage = 0;
			setMessage(128, _databasePage);
			break;
		}

		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	case 10:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;

		if ((_consoleAction >= 17) && (_consoleAction <= 20)) {
			_icon5.setIcon(8);
			consoleAction(4);
		} else {
			consoleAction(7);
		}

		_icon6.setIcon(7);
		break;
	case 11:
		R2_GLOBALS.setFlag(45);
		R2_GLOBALS._sceneManager.changeScene(300);
		break;
	case 12:
		R2_GLOBALS.setFlag(57);
		R2_GLOBALS._sceneManager.changeScene(300);
		break;
	case 14:
		if (_soundCount)
			--_soundCount;

		if (!_soundCount || !(R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
			_soundIndex = 0;
			R2_GLOBALS._playStream.stop();
		} else {
			_sceneMode = 15;
			R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
		}
		break;
	default:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	}
}

void Scene325::removeText() {
	_text1.remove();
	_soundCount = 0;
	_soundIndex = 0;
	R2_GLOBALS._playStream.stop();
}

void Scene325::consoleAction(int id) {
	_icon1.setIcon(0);
	_icon2.setIcon(0);
	_icon3.setIcon(0);
	_icon4.setIcon(0);

	if (id == 7)
		_icon5.setIcon(9);
	else if ((_consoleAction != 3) && ((_consoleAction < 17) || (_consoleAction > 26)))
		_icon5.setIcon(8);

	switch (id - 1) {
	case 0:
		_icon1.setIcon(10);
		_icon2.setIcon(11);
		break;
	case 1:
		// Database screen
		_icon1.setIcon(23);
		_icon2.setIcon(24);
		_icon3.setIcon(25);
		_icon4.setIcon(26);
		break;
	case 2:
	case 16:
	case 17:
	case 18:
	case 19:
	case 20:
	case 21:
		R2_GLOBALS._player.disableControl();
		consoleAction(7);
		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();

		if (id == 2 || (id == 19 && _priorConsoleAction == 5 && R2_GLOBALS.getFlag(50) &&
				R2_GLOBALS.getFlag(44) && !R2_GLOBALS.getFlag(51))) {
			_icon5.setIcon(13);
			_icon4.setPosition(Common::Point(52, 107));
			_icon4._sceneRegionId = 9;
			_icon4.setIcon(14);
			_icon4._horizLine.hide();

		} else {
			_icon4.hideIcon();
			_icon5.hideIcon();
		}

		_icon6.setIcon(12);
		_sceneMode = 10;
		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
		break;

	case 22:
	case 23:
	case 24:
	case 25:
		// Database sub-sections: A-G, N-O, P-S, T-Z
		R2_GLOBALS._player.disableControl();
		consoleAction(2);
		_consoleAction = id;
		_icon1.hideIcon();
		_icon2.hideIcon();
		_icon3.hideIcon();
		_icon4.hideIcon();

		_icon5.setIcon(13);
		_icon4.setPosition(Common::Point(52, 107));
		_icon4._sceneRegionId = 9;
		_icon4.setIcon(14);
		_icon4._horizLine.hide();

		_icon6.setIcon(12);
		_sceneMode = 10;
		_palette.loadPalette(161);
		R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
		break;

	case 11:
		if (R2_GLOBALS.getFlag(57) && (R2_GLOBALS._player._characterIndex == R2_QUINN) && !R2_GLOBALS.getFlag(25)) {
			R2_GLOBALS._player.disableControl();
			R2_GLOBALS._events.setCursor(CURSOR_ARROW);
			_sceneMode = 13;
			_stripManager.start(403, this);
		} else {
			R2_GLOBALS._player.disableControl();
			id = 8;
			_text1.remove();

			_icon4.setPosition(Common::Point(80, 62));
			_icon4._sceneRegionId = 5;
			_icon4.hideIcon();

			R2_GLOBALS._player.hide();
			_starGrid1.remove();
			_starGrid2.remove();
			_starGrid3.remove();
			_starGrid4.remove();
			_starGrid5.remove();
			_starGrid6.remove();
			_starGrid7.remove();
			_starGrid8.remove();
			_starGrid9.remove();
			_starGrid10.remove();
			_starGrid11.remove();
			_starGrid12.remove();
			_starGrid13.remove();

			_palette.loadPalette(160);
			_sceneMode = 11;

			R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
		}
		break;

	case 3:
		_icon1.setIcon(5);
		_icon2.setIcon(6);
		_icon3.setIcon(R2_GLOBALS.getFlag(50) ? 16 : 15);
		break;
	case 4:
	case 5:
		_priorConsoleAction = id;
		_icon1.setIcon(17);
		_icon2.setIcon(18);
		_icon3.setIcon(19);
		_icon4.setIcon(20);
		break;
	case 7:
		consoleAction(((_consoleAction == 5) || (_consoleAction == 6) || (_consoleAction == 15)) ? 4 : 7);
		break;
	case 8:
		R2_GLOBALS._sceneManager.changeScene(300);
		break;
	case 9:
	case 10:
		// Set language: Interworld or Hero's Tongue
		_iconFontNumber = (id - 1) == 9 ? 50 : 52;
		_text1.remove();
		_icon6.setIcon(7);
		consoleAction(1);
		break;
	case 12:
		// Page up button
		_icon4.setIcon(14);
		_icon4._horizLine.hide();

		switch (_consoleAction) {
		case 17:
		case 18:
		case 19:
		case 20:
			if (_scannerLocation) {
				R2_GLOBALS._player.disableControl();
				_moveCounter = 1296;
				_yDirection = 1;
			}
			break;
		default:
			setMessage(128, --_databasePage);
			break;
		}
		return;
	case 13:
		// Page down button
		_icon4.setIcon(14);
		_icon4._horizLine.hide();

		switch (_consoleAction) {
		case 17:
		case 18:
		case 19:
		case 20:
			if (_scannerLocation < 1620) {
				R2_GLOBALS._player.disableControl();
				_moveCounter = 1296;
				_yDirection = -1;
			}
			break;
		default:
			setMessage(128, ++_databasePage);
			break;
		}
		return;
	case 14:
		if (R2_GLOBALS.getFlag(55)) {
			consoleAction(4);
			// Workaround for original game bug.
			// Empty message crashing the game. It should be a warning message forbidding to switch to active scan
			// SceneItem::display2(329, 17);
		} else {
			R2_GLOBALS.setFlag(50);
			consoleAction(4);
		}
		id = 4;
		break;
	case 15:
		R2_GLOBALS.clearFlag(50);
		consoleAction(4);
		id = 4;
		break;
	case 6:
	default:
		// Initial starting screen
		_icon1.setIcon(1);
		_icon2.setIcon(2);
		_icon3.setIcon(3);
		int idList[3] = { 4, 22, 21 };
		_icon4.setIcon(idList[R2_GLOBALS._player._characterIndex - 1]);
		break;
	}

	if (id != 8)
		_consoleAction = id;
}

void Scene325::process(Event &event) {
	SceneExt::process(event);

	if (R2_GLOBALS._player._uiEnabled) {
		_icon1.process(event);
		_icon2.process(event);
		_icon3.process(event);
		_icon4.process(event);
		_icon5.process(event);
		_icon6.process(event);
	}
}

void Scene325::dispatch() {
	if (_moveCounter) {
		switch (_moveCounter) {
		case 13:
			_yChange = 1;
			break;
		case 1296:
			R2_GLOBALS._sound3.play(87);
			_yChange = 1;
			break;
		case 33:
		case 1283:
			_yChange = 2;
			break;
		case 63:
		case 1263:
			_yChange = 3;
			break;
		case 103:
		case 1233:
			_yChange = 4;
			break;
		case 153:
		case 1193:
			_yChange = 5;
			break;
		case 213:
		case 1143:
			_yChange = 6;
			break;
		case 283:
		case 1083:
			_yChange = 7;
			break;
		case 1013:
			_yChange = 8;
			break;
		default:
			break;
		}

		_moveCounter -= _yChange;
		int yp = _yDirection * _yChange + _starGrid10._position.y;
		bool flag = false;

		if (yp >= 30) {
			yp -= 12;
			--_scannerLocation;
			flag = true;
		}
		if (yp <= 10) {
			yp += 12;
			++_scannerLocation;
			flag = true;
		}
		_starGrid13.setPosition(Common::Point(149, 22 + (int)(_scannerLocation * ADJUST_FACTOR)));

		for (int idx = 0; idx < 4; ++idx)
			_objList[idx].remove();

		if (flag) {
			int v = _scannerLocation - 758;
			_starGrid10.setFrame((v++ <= 0) ? 1 : v);
			_starGrid1.setFrame((v++ <= 0) ? 1 : v);
			_starGrid2.setFrame((v++ <= 0) ? 1 : v);
			_starGrid3.setFrame((v++ <= 0) ? 1 : v);
			_starGrid4.setFrame((v++ <= 0) ? 1 : v);
			_starGrid5.setFrame((v++ <= 0) ? 1 : v);
			_starGrid6.setFrame((v++ <= 0) ? 1 : v);
			_starGrid7.setFrame((v++ <= 0) ? 1 : v);
			_starGrid8.setFrame((v++ <= 0) ? 1 : v);
			_starGrid9.setFrame((v++ <= 0) ? 1 : v);
			_starGrid11.setFrame((v++ <= 0) ? 1 : v);
		}

		_starGrid10.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid1.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid2.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid3.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid4.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid5.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid6.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid7.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid8.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid9.setPosition(Common::Point(210, yp));
		yp += 12;
		_starGrid11.setPosition(Common::Point(210, yp));

		if (!_moveCounter) {
			R2_GLOBALS._sound3.stop();
			_yChange = 0;

			if (_scannerLocation == 756) {
				R2_GLOBALS._player.disableControl();
				R2_GLOBALS._events.setCursor(CURSOR_USE);
				_sceneMode = 12;
				_stripManager.start(212, this);
			} else {
				R2_GLOBALS._player.enableControl();
				R2_GLOBALS._player._canWalk = false;
			}
		}
	}

	SceneExt::dispatch();
}

void Scene325::setMessage(int resNum, int lineNum) {
	removeText();
	Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true);

	if (!msg.empty()) {
		// Found valid database entry to display
		Common::String msgText = parseMessage(msg);

		_text1._fontNumber = _iconFontNumber;
		_text1._color1 = 92;
		_text1._color2 = 0;
		_text1._width = 221;
		_text1.fixPriority(20);
		_text1.setup(msgText);
		_text1.setPosition(Common::Point(49, 19));

		R2_GLOBALS._sceneObjects->draw();

		if ((_soundCount != 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) {
			_sceneMode = 15;
			R2_GLOBALS._playStream.play(_soundQueue[_soundIndex++], this);
		}
	} else {
		// No message for given database index, so we must have passed beyond
		// the start or end of the database
		_consoleAction = 13;
		R2_GLOBALS._player.disableControl();
		R2_GLOBALS._player.hide();

		_icon4.setPosition(Common::Point(80, 62));
		_icon4._sceneRegionId = 5;
		_icon4.hideIcon();

		_palette.loadPalette(160);
		_sceneMode = 11;
		R2_GLOBALS._scenePalette.addFader(&_palette._palette[0], 256, 5, this);
	}
}

/**
 * Parses a message to be displayed on the console to see whether there are any sounds to be played.
 */
Common::String Scene325::parseMessage(const Common::String &msg) {
	_soundIndex = 0;
	_soundCount = 0;

	const char *msgP = msg.c_str();
	while (*msgP == '!') {
		// Get the sound number
		_soundQueue[_soundCount++] = atoi(++msgP);

		while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9')))
			++msgP;
	}

	return Common::String(msgP);
}

/*--------------------------------------------------------------------------
 * Scene 400 - Science Lab
 *
 *--------------------------------------------------------------------------*/

bool Scene400::Terminal::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 402;
		scene->setAction(&scene->_sequenceManager1, scene, 402, &R2_GLOBALS._player, this, NULL);

		return true;
	} else {
		return NamedHotspot::startAction(action, event);
	}
}

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

bool Scene400::Door::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 401;
		scene->setAction(&scene->_sequenceManager1, scene, 401, &R2_GLOBALS._player, this, NULL);

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene400::Reader::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 405;
		scene->setAction(&scene->_sequenceManager1, scene, 405, &R2_GLOBALS._player, this, NULL);

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene400::SensorProbe::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 404;
		scene->setAction(&scene->_sequenceManager1, scene, 404, &R2_GLOBALS._player, this, NULL);

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene400::AttractorUnit::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene400 *scene = (Scene400 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 406;
		scene->setAction(&scene->_sequenceManager1, scene, 406, &R2_GLOBALS._player, this, NULL);

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

void Scene400::postInit(SceneObjectList *OwnerList) {
	loadScene(400);
	SceneExt::postInit();

	_sound1.play(20);

	_door.postInit();
	_door.setVisage(100);
	_door.setPosition(Common::Point(123, 84));
	_door.setDetails(400, 24, -1, 26, 1, (SceneItem *)NULL);

	_consoleDisplay.postInit();
	_consoleDisplay.setup(400, 4, 1);
	_consoleDisplay.setPosition(Common::Point(236, 92));
	_consoleDisplay.fixPriority(120);
	_consoleDisplay.animate(ANIM_MODE_2, NULL);
	_consoleDisplay._numFrames = 5;

	_testerDisplay.postInit();
	_testerDisplay.setup(400, 2, 1);
	_testerDisplay.setPosition(Common::Point(198, 83));
	_testerDisplay.animate(ANIM_MODE_2, NULL);
	_testerDisplay._numFrames = 20;

	if (R2_INVENTORY.getObjectScene(R2_READER) == 400) {
		_reader.postInit();
		_reader.setup(400, 5, 2);
		_reader.setPosition(Common::Point(301, 95));
		_reader.setDetails(400, 54, -1, 56, 1, (SceneItem *)NULL);
	}

	if (R2_INVENTORY.getObjectScene(R2_SENSOR_PROBE) == 400) {
		_sensorProbe.postInit();
		_sensorProbe.setup(400, 5, 1);
		_sensorProbe.setPosition(Common::Point(251, 104));
		_sensorProbe.fixPriority(121);
		_sensorProbe.setDetails(400, 57, -1, 59, 1, (SceneItem *)NULL);
	}

	if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 400) {
		_attractorUnit.postInit();
		_attractorUnit.setup(400, 5, 3);
		_attractorUnit.setPosition(Common::Point(265, 129));
		_attractorUnit.setDetails(400, 60, -1, 62, 1, (SceneItem *)NULL);
	}

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_equipment1.setDetails(11, 400, 3, -1, -1);
	_equipment2.setDetails(24, 400, 3, -1, -1);
	_equipment3.setDetails(25, 400, 3, -1, -1);
	_equipment4.setDetails(26, 400, 3, -1, -1);
	_equipment5.setDetails(28, 400, 3, -1, -1);
	_equipment6.setDetails(29, 400, 3, -1, -1);
	_desk.setDetails(12, 400, 6, -1, -1);
	_desk2.setDetails(27, 400, 6, -1, -1);
	_terminal.setDetails(13, 400, 6, -1, 11);
	_duct.setDetails(14, 400, 12, -1, -1);
	_console.setDetails(15, 400, 15, -1, 17);
	_equalizer.setDetails(Rect(284, 99, 308, 108), 400, 36, -1, 38, 1, NULL);
	_transducer.setDetails(Rect(295, 67, 314, 79), 400, 39, -1, 41, 1, NULL);
	_optimizer.setDetails(Rect(308, 106, 315, 113), 400, 42, -1, 44, 1, NULL);
	_soundModule.setDetails(Rect(291, 118, 315, 131), 400, 45, -1, 47, 1, NULL);
	_tester.setDetails(Rect(179, 62, 217, 92), 400, 30, -1, 32, 1, NULL);
	_helmet.setDetails(Rect(181, 53, 197, 65), 400, 48, -1, 50, 1, NULL);
	_nullifier.setDetails(Rect(201, 56, 212, 65), 400, 51, -1, 50, 1, NULL);
	_shelves.setDetails(16, 400, 18, -1, 20);
	_cabinet.setDetails(17, 400, 21, -1, -1);
	_doorDisplay.setDetails(Rect(161, 43, 166, 52), 400, 27, -1, -1, 1, NULL);
	_lights.setDetails(Rect(113, 3, 168, 14), 400, 33, -1, -1, 1, NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 400, 0, 1, -1, 1, NULL);

	_sceneMode = 400;
	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 125:
		setAction(&_sequenceManager1, this, 403, &R2_GLOBALS._player, NULL);
		break;
	case 200:
		setAction(&_sequenceManager1, this, 400, &R2_GLOBALS._player, &_door, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(180, 100));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

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

void Scene400::signal() {
	switch (_sceneMode) {
	case 400:
	case 403:
		R2_GLOBALS._player.enableControl();
		break;
	case 401:
		R2_GLOBALS._sceneManager.changeScene(200);
		break;
	case 402:
		R2_GLOBALS._sceneManager.changeScene(125);
		break;
	case 404:
		// Getting the sensor probe
		R2_INVENTORY.setObjectScene(R2_SENSOR_PROBE, 1);
		_sensorProbe.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 405:
		// Getting the reader
		R2_INVENTORY.setObjectScene(R2_READER, 1);
		_reader.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 406:
		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 1);
		_attractorUnit.remove();
		R2_GLOBALS._player.enableControl();
		break;
	default:
		break;
	}
}

void Scene400::dispatch() {
	SceneExt::dispatch();

	switch (R2_GLOBALS._player.getRegionIndex() - 15) {
	case 0:
	case 11:
	case 12:
		R2_GLOBALS._player._shade = 2;
		break;
	case 9:
		R2_GLOBALS._player._shade = 0;
		break;
	case 10:
		R2_GLOBALS._player._shade = 1;
		break;
	case 13:
		R2_GLOBALS._player._shade = 3;
		break;
	case 14:
		R2_GLOBALS._player._shade = 4;
		break;
	default:
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 500 - Lander Bay 2 Storage
 *
 *--------------------------------------------------------------------------*/

Scene500::PanelDialog::Button::Button() {
	_buttonId = 0;
	_buttonDown = false;
}

bool Scene500::ControlPanel::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS.getFlag(26)) {
			scene->_stripNumber = 1104;
			scene->_sceneMode = 524;
			scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
		} else {
			scene->_sceneMode = 510;
			scene->setAction(&scene->_sequenceManager1, scene, 510, &R2_GLOBALS._player, NULL);
		}
		return true;
	} else {
		return SceneHotspot::startAction(action, event);
	}
}

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

bool Scene500::Seeker::startAction(CursorType action, Event &event) {
	if (action == CURSOR_TALK) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1101 : 1103;
		} else {
			scene->_stripNumber = R2_GLOBALS.getFlag(26) ? 1102 : 1105;
		}

		scene->_sceneMode = 524;
		scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

	switch (action) {
	case CURSOR_LOOK:
		SceneItem::display2(500, R2_GLOBALS.getFlag(28) ? 28 : _strip + 25);
		return true;

	case CURSOR_USE:
		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			if ((_strip != 3) && (_strip != 7))
				SceneItem::display2(500, _strip + 25);
			else if (R2_GLOBALS.getFlag(26)) {
				R2_GLOBALS._player.disableControl();
				scene->_stripNumber = 1103;
				scene->_sceneMode = 524;
				scene->setAction(&scene->_sequenceManager1, scene, 512, &R2_GLOBALS._player, NULL);
			} else if (!R2_GLOBALS.getFlag(28))
				SceneItem::display2(500, 41);
			else if (!R2_GLOBALS.getFlag(25))
				SceneItem::display2(500, 40);
			else {
				R2_GLOBALS._player.disableControl();
				scene->_sceneMode = 512;
				scene->setAction(&scene->_sequenceManager1, scene, 512, &R2_GLOBALS._player, &scene->_suit, NULL);
				R2_GLOBALS.setFlag(26);
			}
		} else {
			SceneItem::display2(500, 42);
		}
		return true;

	case R2_REBREATHER_TANK:
		if (!R2_GLOBALS.getFlag(25))
			SceneItem::display2(500, 10);
		else if (_strip != 3)
			SceneItem::display2(500, _strip + 25);
		else {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 515;
			scene->setAction(&scene->_sequenceManager1, scene, 515, &R2_GLOBALS._player, &scene->_suit, NULL);
			R2_GLOBALS.setFlag(28);
		}
		return true;

	case R2_RESERVE_REBREATHER_TANK:
		SceneItem::display2(500, 53);
		return true;

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

bool Scene500::Doorway::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS.getFlag(26)) {
			scene->_stripNumber = 1104;
			scene->_sceneMode = 524;
			scene->setAction(&scene->_sequenceManager1, scene, 524, &R2_GLOBALS._player, NULL);
		} else {
			scene->_sceneMode = 500;
			scene->setAction(&scene->_sequenceManager1, scene, 500, &R2_GLOBALS._player, this, NULL);
		}

		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene500::OxygenTanks::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_LOOK:
		SceneItem::display2(500, R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) ? 50 : 49);
		return true;

	case CURSOR_USE:
		if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
			SceneItem::display2(500, 52);
			return true;
		} else if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) != 1) &&
				(R2_GLOBALS._player._characterIndex != R2_SEEKER) && !R2_GLOBALS.getFlag(28)) {
			Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

			R2_GLOBALS._player.disableControl();

			if (_position.y == 120) {
				scene->_sceneMode = 513;
				scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
					&scene->_tanks1, NULL);
			} else {
				scene->_sceneMode = 514;
				scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
					&scene->_tanks2, NULL);
			}
			return true;
		}
		break;

	default:
		break;
	}

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

bool Scene500::AirLock::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && R2_GLOBALS.getFlag(26)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = (R2_GLOBALS._player._characterIndex == R2_QUINN) ? 521 : 522;
		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
			&scene->_seeker, &scene->_airLock, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

void Scene500::TransparentDoor::draw() {
	// Determine the area of the screen to be updated
	Rect destRect = _bounds;
	destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
		-g_globals->_sceneManager._scene->_sceneBounds.top);

	// Get the frame to be drawn
	GfxSurface frame = getFrame();

	Graphics::Surface s = frame.lockSurface();
	Graphics::Surface screen = g_globals->gfxManager().getSurface().lockSurface();

	for (int yp = 0; yp < s.h; ++yp) {
		byte *frameSrcP = (byte *)s.getBasePtr(0, yp);
		byte *screenP = (byte *)screen.getBasePtr(destRect.left, destRect.top + yp);

		for (int xp = 0; xp < s.w; ++xp, ++frameSrcP, ++screenP) {
			if (*frameSrcP != frame._transColor && *frameSrcP < 6) {
				*frameSrcP = R2_GLOBALS._fadePaletteMap[*frameSrcP][*screenP];
			}
		}
	}

	// Finished updating the frame
	frame.unlockSurface();
	g_globals->gfxManager().getSurface().unlockSurface();

	// Draw the processed frame
	Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
	g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);

}

bool Scene500::Aerosol::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 503;
		scene->setAction(&scene->_sequenceManager1, scene, 503, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene500::SonicStunner::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 520 : 502;
		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene500::Locker1::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS.getFlag(11))
			scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 517 : 505;
		else
			scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 516 : 504;

		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

bool Scene500::Locker2::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == R2_QUINN)) {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();

		if (R2_GLOBALS.getFlag(12))
			scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 519 : 507;
		else
			scene->_sceneMode = R2_GLOBALS.getFlag(26) ? 518 : 506;

		scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, this, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

void Scene500::PanelDialog::setDetails(int visage, int strip, int frameNumber,
		const Common::Point &pt) {
	SceneAreaObject::setDetails(visage, strip, frameNumber, pt);
	SceneAreaObject::setDetails(500, 43, 32, 45);

	_button1.setupButton(1);
	_button2.setupButton(2);
	_button3.setupButton(3);
}

void Scene500::PanelDialog::remove() {
	Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
	scene->_sceneAreas.remove(&_button1);
	scene->_sceneAreas.remove(&_button2);
	scene->_sceneAreas.remove(&_button3);

	_button1.remove();
	_button2.remove();
	_button3.remove();

	SceneAreaObject::remove();

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 511;
	scene->setAction(&scene->_sequenceManager1, scene, 511, &R2_GLOBALS._player, NULL);
}

bool Scene500::PanelDialog::Button::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE) {
		return false;
	} else {
		return SceneActor::startAction(action, event);
	}
}

void Scene500::PanelDialog::Button::setupButton(int buttonId) {
	_buttonId = buttonId;
	_buttonDown = false;
	SceneActor::postInit();
	setup(500, 7, 1);
	fixPriority(251);

	switch (_buttonId) {
	case 1:
		setPosition(Common::Point(139, 78));
		break;
	case 2:
		setPosition(Common::Point(139, 96));
		break;
	case 3:
		setPosition(Common::Point(139, 114));
		break;
	default:
		break;
	}

	Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;
	scene->_sceneAreas.push_front(this);
}

void Scene500::PanelDialog::Button::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_buttonId);
	s.syncAsSint16LE(_buttonDown);
}

void Scene500::PanelDialog::Button::process(Event &event) {
	if ((event.eventType == EVENT_BUTTON_DOWN) &&
			(R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
			_bounds.contains(event.mousePos) && !_buttonDown) {
		_buttonDown = true;
		event.handled = true;
		setFrame(2);
	}

	if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
		setFrame(1);
		_buttonDown = false;
		event.handled = true;

		doButtonPress();
	}
}

void Scene500::PanelDialog::Button::doButtonPress() {
	if (R2_GLOBALS.getFlag(28)) {
		SceneItem::display2(500, 48);
	} else {
		Scene500 *scene = (Scene500 *)R2_GLOBALS._sceneManager._scene;

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

		switch (_buttonId) {
		case 1:
			// Rotate Left
			if (--R2_GLOBALS._landerSuitNumber == 0)
				R2_GLOBALS._landerSuitNumber = R2_MIRANDA;

			if (R2_GLOBALS.getFlag(35)) {
				scene->_sceneMode = 5;
				scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
					&scene->_suit, &scene->_transparentDoor, NULL);
			} else {
				scene->_sound1.play(127);
				scene->_suits.animate(ANIM_MODE_6, scene);
			}
			break;

		case 2:
			// Rotate Right
			if (++R2_GLOBALS._landerSuitNumber == 4)
				R2_GLOBALS._landerSuitNumber = R2_QUINN;

			if (R2_GLOBALS.getFlag(35)) {
				scene->_sceneMode = 6;
				scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
					&scene->_suit, &scene->_transparentDoor, NULL);
			} else {
				scene->_sound1.play(127);
				scene->_suits.animate(ANIM_MODE_5, scene);
			}
			break;

		case 3:
			if (R2_GLOBALS.getFlag(35)) {
				scene->_sceneMode = 509;
				scene->setAction(&scene->_sequenceManager1, scene, 509, &scene->_suits,
					&scene->_suit, &scene->_transparentDoor, NULL);
			} else {
				scene->_suit.postInit();
				scene->_suit.hide();
				scene->_suit._effect = EFFECT_SHADED;
				scene->_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);
				scene->_suit.setup(502, R2_GLOBALS._landerSuitNumber + 2, 1);

				scene->setAction(&scene->_sequenceManager1, scene, 508,
					&R2_GLOBALS._player, &scene->_suits, &scene->_suit,
					&scene->_transparentDoor, NULL);
				R2_GLOBALS.setFlag(35);
			}
			break;

		default:
			break;
		}
	}
}

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

void Scene500::postInit(SceneObjectList *OwnerList) {
	loadScene(500);
	SceneExt::postInit();

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

	if (R2_GLOBALS.getFlag(25)) {
		R2_GLOBALS._player._characterScene[R2_SEEKER] = 500;

		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
			R2_GLOBALS._walkRegions.enableRegion(1);

			_seeker.postInit();
			_seeker._effect = EFFECT_SHADED;
			_seeker.setup(1505, 1, 1);
			_seeker._moveDiff.x = 5;
			_seeker.setPosition(Common::Point(42, 151));
			_seeker.setDetails(500, 34, 35, 36, 1, (SceneItem *)NULL);
		} else if (R2_GLOBALS._player._characterScene[R2_QUINN] == 500) {
			_seeker.postInit();
			_seeker._effect = EFFECT_SHADED;
			_seeker.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 1, 1);
			_seeker.setPosition(Common::Point(42, 151));

			R2_GLOBALS._walkRegions.enableRegion(1);
			R2_GLOBALS._walkRegions.enableRegion(2);
			R2_GLOBALS._walkRegions.enableRegion(3);

			_seeker.setDetails(500, 37, 38, -1, 1, (SceneItem *)NULL);
		}
	}

	if ((R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 500) && R2_GLOBALS.getFlag(27)) {
		_tanks1.postInit();
		_tanks1.setup(502, 7, 1);
		_tanks1.setPosition(Common::Point(281, 120));
		_tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
	} else {
		if (R2_INVENTORY.getObjectScene(R2_REBREATHER_TANK) == 500) {
			_tanks1.postInit();
			_tanks1.setup(502, 7, 1);
			_tanks1.setPosition(Common::Point(281, 120));
			_tanks1.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
		}

		_tanks2.postInit();
		_tanks2.setup(502, 7, 1);
		_tanks2.setPosition(Common::Point(286, 121));
		_tanks2.setDetails(500, -1, -1, -1, 1, (SceneItem *)NULL);
	}

	_doorway.postInit();
	_doorway.setup(501, 1, 1);
	_doorway.setPosition(Common::Point(132, 85));
	_doorway.setDetails(500, 15, -1, 17, 1, (SceneItem *)NULL);

	_airLock.postInit();
	_airLock.setup(501, 2, 1);
	_airLock.setPosition(Common::Point(41, 121));

	if (!R2_GLOBALS.getFlag(25))
		_airLock.setDetails(500, 6, -1, 10, 1, (SceneItem *)NULL);
	else if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 500) ||
			(R2_GLOBALS._player._characterScene[R2_SEEKER] != 500))
		_airLock.setDetails(500, 6, -1, 40, 1, (SceneItem *)NULL);
	else
		_airLock.setDetails(500, 6, -1, 9, 1, (SceneItem *)NULL);

	_locker1.postInit();
	_locker1.setup(500, 3, R2_GLOBALS.getFlag(11) ? 6 : 1);
	_locker1.setPosition(Common::Point(220, 82));
	_locker1.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);

	_locker2.postInit();
	_locker2.setup(500, 4, R2_GLOBALS.getFlag(12) ? 6 : 1);
	_locker2.setPosition(Common::Point(291, 98));
	_locker2.fixPriority(121);
	_locker2.setDetails(500, 27, -1, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_AEROSOL) == 500) {
		_aerosol.postInit();
		_aerosol.setup(500, 5, 2);
		_aerosol.setPosition(Common::Point(286, 91));
		_aerosol.fixPriority(120);
		_aerosol.setDetails(500, 24, 25, 26, 1, (SceneItem *)NULL);
	}

	if (R2_INVENTORY.getObjectScene(R2_SONIC_STUNNER) == 500) {
		_sonicStunner.postInit();
		_sonicStunner.setup(500, 5, 1);
		_sonicStunner.setPosition(Common::Point(214, 76));
		_sonicStunner.setDetails(500, 21, 22, 23, 1, (SceneItem *)NULL);
	}

	_suits.postInit();
	_suits._effect = EFFECT_SHADED;
	_suits.setup(502, 1, 1);
	_suits.setPosition(Common::Point(258, 99));
	_suits.fixPriority(50);

	_transparentDoor.postInit();
	_transparentDoor.setPosition(Common::Point(250, 111));

	if (!R2_GLOBALS.getFlag(35)) {
		_transparentDoor.setup(501, 3, 1);
	} else {
		_transparentDoor.setup(500, 8, 7);

		_suit.postInit();
		_suit._effect = EFFECT_SHADED;
		_suit.setPosition(Common::Point(247, 52));
		_suit.setDetails(500, -1, -1, -1, 2, (SceneItem *)NULL);

		if (!R2_GLOBALS.getFlag(26)) {
			if (R2_GLOBALS.getFlag(28))
				_suit.setup(502, 7, 2);
			else
				_suit.setup(502, R2_GLOBALS._landerSuitNumber + 2, 7);
		}
	}

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	if (R2_GLOBALS._player._characterIndex == R2_SEEKER)
		R2_GLOBALS._player._moveDiff.x = 5;

	_controlPanel.setDetails(Rect(175, 62, 191, 80), 500, 31, 32, 33, 1, (SceneItem *)NULL);
	_airlockCorridor.setDetails(Rect(13, 58, 70, 118), 500, 12, -1, -1, 1, (SceneItem *)NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 500, 0, -1, -1, 1, (SceneItem *)NULL);

	if ((R2_GLOBALS._player._characterIndex == R2_QUINN) && (R2_GLOBALS._sceneManager._previousScene == 700)) {
		R2_GLOBALS._player.disableControl();
		_sceneMode = 501;
		setAction(&_sequenceManager1, this, 501, &R2_GLOBALS._player, &_doorway, NULL);
	} else {
		if (R2_GLOBALS._player._characterIndex != R2_QUINN) {
			R2_GLOBALS._player.setup(1505, 6, 1);
		} else {
			R2_GLOBALS._player.setup(R2_GLOBALS.getFlag(26) ? 1500 : 10, 6, 1);
		}

		R2_GLOBALS._player.setPosition(Common::Point(123, 135));
		R2_GLOBALS._player.enableControl();
	}
}

void Scene500::synchronize(Serializer &s) {
	SceneExt::synchronize(s);
	s.syncAsSint16LE(_stripNumber);
}

void Scene500::signal() {
	switch (_sceneMode) {
	case 3:
		R2_GLOBALS._player.enableControl();
		break;
	case 5:
		_sceneMode = 12;
		_sound1.play(127);
		_suits.animate(ANIM_MODE_6, this);

		R2_GLOBALS.clearFlag(35);
		_suit.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 6:
		_sceneMode = 11;
		_sound1.play(127);
		_suits.animate(ANIM_MODE_5, this);

		R2_GLOBALS.clearFlag(35);
		_suit.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 7:
		_sound1.play(126);
		_transparentDoor.animate(ANIM_MODE_6, this);

		R2_GLOBALS.clearFlag(35);
		_suit.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 500:
		R2_GLOBALS._sceneManager.changeScene(700);
		break;
	case 501:
		if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 500) {
			_stripNumber = 1100;
			_sceneMode = 523;
			setAction(&_sequenceManager1, this, 523, &R2_GLOBALS._player, NULL);
		} else {
			R2_GLOBALS._player.enableControl();
		}
		break;
	case 502:
	case 520:
		R2_INVENTORY.setObjectScene(R2_SONIC_STUNNER, 1);
		_sonicStunner.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 503:
		R2_INVENTORY.setObjectScene(R2_AEROSOL, 1);
		_aerosol.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 504:
	case 516:
		R2_GLOBALS.setFlag(11);
		R2_GLOBALS._player.enableControl();
		break;
	case 505:
	case 517:
		R2_GLOBALS.clearFlag(11);
		R2_GLOBALS._player.enableControl();
		break;
	case 506:
	case 518:
		R2_GLOBALS.setFlag(12);
		R2_GLOBALS._player.enableControl();
		break;
	case 507:
	case 519:
		R2_GLOBALS.clearFlag(12);
		R2_GLOBALS._player.enableControl();
		break;
	case 509:
		R2_GLOBALS.clearFlag(35);
		_suit.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 510:
		R2_GLOBALS._player.enableControl();
		_panelDialog.setDetails(500, 6, 1, Common::Point(160, 120));
		R2_GLOBALS._player.enableControl();
		break;
	case 513:
		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
		_tanks1.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 514:
		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 1);
		R2_GLOBALS.setFlag(27);
		_tanks2.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 515:
		R2_INVENTORY.setObjectScene(R2_REBREATHER_TANK, 0);
		R2_GLOBALS.setFlag(28);
		R2_GLOBALS._player.enableControl();
		break;
	case 521:
	case 522:
		R2_GLOBALS._sceneManager.changeScene(525);
		break;
	case 523:
	case 524:
		R2_GLOBALS._events.setCursor(CURSOR_ARROW);
		_sceneMode = 8;
		_stripManager.start(_stripNumber, this);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}


/*--------------------------------------------------------------------------
 * Scene 525 - Cutscene - Walking in hall
 *
 *--------------------------------------------------------------------------*/

void Scene525::postInit(SceneObjectList *OwnerList) {
	loadScene(525);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();

	R2_GLOBALS._sound1.play(105);

	_actor1.postInit();
	_actor1._effect = EFFECT_SHADED;

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

	setAction(&_sequenceManager, this, 525, &R2_GLOBALS._player, &_actor1, NULL);
}

void Scene525::signal() {
	R2_GLOBALS._sceneManager.changeScene(1525);
}

/*--------------------------------------------------------------------------
 * Scene 600 - Drive Room
 *
 *--------------------------------------------------------------------------*/

bool Scene600::CompartmentHotspot::startAction(CursorType action, Event &event) {
	if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(5)) || (R2_GLOBALS.getFlag(8)))
		return SceneHotspot::startAction(action, event);

	SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
		SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
	return true;
}

bool Scene600::EngineCompartment::startAction(CursorType action, Event &event) {
	if ((action != R2_NEGATOR_GUN) || (!R2_GLOBALS.getFlag(1)))
		return SceneHotspot::startAction(action, event);

	if ((R2_GLOBALS.getFlag(5)) && (!R2_GLOBALS.getFlag(8))) {
		SceneItem::display(600, 32, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
			SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
		return true;
	}

	if (!R2_GLOBALS.getFlag(5)) {
		SceneItem::display(600, 30, SET_WIDTH, 280, SET_X, 160, SET_POS_MODE, ALIGN_CENTER,
			SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
		return true;
	}

	if ((!R2_GLOBALS.getFlag(8)) || (R2_GLOBALS.getFlag(9)))
		return SceneHotspot::startAction(action, event);

	R2_GLOBALS._player.disableControl();

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

	scene->_stasisArea.setup(603, 3, 1, 239, 54, 10);
	scene->_stasisField.postInit();
	scene->_computer.postInit();

	scene->_sceneMode = 612;
	scene->setAction(&scene->_sequenceManager1, scene, 612, &scene->_stasisField, &scene->_computer, &R2_GLOBALS._player, NULL);

	// WORKAROUND: For ScummVM, we use a SceneActor rather than BackgroundSceneObject
	// for the stasis field since it doesn't work properly. We override the priority for
	// the stasis field here so that the stasis field dissolve will show up
	scene->_stasisField.fixPriority(12);

	return true;
}

void Scene600::Smoke::signal() {
	Common::Point pt(177 + R2_GLOBALS._randomSource.getRandomNumber(5),
		108 + R2_GLOBALS._randomSource.getRandomNumber(3));
	NpcMover *mover = new NpcMover();
	addMover(mover, &pt, this);
}

bool Scene600::Smoke::startAction(CursorType action, Event &event) {
	if (action >= CURSOR_WALK)
	// Only action cursors
		return SceneActor::startAction(action, event);

	return false;
}

void Scene600::Smoke::draw() {
	// Effect should always be active on smoke, but since the original had this
	// check, include it here too
	if (_effect == EFFECT_NONE) {
		SceneActor::draw();
		return;
	}

	// Determine the area of the screen to be updated
	Rect destRect = _bounds;
	destRect.translate(-g_globals->_sceneManager._scene->_sceneBounds.left,
		-g_globals->_sceneManager._scene->_sceneBounds.top);

	// Get the smoke frame, screen reference, and pixel palette translation map
	GfxSurface frame = getFrame();
	Graphics::Surface s = frame.lockSurface();
	Graphics::Surface screen = g_globals->gfxManager().getSurface().lockSurface();
	byte *pixelMap = static_cast<Scene600 *>(R2_GLOBALS._sceneManager._scene)->_pixelMap;

	// Loop through every pixel of the frame. Any pixel of the frame that's not a
	// tranparency, get the same pixel from the screen background, and shade it using
	// the scene's pixel translation map
	for (int yp = 0; yp < s.h; ++yp) {
		byte *frameSrcP = (byte *)s.getBasePtr(0, yp);
		byte *screenP = (byte *)screen.getBasePtr(destRect.left, destRect.top + yp);

		for (int xp = 0; xp < s.w; ++xp, ++frameSrcP, ++screenP) {
			if (*frameSrcP != frame._transColor) {
				*frameSrcP = pixelMap[*screenP];
			}
		}
	}

	// Finished updating the frame
	frame.unlockSurface();
	g_globals->gfxManager().getSurface().unlockSurface();

	// Draw the processed frame
	Region *priorityRegion = g_globals->_sceneManager._scene->_priorities.find(_priority);
	g_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);

}

bool Scene600::Doorway::startAction(CursorType action, Event &event) {
	// Only action cursors
	if (action < CURSOR_WALK)
		return false;

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

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

	if ((R2_INVENTORY.getObjectScene(R2_CLAMP) == 600) && (!R2_GLOBALS.getFlag(6))) {
		R2_GLOBALS._player.disableControl();
		scene->_laser.setDetails(600, 11, -1, -1, 3, (SceneItem *) NULL);
		R2_GLOBALS.setFlag(6);
		scene->_sceneMode = 609;
		scene->setAction(&scene->_sequenceManager1, scene, 609, &R2_GLOBALS._player, &scene->_doorway, &scene->_laser, &scene->_laserBeam, NULL);
		return true;
	}

	if (_frame != 1)
		return false;

	if (!R2_GLOBALS.getFlag(6)) {
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 616;
		scene->setAction(&scene->_sequenceManager1, scene, 616, &R2_GLOBALS._player, &scene->_doorway, &scene->_laser, NULL);
		return true;
	}

	if ((R2_GLOBALS.getFlag(9)) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600))
		SceneItem::display(600, 31, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
	else {
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 601;
		scene->setAction(&scene->_sequenceManager1, scene, 601, &R2_GLOBALS._player, &scene->_doorway, NULL);
	}
	return true;
}

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

	if (action < CURSOR_WALK) {
		switch (action) {
		case R2_COM_SCANNER:
			// If laser is destroyed
			if (R2_GLOBALS.getFlag(6)) {
				if (R2_GLOBALS.getFlag(8)) {
					SceneItem::display(600, 29, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
					return true;
				} else {
					R2_GLOBALS._player.disableControl();
					scene->_scanner.postInit();
					scene->_scanner.setDetails(600, 20, -1, -1, 4, &scene->_laser);
					scene->_sceneMode = 607;
					scene->setAction(&scene->_sequenceManager1, scene, 607, &R2_GLOBALS._player, &scene->_scanner, NULL);
					return true;
				}
			} else {
				return SceneActor::startAction(action, event);
			}
			break;
		case R2_AEROSOL:
			if (R2_GLOBALS.getFlag(5)) {
				SceneItem::display(600, 28, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
				return true;
			} else {
				R2_GLOBALS._player.disableControl();
				scene->_aerosol.postInit();
				scene->_aerosol.setDetails(600, 27, -1, -1, 5, &scene->_laser);

				scene->_smoke.postInit();
				scene->_smoke.setup(601, 3, 1);
				scene->_smoke._effect = EFFECT_SMOKE;
				scene->_smoke._moveDiff = Common::Point(1, 1);
				scene->_smoke._moveRate = 2;
				scene->_smoke._numFrames = 3;
				scene->_smoke.setDetails(600, 24, 25, 26, 5, &scene->_aerosol);

				scene->_sceneMode = 605;

				scene->setAction(&scene->_sequenceManager1, scene, 605, &R2_GLOBALS._player, &scene->_aerosol, &scene->_smoke, &scene->_doorway, NULL);
				return true;
			}
			break;
		case R2_CLAMP:
			// If cloud is active
			if (R2_GLOBALS.getFlag(5)) {
				R2_GLOBALS._player.disableControl();
				scene->_sceneMode = 606;
				scene->setAction(&scene->_sequenceManager1, scene, 606, &R2_GLOBALS._player, &scene->_laser, NULL);
				return true;
			} else {
				return SceneActor::startAction(action, event);
			}
			break;
		default:
			return false;
			break;
		}
	} else if (action == CURSOR_USE) {
		if (R2_GLOBALS.getFlag(5)) {
			return SceneActor::startAction(action, event);
		} else {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 610;
			scene->setAction(&scene->_sequenceManager1, scene, 610, &scene->_laserBeam, &R2_GLOBALS._player, NULL);
			return true;
		}
	} else
		return SceneActor::startAction(action, event);
}

bool Scene600::Aerosol::startAction(CursorType action, Event &event) {
	// Only action cursors
	if (action < CURSOR_WALK)
		return false;

	if (action == CURSOR_USE) {
		Scene600 *scene = (Scene600 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 614;
		scene->setAction(&scene->_sequenceManager1, scene, 614, &R2_GLOBALS._player, &scene->_aerosol, NULL);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

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

Scene600::Scene600() {
	_roomState = 0;
	Common::fill(&_pixelMap[0], &_pixelMap[256], 0);
}

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

	s.syncAsSint16LE(_roomState);
	for (int i = 0; i < 256; i++)
		s.syncAsByte(_pixelMap[i]);
}

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

	if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600)) {
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 615;
		scene->setAction(&scene->_sequenceManager1, scene, 615, &R2_GLOBALS._player, &scene->_scanner, NULL);
	} else if ((action == R2_SONIC_STUNNER) && (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600) && (R2_GLOBALS._scannerFrequencies[1] == 2) && (!R2_GLOBALS.getFlag(8))){
		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 608;
		scene->setAction(&scene->_sequenceManager1, scene, 608, &R2_GLOBALS._player, &scene->_smoke, NULL);
	} else {
		return SceneActor::startAction(action, event);
	}

	return true;
}

void Scene600::postInit(SceneObjectList *OwnerList) {
	loadScene(600);
	SceneExt::postInit();
	R2_GLOBALS.setFlag(39);
	R2_GLOBALS._walkRegions.disableRegion(3);
	_roomState = 0;

	// Initialize pixel map for the obscuring effect
	ScenePalette &pal = R2_GLOBALS._scenePalette;
	uint r, g, b;
	for (int i = 0; i < 256; ++i) {
		pal.getEntry(i, &r, &g, &b);
		int av = ((r + g + b) / 48);

		_pixelMap[i] = R2_GLOBALS._paletteMap[(av << 8) | (av << 4) | av];
	}

	_doorway.postInit();
	_doorway.setVisage(600);
	_doorway.setPosition(Common::Point(29, 147));
	_doorway.fixPriority(10);
	_doorway.setDetails(300, 3, -1, -1, 1, (SceneItem *) NULL);

	_laser.postInit();
	_laser.setPosition(Common::Point(246, 41));

	if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600) {
		_scanner.postInit();
		_scanner.setup(602, 5, 1);
		_scanner.setPosition(Common::Point(246, 41));
		_scanner.setDetails(600, 20, -1, -1, 1, (SceneItem *) NULL);
		switch (R2_GLOBALS._scannerFrequencies[1] - 2) {
		case 0:
			R2_GLOBALS._sound4.play(45);
			break;
		case 1:
			R2_GLOBALS._sound4.play(4);
			break;
		case 2:
			R2_GLOBALS._sound4.play(5);
			break;
		case 3:
			R2_GLOBALS._sound4.play(6);
			break;
		default:
			break;
		}
	}

	if (R2_GLOBALS.getFlag(6)) {
		_laser.setup(602, 7, 1);
		_laser.setDetails(600, 11, -1, -1, 1, (SceneItem *) NULL);
	} else {
		_laser.setup(600, 2, 1);
		_laser.setDetails(600, 10, -1, -1, 1, (SceneItem *) NULL);

		_laserBeam.postInit();
		_laserBeam.setup(600, 3, 5);
		_laserBeam.setPosition(Common::Point(223, 51));
		_laserBeam.fixPriority(200);
	}

	if (! R2_GLOBALS.getFlag(9))
		_stasisArea.setup(603, 1, 1, 244, 50, 10);

	if (R2_GLOBALS.getFlag(5)) {
		if (R2_INVENTORY.getObjectScene(R2_AEROSOL) == 600) {
			_aerosol.postInit();
			_aerosol.setup(602, 2, 2);
			_aerosol.setPosition(Common::Point(189, 95));
			_aerosol.setDetails(600, 27, -1, -1, 1, (SceneItem *) NULL);
		}

		if (R2_GLOBALS.getFlag(8)) {
			if (R2_GLOBALS.getFlag(9)) {
				// Computer is active
				_computer.postInit();
				_computer.setup(603, 2, 1);
				_computer.setPosition(Common::Point(233, 45));
				_computer.animate(ANIM_MODE_2, NULL);
				_computer.fixPriority(11);
			}
		} else {
			_smoke.postInit();
			_smoke.setup(601, 1, 1);
			_smoke.setPosition(Common::Point(180, 110));
			_smoke._moveDiff = Common::Point(1, 1);
			_smoke._moveRate = 2;
			_smoke._numFrames = 3;
			_smoke.animate(ANIM_MODE_2, NULL);
			_smoke.fixPriority(130);
			_smoke._effect = EFFECT_SMOKE;
			_smoke.setDetails(600, 24, 25, 26, 1, (SceneItem *) NULL);
			_smoke.signal();
		}
	}

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_quantumRegulator.setDetails(12, 600, 17, -1, 19);
	_powerNode.setDetails(11, 600, 14, -1, -1);

	if (R2_GLOBALS.getFlag(9)) {
		_quantumDrive.setDetails(Rect(159, 3, 315, 95), 600, 7, -1, -1, 1, NULL);
	} else {
		_engineCompartment.setDetails(Rect(173, 15, 315, 45), 600, 21, -1, 23, 1, NULL);
		_quantumDrive.setDetails(Rect(159, 3, 315, 95), 600, 6, -1, -1, 1, NULL);
	}
	_background.setDetails(Rect(0, 0, 320, 200), 600, 0, -1, -1, 1, NULL);

	_sceneMode = 600;
	if (R2_GLOBALS._sceneManager._previousScene == 700) {
		if (R2_GLOBALS.getFlag(6)) {
			setAction(&_sequenceManager1, this, 600, &R2_GLOBALS._player, &_doorway, NULL);
		} else if (R2_GLOBALS.getFlag(5)) {
			setAction(&_sequenceManager1, this, 603, &R2_GLOBALS._player, &_doorway, &_laser, &_laserBeam, NULL);
		} else {
			setAction(&_sequenceManager1, this, 602, &R2_GLOBALS._player, &_doorway, &_laser, &_laserBeam, NULL);
		}
	} else if (R2_GLOBALS.getFlag(5)) {
		R2_GLOBALS._player.setPosition(Common::Point(50, 140));
		R2_GLOBALS._player.setStrip(3);
		_laser.setFrame(_laser.getFrameCount());
		signal();
	} else {
		_doorway.setFrame(7);
		_laser.setFrame(7);
		R2_GLOBALS._player.setPosition(Common::Point(28, 140));
		R2_GLOBALS._player.setStrip(5);
		signal();
	}
}

void Scene600::remove() {
	if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 600)
		R2_GLOBALS._sound4.fadeOut2(NULL);
	SceneExt::remove();
}

void Scene600::signal() {
	switch (_sceneMode) {
	case 601:
	// No break on purpose
	case 613:
	// No break on purpose
	case 616:
		R2_GLOBALS._sceneManager.changeScene(700);
		break;
	case 605:
	// After cloud is active
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._walkRegions.disableRegion(6);
		R2_GLOBALS._walkRegions.disableRegion(7);
		R2_GLOBALS._walkRegions.disableRegion(9);
		R2_GLOBALS._walkRegions.disableRegion(10);

		R2_INVENTORY.setObjectScene(R2_AEROSOL, 600);
		R2_GLOBALS.setFlag(5);

		_smoke._effect = EFFECT_SMOKE;
		_smoke.signal();
		break;
	case 606:
	// After Clamp is put on laser
		R2_INVENTORY.setObjectScene(R2_CLAMP, 600);
		R2_GLOBALS._player.enableControl();
		break;
	case 607:
	// After scanner is put on laser
		R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 600);
		R2_GLOBALS._player.enableControl();
		break;
	case 608:
	// deactivate cloud
		R2_GLOBALS.setFlag(8);
		_smoke.remove();
		R2_GLOBALS._walkRegions.enableRegion(6);
		R2_GLOBALS._walkRegions.enableRegion(9);
		R2_GLOBALS._walkRegions.enableRegion(10);
		R2_GLOBALS._player.enableControl();
		break;
	case 612:
	// Deactivate stasis field
		R2_GLOBALS.setFlag(9);
		_stasisField.remove();
		R2_GLOBALS._sceneItems.remove(&_engineCompartment);
		_computer.setDetails(600, 21, -1, 23, 4, &_engineCompartment);
		_engineCompartment.setDetails(600, 7, -1, -1, 3, (SceneItem *) NULL);
		_quantumDrive._lookLineNum = 7;
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		break;
	case 614:
	// Pick up Aerosol
		R2_GLOBALS._player.enableControl();
		_aerosol.remove();
		R2_INVENTORY.setObjectScene(R2_AEROSOL, 1);
		R2_GLOBALS._walkRegions.enableRegion(7);
		break;
	case 615:
	// Pick up Com Scanner
		_scanner.remove();
		R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 1);
		R2_GLOBALS._player.enableControl();
		break;
	default:
		_roomState = 0;
		_sceneMode = 0;
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene600::process(Event &event) {
	if (R2_GLOBALS._player._canWalk && (!R2_GLOBALS.getFlag(6)) && (event.eventType == EVENT_BUTTON_DOWN)
			&& (R2_GLOBALS._events.getCursor() == CURSOR_WALK)) {
		if (!_doorway.contains(event.mousePos) || (_doorway._frame <= 1)) {
			if (R2_GLOBALS.getFlag(5)) {
				_roomState += 10;
			} else {
				R2_GLOBALS._player.disableControl();
				_sceneMode = 604;
				setAction(&_sequenceManager1, this, 604, &_laserBeam, &R2_GLOBALS._player, NULL);
				event.handled = true;
			}
		} else {
			R2_GLOBALS._player.disableControl();
			_sceneMode = 613;
			setAction(&_sequenceManager1, this, 613, &R2_GLOBALS._player, &_laser, NULL);
			event.handled = true;
		}
	} else if ((!R2_GLOBALS.getFlag(6)) && (R2_GLOBALS._player._mover) && (_roomState < 10)){
		_roomState += 10;
	}

	Scene::process(event);
}

void Scene600::dispatch() {
	if ((_roomState != 0) && (_sceneMode != 600) && (_sceneMode != 603) && (_sceneMode != 602)) {
		if ( ((_laser._strip == 4) && (_laser._frame > 1))
		  ||  (_sceneMode == 601)
		  || ((_sceneMode == 616) && (_doorway._frame > 1)) )
		  _roomState = 0;
		else {
			_roomState--;
			if (_roomState % 10 == 0) {
				_laserBeam.setAction(&_sequenceManager2, NULL, 611, &_laserBeam, NULL);
			}
			if ((_roomState == 0) && (R2_GLOBALS._player._mover))
				_roomState = 10;
		}
	}

	if (_laserBeam._frame == 2)
		_sound1.play(40);

	Scene::dispatch();
	if ((_smoke._strip == 3) && (_smoke._frame == 3)) {
		_laserBeam.setStrip(4);
		_laserBeam.setFrame(1);
	}
}

/*--------------------------------------------------------------------------
 * Scene 700 - Lander Bay 2
 *
 *--------------------------------------------------------------------------*/

#define CABLE700_X 26
#define CABLE700_Y -5

Scene700::Scene700() {
	_rotation = NULL;
}

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

bool Scene700::Loft::startAction(CursorType action, Event &event) {
	if ((action == CURSOR_USE) && (R2_GLOBALS._player._position.x < 100))
		return false;

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

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

	switch (action) {
	case R2_CABLE_HARNESS:
		R2_GLOBALS._player.disableControl();
		scene->_cable.postInit();
		scene->_cable.setup(701, 3, 2);
		scene->_cable.setPosition(Common::Point(243, 98));
		scene->_cable.setDetails(700, 37, -1, -1, 2, (SceneItem *) NULL);
		scene->_cable.hide();
		scene->_sceneMode = 20;
		break;
	case R2_ATTRACTOR_CABLE_HARNESS:
		R2_GLOBALS._player.disableControl();
		scene->_cable.postInit();
		scene->_cable.setup(701, 2, 8);
		scene->_cable.setPosition(Common::Point(243, 98));
		scene->_cable.setDetails(700, 38, -1, -1, 2, (SceneItem *) NULL);
		scene->_cable.hide();
		scene->_sceneMode = 21;
		break;
	default:
		return NamedHotspot::startAction(action, event);
		break;
	}

	scene->setAction(&scene->_sequenceManager, scene, 707, &R2_GLOBALS._player, &scene->_cable, NULL);
	return true;
}

bool Scene700::LiftDoor::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	if (R2_GLOBALS._player._position.y <= 100)
		return false;

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

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 701;
	scene->setAction(&scene->_sequenceManager, scene, 701, &R2_GLOBALS._player, this, NULL);

	return true;
}

bool Scene700::SuitRoomDoor::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	if (R2_GLOBALS._player._position.y <= 100)
		return false;

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

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 702;
	scene->setAction(&scene->_sequenceManager, scene, 702, &R2_GLOBALS._player, this, NULL);

	return true;
}

bool Scene700::ControlPanel::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);

	if (R2_GLOBALS._player._position.y <= 100)
		return false;

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

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 704;
	scene->setAction(&scene->_sequenceManager, scene, 704, &R2_GLOBALS._player, this, NULL);

	return true;
}

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

	switch (action) {
	case CURSOR_USE:
		switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
		case 0:
			if ((_strip == 2) && (_frame == 1)) {
				R2_GLOBALS._player.disableControl();
				if (R2_GLOBALS._player._position.y <= 100) {
					scene->_sceneMode = 710;
					scene->setAction(&scene->_sequenceManager, scene, 710, &R2_GLOBALS._player, this, NULL);
				} else {
					scene->_sceneMode = 709;
					scene->setAction(&scene->_sequenceManager, scene, 709, &R2_GLOBALS._player, this, NULL);
				}
			} else {
				return SceneActor::startAction(action, event);
			}
			break;
		case 700: {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 10;
			Common::Point pt(_position.x - 12, _position.y + 1);
			PlayerMover *mover = new PlayerMover();
			R2_GLOBALS._player.addMover(mover, &pt, scene);
			}
			break;
		default:
			break;
		}
		break;
	case R2_ATTRACTOR_UNIT:
		R2_GLOBALS._player.disableControl();
		if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 700) {
			scene->_sceneMode = 706;
			scene->setAction(&scene->_sequenceManager, scene, 706, &R2_GLOBALS._player, &scene->_cable, NULL);
		} else {
			scene->_sceneMode = 15;
			Common::Point pt(_position.x - 12, _position.y + 1);
			PlayerMover *mover = new PlayerMover();
			R2_GLOBALS._player.addMover(mover, &pt, scene);
		}
		break;
	default:
		return SceneActor::startAction(action, event);
		break;
	}

	return true;
}

bool Scene700::LoftDoor::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || (R2_GLOBALS._player._position.y >= 100))
		return SceneActor::startAction(action, event);

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

	R2_GLOBALS._player.disableControl();
	scene->_sceneMode = 1;
	Common::Point pt(_position.x, 69);
	NpcMover *mover = new NpcMover();
	R2_GLOBALS._player.addMover(mover, &pt, scene);

	return true;
}

void Scene700::postInit(SceneObjectList *OwnerList) {
	loadScene(700);
	if (R2_GLOBALS._sceneManager._previousScene == 900)
		_sceneBounds = Rect(160, 0, 480, 200);
	SceneExt::postInit();

	_rotation = R2_GLOBALS._scenePalette.addRotation(237, 246, -1);
	_rotation->setDelay(5);
	_rotation->_countdown = 1;

	_liftDoor.postInit();
	_liftDoor.setVisage(700);
	_liftDoor.setPosition(Common::Point(21, 128));
	_liftDoor.fixPriority(10);
	_liftDoor.setDetails(700, 3, -1, -1, 1, (SceneItem *) NULL);

	_suitRoomDoor.postInit();
	_suitRoomDoor.setup(700, 2, 1);
	_suitRoomDoor.setPosition(Common::Point(217, 120));
	_suitRoomDoor.fixPriority(10);
	_suitRoomDoor.setDetails(700, 15, -1, -1, 1, (SceneItem *) NULL);

	_electromagnet.postInit();
	_electromagnet.setup(700, 4, 1);
	_electromagnet.setPosition(Common::Point(355 - ((R2_GLOBALS._electromagnetZoom * 8) / 5), ((R2_GLOBALS._electromagnetChangeAmount + 20 ) / 5) - 12));
	_electromagnet.fixPriority(10);
	_electromagnet.setDetails(700, 12, -1, 14, 1, (SceneItem *) NULL);

	_loftDoor1.postInit();
	_loftDoor1.setup(700, 8, 1);
	_loftDoor1.setPosition(Common::Point(85, 53));
	_loftDoor1.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);

	_loftDoor2.postInit();
	_loftDoor2.setup(700, 8, 1);
	_loftDoor2.setPosition(Common::Point(164, 53));
	_loftDoor2.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);

	_loftDoor3.postInit();
	_loftDoor3.setup(700, 8, 1);
	_loftDoor3.setPosition(Common::Point(243, 53));
	_loftDoor3.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);

	_loftDoor4.postInit();
	_loftDoor4.setup(700, 8, 1);
	_loftDoor4.setPosition(Common::Point(324, 53));
	_loftDoor4.setDetails(700, 33, -1, 35, 1, (SceneItem *) NULL);

	if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
		_cable.postInit();
		_cable.fixPriority(10);
		switch (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS)) {
		case 0:
			switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
			case 0:
				_cable.setup(701, 3, 2);
				_cable.setPosition(Common::Point(243, 98));
				_cable.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
				break;
			case 700:
				_cable.setup(701, 3, 1);
				_cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
				_cable.setDetails(700, 37, -1, -1, 1, (SceneItem *) NULL);
				break;
			default:
				break;
			}
			break;
		case 700:
			switch (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS)) {
			case 0:
				if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
					_cable.setup(701, 2, 1);
				else
					_cable.setup(701, 2, 8);
				_cable.setPosition(Common::Point(243, 98));
				_cable.fixPriority(77);
				_cable.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
				break;
			case 700:
				_cable.setup(701, 1, 8);
				if (!R2_GLOBALS._cableAttached) {
					_cable.setPosition(Common::Point(356 - (CABLE700_X * 8), 148 - (((CABLE700_Y + 10) / 5) * 4)));
				} else {
					_cable.setup(701, 1, 1);
					_cable.setPosition(Common::Point(_electromagnet._position.x + 1, _electromagnet._position.y + 120));
				}
				_cable.setDetails(700, 38, -1, -1, 1, (SceneItem *) NULL);
				break;
			default:
				break;
			}
		default:
			break;
		}
	}

	_controlPanel.postInit();
	_controlPanel.setup(700, 3, 1);
	_controlPanel.setPosition(Common::Point(454, 117));
	_controlPanel.setDetails(700, 27, -1, -1, 1, (SceneItem *) NULL);

	_handGrip.setDetails(Rect(234, 90, 252, 110), 700, 39, -1, -1, 1, NULL);
	_restraintCollar.setDetails(Rect(91, 158, 385, 167), 700, 6, -1, 8, 1, NULL);
	_debris1.setDetails(Rect(47, 115, 149, 124), 700, 40, -1, 41, 1, NULL);
	_debris2.setDetails(Rect(151, 108, 187, 124), 700, 40, -1, 41, 1, NULL);
	_debris3.setDetails(Rect(247, 108, 275, 124), 700, 40, -1, 41, 1, NULL);
	_debris4.setDetails(Rect(300, 105, 321, 124), 700, 40, -1, 41, 1, NULL);
	_storage2.setDetails(Rect(255, 74, 368, 115), 700, 9, -1, 11, 1, NULL);
	_storage1.setDetails(Rect(69, 74, 182, 115), 700, 9, -1, 11, 1, NULL);
	_stars.setDetails(Rect(370, 58, 475, 103), 700, 18, -1, -1, 1, NULL);
	_light.setDetails(Rect(17, 11, 393, 31), 700, 24, -1, -1, 1, NULL);
	_loft.setDetails(Rect(42, 32, 368, 66), 700, 30, -1, 32, 1, NULL);
	_background.setDetails(Rect(0, 0, 480, 200), 700, 0, -1, -1, 1, NULL);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(11);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player._moveDiff.x = 2;
	R2_GLOBALS._player.disableControl();

	R2_GLOBALS._sound1.play(34);

	_sceneMode = 700;

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 250:
		setAction(&_sequenceManager, this, 700, &R2_GLOBALS._player, &_liftDoor, NULL);
		break;
	case 500:
		setAction(&_sequenceManager, this, 703, &R2_GLOBALS._player, &_suitRoomDoor, NULL);
		break;
	case 600: {
		_sceneMode = 4;
		_loftDoor2.setFrame(5);
		R2_GLOBALS._player.setPosition(Common::Point(164, 74));
		R2_GLOBALS._player.setStrip2(3);
		Common::Point pt(164, 69);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 900:
		setAction(&_sequenceManager, this, 705, &R2_GLOBALS._player, &_controlPanel, NULL);
		break;
	default:
		if (R2_GLOBALS.getFlag(41))
			R2_GLOBALS._player.setPosition(Common::Point(107, 67));
		else
			R2_GLOBALS._player.setPosition(Common::Point(60, 140));
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.enableControl(CURSOR_ARROW);
		break;
	}
}

void Scene700::remove() {
	R2_GLOBALS._sound1.play(10);

	SceneExt::remove();
}

void Scene700::signal() {
	switch (_sceneMode) {
	case 1:
		_sceneMode = 2;
		R2_GLOBALS._player.setStrip(4);
		if (R2_GLOBALS._player._position.x != 164) {
			SceneItem::display(700, 36, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
			R2_GLOBALS._player.enableControl();
		} else {
			R2_GLOBALS._sound2.play(19);
			_loftDoor2.animate(ANIM_MODE_5, this);
		}
		break;
	case 2: {
		_sceneMode = 3;
		R2_GLOBALS._player.setStrip2(4);
		Common::Point pt(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 5);
		NpcMover *mover = new NpcMover();
		R2_GLOBALS._player.addMover(mover, &pt, this);
		}
		break;
	case 3:
		R2_GLOBALS._sceneManager.changeScene(600);
		break;
	case 4:
		_sceneMode = 5;
		R2_GLOBALS._player.setStrip2(-1);
		R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
		R2_GLOBALS._sound2.play(19);
		_loftDoor2.animate(ANIM_MODE_6, this);
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS.setFlag(41);
		break;
	case 10:
		_sceneMode = 11;
		R2_GLOBALS._player.setup(16, 7, 1);
		R2_GLOBALS._player.changeZoom(50);
		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
		break;
	case 11:
		_sceneMode = 12;
		_cable.remove();
		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
		break;
	case 12:
		R2_GLOBALS._player.setVisage(11);
		R2_GLOBALS._player.changeZoom(100);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
		R2_GLOBALS._player._strip = 7;
		if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_UNIT) == 0) {
			R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 1);
			R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
		} else {
			R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 1);
		}
		R2_GLOBALS._player.enableControl();
		break;
	case 15:
		_sceneMode = 16;
		R2_GLOBALS._player.setup(16, 7, 1);
		R2_GLOBALS._player.changeZoom(50);
		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
		break;
	case 16:
		_sceneMode = 17;
		_cable.setup(701, 1, 8);
		_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
		if (R2_GLOBALS._tractorField && (_cable._position.x == _electromagnet._position.x + 1) && (_cable._position.x == 148 - (((R2_GLOBALS._electromagnetChangeAmount + 10) / 5) * 4))) {
			_cable.animate(ANIM_MODE_6, NULL);
			Common::Point pt(_cable._position.x, _electromagnet._position.y + 120);
			NpcMover *mover = new NpcMover();
			_cable.addMover(mover, &pt, NULL);
			R2_GLOBALS._cableAttached = true;
		}
		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
		break;
	case 17:
		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
		R2_GLOBALS._player.setVisage(11);
		R2_GLOBALS._player.changeZoom(100);
		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
		R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
		R2_GLOBALS._player._strip = 7;
		R2_GLOBALS._player.enableControl();
		break;
	case 20:
		R2_INVENTORY.setObjectScene(R2_CABLE_HARNESS, 0);
		R2_GLOBALS._player.enableControl();
		break;
	case 21:
		_cable.fixPriority(77);
		if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
			_cable.animate(ANIM_MODE_6, NULL);

		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
		R2_GLOBALS._player.enableControl();
		break;
	case 701:
		R2_GLOBALS._sceneManager.changeScene(250);
		break;
	case 702:
		R2_GLOBALS._sceneManager.changeScene(500);
		break;
	case 704:
		R2_GLOBALS._sceneManager.changeScene(900);
		break;
	case 706:
		_cable.setDetails(700, 38, -1, -1, 3, (SceneItem *) NULL);
		_cable.fixPriority(77);
		if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70))
			_cable.animate(ANIM_MODE_6, NULL);
		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_UNIT, 0);
		R2_INVENTORY.setObjectScene(R2_ATTRACTOR_CABLE_HARNESS, 700);
		R2_GLOBALS._player.enableControl();
		break;
	case 709:
		R2_GLOBALS.setFlag(41);
		R2_GLOBALS._player.enableControl();
		break;
	case 710:
		R2_GLOBALS.clearFlag(41);
		R2_GLOBALS._player.enableControl();
		break;
	case 5:
	// No break on purpose
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 800 - Sick Bay
 *
 *--------------------------------------------------------------------------*/

bool Scene800::Button::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE) {
		return NamedHotspot::startAction(action, event);
	} else {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

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

bool Scene800::CableJunction::startAction(CursorType action, Event &event) {
	if (action != R2_OPTICAL_FIBER) {
		return NamedHotspot::startAction(action, event);
	} else {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_opticalFiber.postInit();
		scene->_sceneMode = 803;

		if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
			scene->setAction(&scene->_sequenceManager1, scene, 813, &R2_GLOBALS._player, &scene->_opticalFiber, &scene->_reader, NULL);
		else
			scene->setAction(&scene->_sequenceManager1, scene, 803, &R2_GLOBALS._player, &scene->_opticalFiber, NULL);

		return true;
	}
}

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

	switch (action) {
	case CURSOR_USE:
		if (R2_INVENTORY.getObjectScene(R2_READER) != 800)
			break;

		R2_GLOBALS._player.disableControl();
		_lookLineNum = 27;
		scene->_sceneMode = 809;

		if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800)
			scene->setAction(&scene->_sequenceManager1, scene, 815, &R2_GLOBALS._player, &scene->_reader, &scene->_opticalFiber, NULL);
		else
			scene->setAction(&scene->_sequenceManager1, scene, 809, &R2_GLOBALS._player, &scene->_reader, NULL);
		return true;
	case R2_READER:
		R2_GLOBALS._player.disableControl();
		scene->_reader.postInit();
		scene->_sceneMode = 804;

		if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
			scene->setAction(&scene->_sequenceManager1, scene, 814, &R2_GLOBALS._player,
				&scene->_reader, &scene->_opticalFiber, NULL);
		} else {
			scene->setAction(&scene->_sequenceManager1, scene, 804, &R2_GLOBALS._player,
				&scene->_reader, NULL);
		}
		return true;
	default:
		break;
	}

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

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

bool Scene800::Door::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 801;
		scene->setAction(&scene->_sequenceManager1, scene, 801, &R2_GLOBALS._player, &scene->_door, NULL);
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene800::Tray::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

		if (!R2_GLOBALS.getFlag(10)) {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 806;
			scene->setAction(&scene->_sequenceManager1, scene, 806, &R2_GLOBALS._player, &scene->_tray, NULL);
		} else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825) {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 808;
			scene->setAction(&scene->_sequenceManager1, scene, 808, &R2_GLOBALS._player, &scene->_tray, NULL);
		} else {
			R2_GLOBALS._player.disableControl();
			scene->_sceneMode = 807;
			scene->setAction(&scene->_sequenceManager1, scene, 807, &R2_GLOBALS._player, &scene->_tray, NULL);
		}
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene800::ComScanner::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

		if (scene->_cabinet._frame == 1)
			return false;

		R2_GLOBALS._player.disableControl();
		scene->_sceneMode = 811;
		scene->setAction(&scene->_sequenceManager1, scene, 811, &R2_GLOBALS._player, &scene->_comScanner, NULL);
		return true;
		}
	case CURSOR_TALK:
		SceneItem::display2(800, 35);
		return true;
	default:
		return SceneActor::startAction(action, event);
	}
}

bool Scene800::Cabinet::startAction(CursorType action, Event &event) {
	switch (action) {
	case CURSOR_USE: {
		Scene800 *scene = (Scene800 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();

		if (scene->_cabinet._frame == 1) {
			scene->_sceneMode = 810;
			scene->setAction(&scene->_sequenceManager1, scene, 810, &R2_GLOBALS._player, &scene->_cabinet, NULL);
			R2_GLOBALS.setFlag(56);
		} else {
			scene->_sceneMode = 812;
			scene->setAction(&scene->_sequenceManager1, scene, 812, &R2_GLOBALS._player, &scene->_cabinet, NULL);
			R2_GLOBALS.clearFlag(56);
		}
		return true;
		}
	default:
		return SceneActor::startAction(action, event);
	}
}

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

void Scene800::postInit(SceneObjectList *OwnerList) {
	loadScene(800);
	SceneExt::postInit();

	_door.postInit();
	_door.setVisage(800);
	_door.setPosition(Common::Point(286, 108));
	_door.fixPriority(50);
	_door.setDetails(800, 3, -1, -1, 1, (SceneItem *)NULL);

	_autodocCover.postInit();
	_autodocCover.setup(800, 2, 1);
	_autodocCover.setPosition(Common::Point(119, 161));
	_autodocCover.setDetails(800, 6, 7, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
		_opticalFiber.postInit();
		if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
			_opticalFiber.setup(800, 4, 1);
		else
			_opticalFiber.setup(800, 7, 2);

		_opticalFiber.setPosition(Common::Point(220, 124));
		_opticalFiber.fixPriority(140);
	}

	if (R2_INVENTORY.getObjectScene(R2_READER) == 800) {
		_reader.postInit();

		if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 800) {
			_opticalFiber.setup(800, 4, 1);
			_reader.hide();
		} else {
			_reader.setup(800, 7, 1);
		}

		_reader.setPosition(Common::Point(230, 120));
		_reader.fixPriority(140);
	}

	_cabinet.postInit();
	_cabinet.setup(801, 1, R2_GLOBALS.getFlag(56) ? 6 : 1);
	_cabinet.setPosition(Common::Point(169, 79));
	_cabinet.setDetails(800, 41, -1, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_COM_SCANNER) == 800) {
		_comScanner.postInit();
		_comScanner.setup(801, 2, 1);
		_comScanner.setPosition(Common::Point(174, 73));
		_comScanner.setDetails(800, 34, 35, -1, 1, (SceneItem *)NULL);
	}

	_tray.postInit();
	_tray.setup(800, R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 825 ? 6 : 5, 1);
	if (R2_GLOBALS.getFlag(10))
		_tray.setFrame(5);
	_tray.setPosition(Common::Point(203, 144));
	_tray.setDetails(800, 12, -1, 14, 1, (SceneItem *)NULL);

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_dataConduits.setDetails(13, 800, 21, -1, -1);
	_cableJunction.setDetails(Rect(206, 111, 223, 125), 800, 24, -1, -1, 1, NULL);
	_deviceSlot.setDetails(Rect(220, 108, 239, 122), 800, 27, -1, -1, 1, NULL);
	_diskSlot.setDetails(Rect(209, 124, 226, 133), 800, 9, -1, 11, 1, NULL);

	if (R2_INVENTORY.getObjectScene(R2_READER) == 800)
		_deviceSlot._lookLineNum = 33;

	_button.setDetails(Rect(189, 112, 204, 124), 800, 30, -1, -1, 1, NULL);
	_couch.setDetails(11, 800, 15, -1, 17);
	_autoDoc.setDetails(Rect(152, 92, 247, 151), 800, 6, 7, -1, 1, NULL);
	_medicalDatabase.setDetails(12, 800, 18, -1, -1);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 800, 0, -1, -1, 1, NULL);

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 825:
		_sceneMode = 800;
		setAction(&_sequenceManager1, this, 805, &R2_GLOBALS._player, &_autodocCover, NULL);
		break;
	case 850:
		_sceneMode = 800;
		setAction(&_sequenceManager1, this, 800, &R2_GLOBALS._player, &_door, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(277, 132));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene800::signal() {
	switch (_sceneMode) {
	case 801:
		R2_GLOBALS._sceneManager.changeScene(850);
		break;
	case 802:
		R2_GLOBALS._sceneManager.changeScene(825);
		break;
	case 803:
		R2_GLOBALS._player.enableControl();
		R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 800);
		break;
	case 804:
		R2_GLOBALS._player.enableControl();
		_deviceSlot._lookLineNum = 33;
		R2_INVENTORY.setObjectScene(R2_READER, 800);
		break;
	case 806:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS.setFlag(10);
		break;
	case 807:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS.clearFlag(10);
		break;
	case 808:
		R2_GLOBALS._player.enableControl();
		R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1);
		break;
	case 809:
		R2_GLOBALS._player.enableControl();
		R2_INVENTORY.setObjectScene(R2_READER, 1);
		break;
	case 811:
		R2_GLOBALS._player.enableControl();
		_comScanner.remove();
		R2_INVENTORY.setObjectScene(R2_COM_SCANNER, 1);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 825 - Autodoc
 *
 *--------------------------------------------------------------------------*/

Scene825::Button::Button(): SceneObject() {
	_buttonId = 0;
	_buttonDown = false;
}

void Scene825::Button::synchronize(Serializer &s) {
	SceneObject::synchronize(s);
	s.syncAsSint16LE(_buttonId);
	s.syncAsSint16LE(_buttonDown);
}

void Scene825::Button::process(Event &event) {
	if (!event.handled) {
		Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;

		if ((event.eventType == EVENT_BUTTON_DOWN) && _bounds.contains(event.mousePos) && !_buttonDown) {
			scene->_sound1.play(14);
			setFrame(2);
			_buttonDown = true;
			event.handled = true;
		}

		if ((event.eventType == EVENT_BUTTON_UP) && _buttonDown) {
			setFrame(1);
			_buttonDown = false;
			event.handled = true;

			scene->doButtonPress(_buttonId);
		}
	}
}

bool Scene825::Button::startAction(CursorType action, Event &event) {
	if (action == CURSOR_USE)
		return false;
	else
		return SceneObject::startAction(action, event);
}

void Scene825::Button::setButton(int buttonId) {
	SceneObject::postInit();
	_buttonDown = 0;
	_sceneText._color1 = 92;
	_sceneText._color2 = 0;
	_sceneText._width = 200;
	_sceneText.fixPriority(20);
	_sceneText._fontNumber = 50;

	switch (buttonId) {
	case 1:
		_sceneText.setPosition(Common::Point(95, 58));
		break;
	case 2:
		_sceneText.setPosition(Common::Point(98, 75));
		break;
	case 3:
		_sceneText.setPosition(Common::Point(102, 95));
		break;
	case 4:
		_sceneText.setPosition(Common::Point(180, 58));
		_sceneText._textMode = ALIGN_RIGHT;
		break;
	case 5:
		_sceneText.setPosition(Common::Point(177, 75));
		_sceneText._textMode = ALIGN_RIGHT;
		break;
	case 6:
		_sceneText.setPosition(Common::Point(175, 95));
		_sceneText._textMode = ALIGN_RIGHT;
		break;
	default:
		break;
	}

	setDetails(825, 6, 7, -1, 2, (SceneItem *)NULL);
}

void Scene825::Button::setText(int textId) {
	_buttonId = textId;
	_lookLineNum = textId;

	_sceneText.remove();
	if (_buttonId != 0) {
		Scene825 *scene = (Scene825 *)R2_GLOBALS._sceneManager._scene;
		_sceneText.setup(scene->_autodocItems[textId - 1]);
	}
}

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

Scene825::Scene825(): SceneExt() {
	_menuId = _frame1 = _frame2 = 0;

	// Setup Autodoc items list
	_autodocItems[0] = MAIN_MENU;
	_autodocItems[1] = DIAGNOSIS;
	_autodocItems[2] = ADVANCED_PROCEDURES;
	_autodocItems[3] = VITAL_SIGNS;
	_autodocItems[4] = OPEN_DOOR;
	_autodocItems[5] = TREATMENTS;
	_autodocItems[6] = NO_MALADY_DETECTED;
	_autodocItems[7] = NO_TREATMENT_REQUIRED;
	_autodocItems[8] = ACCESS_CODE_REQUIRED;
	_autodocItems[9] = INVALID_ACCESS_CODE;
	_autodocItems[10] = FOREIGN_OBJECT_EXTRACTED;
}

void Scene825::postInit(SceneObjectList *OwnerList) {
	loadScene(825);
	R2_GLOBALS._uiElements._active = false;
	SceneExt::postInit();
	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player._effect = EFFECT_NONE;
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.hide();
	R2_GLOBALS._player.disableControl();


	_console.setDetails(1, 825, 3, 4, 5);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 825, 0, -1, -1, 1, NULL);

	_sceneMode = 10;
	signal();
}

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

	s.syncAsSint16LE(_menuId);
	s.syncAsSint16LE(_frame1);
	s.syncAsSint16LE(_frame2);
}

void Scene825::remove() {
	SceneExt::remove();
	R2_GLOBALS._player._uiEnabled = true;
}

void Scene825::signal() {
	switch (_sceneMode) {
	case 10:
		_button1.setButton(1);
		_button1.setup(825, 1, 1);
		_button1.setPosition(Common::Point(71, 71));
		_button2.setButton(2);
		_button2.setup(825, 3, 1);
		_button2.setPosition(Common::Point(74, 90));
		_button3.setButton(3);
		_button3.setup(825, 5, 1);
		_button3.setPosition(Common::Point(78, 109));
		_button4.setButton(4);
		_button4.setup(825, 2, 1);
		_button4.setPosition(Common::Point(248, 71));
		_button5.setButton(5);
		_button5.setup(825, 4, 1);
		_button5.setPosition(Common::Point(245, 90));
		_button6.setButton(6);
		_button6.setup(825, 6, 1);
		_button6.setPosition(Common::Point(241, 109));

		doButtonPress(1);
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	case 825:
		_vertLine5.remove();
		_sceneText._color1 = 92;
		_sceneText._color2 = 0;
		_sceneText._width = 200;
		_sceneText.fixPriority(20);
		_sceneText._fontNumber = 50;
		_sceneText.setPosition(Common::Point(120, 75));
		_sceneText.setup(NO_MALADY_DETECTED);
		_sceneMode = 826;
		setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
		break;
	case 826:
		_sceneText.remove();
		doButtonPress(1);
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	case 827:
		_vertLine5.remove();
		R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 825);
		_sceneText.setPosition(Common::Point(108, 75));
		_sceneText.setup(FOREIGN_OBJECT_EXTRACTED);
		_sceneMode = 826;
		setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
		break;
	default:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	}
}

void Scene825::process(Event &event) {
	SceneExt::process(event);

	if (R2_GLOBALS._player._uiEnabled) {
		_button1.process(event);
		_button2.process(event);
		_button3.process(event);
		_button4.process(event);
		_button5.process(event);
		_button6.process(event);
	}
}

void Scene825::dispatch() {
	if (R2_GLOBALS._sceneObjects->contains(&_vertLine4) &&
			((_vertLine4._frame == 1) || (_vertLine4._frame == 3)) &&
			(_vertLine4._frame != _frame1)) {
		_sound2.play(25);
	}

	if (R2_GLOBALS._sceneObjects->contains(&_vertLine1) &&
			(_vertLine1._frame == 3) && (_vertLine1._frame != _frame2)) {
		_sound3.play(26);
	}

	_frame1 = _vertLine4._frame;
	_frame2 = _vertLine1._frame;

	Scene::dispatch();
}

void Scene825::doButtonPress(int buttonId) {
	if ((_menuId != 4) || (buttonId == 5)) {
		_button1.setText(0);
		_button2.setText(0);
		_button3.setText(0);
		_button4.setText(0);
		_button5.setText(0);
		_button6.setText(0);

		switch (buttonId) {
		case 2:
			R2_GLOBALS._player.disableControl();
			_vertLine5.postInit();
			_sceneMode = 825;
			setAction(&_sequenceManager1, this, 825, &R2_GLOBALS._player, &_vertLine5, NULL);
			break;
		case 3:
			R2_GLOBALS._player.disableControl();
			_sceneText._color1 = 92;
			_sceneText._color2 = 0;
			_sceneText._width = 200;
			_sceneText.fixPriority(20);
			_sceneText._fontNumber = 50;
			_sceneText.setPosition(Common::Point(115, 75));

			if (R2_GLOBALS.getFlag(4)) {
				if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
						(R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
					_sceneText.setPosition(Common::Point(116, 75));
					_sceneText.setup(ACCESS_CODE_REQUIRED);
				} else if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != 800) {
					_sceneText.setPosition(Common::Point(115, 75));
					_sceneText.setup(NO_TREATMENT_REQUIRED);
				} else {
					_button6._buttonId = 5;
					_sceneMode = 827;
					_vertLine5.postInit();

					setAction(&_sequenceManager1, this, 827, &_vertLine5, NULL);
				}
			} else {
				R2_GLOBALS.setFlag(2);

				if ((R2_INVENTORY.getObjectScene(R2_READER) != 800) ||
						(R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 800)) {
					_sceneText.setPosition(Common::Point(116, 75));
					_sceneText.setup(ACCESS_CODE_REQUIRED);
				} else {
					_sceneText.setPosition(Common::Point(119, 75));
					_sceneText.setup(INVALID_ACCESS_CODE);
				}
			}

			if (_sceneMode != 827) {
				_sceneMode = 826;
				setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
			}
			break;
		case 4:
			_sound4.play(27);
			_button6._buttonId = 5;

			_vertLine1.postInit();
			_vertLine1.setup(826, 7, 1);
			_vertLine1.setPosition(Common::Point(112, 67));
			_vertLine1._numFrames = 1;
			_vertLine1.animate(ANIM_MODE_2);

			_vertLine2.postInit();
			_vertLine2.setup(826, 5, 1);
			_vertLine2.setPosition(Common::Point(158, 67));
			_vertLine2._numFrames = 5;
			_vertLine2.animate(ANIM_MODE_2);

			_vertLine3.postInit();
			_vertLine3.setup(826, 6, 1);
			_vertLine3.setPosition(Common::Point(206, 67));
			_vertLine3._numFrames = 1;
			_vertLine3.animate(ANIM_MODE_2);

			_vertLine4.postInit();
			_vertLine4.setup(826, 8, 1);
			_vertLine4.setPosition(Common::Point(158, 84));
			_vertLine4._numFrames = 1;
			_vertLine4.animate(ANIM_MODE_2);

			_vertLine5.postInit();
			_vertLine5.setup(826, 4, 1);
			_vertLine5.setPosition(Common::Point(161, 110));
			break;
		case 5:
			R2_GLOBALS._player.disableControl();
			if (_menuId == 4) {
				_menuId = 0;

				_vertLine1.remove();
				_vertLine2.remove();
				_vertLine3.remove();
				_vertLine4.remove();
				_vertLine5.remove();

				_sound2.stop();
				_sound3.stop();
				_sound4.stop();

				doButtonPress(1);
				R2_GLOBALS._player.enableControl();
				R2_GLOBALS._player._canWalk = false;
			} else {
				R2_GLOBALS._sceneManager.changeScene(800);
			}
			break;
		case 6:
			R2_GLOBALS._player.disableControl();
			_sceneText._color1 = 92;
			_sceneText._color2 = 0;
			_sceneText._width = 200;
			_sceneText.fixPriority(20);
			_sceneText._fontNumber = 50;
			_sceneText.setPosition(Common::Point(115, 75));
			_sceneText.setup(NO_TREATMENT_REQUIRED);

			_sceneMode = 826;
			setAction(&_sequenceManager1, this, 826, &R2_GLOBALS._player, NULL);
			break;
		default:
			_button1.setText(2);
			_button2.setText(3);
			_button3.setText(4);
			_button4.setText(6);
			_button6.setText(5);
			break;
		}

		_menuId = buttonId;
	}
}

/*--------------------------------------------------------------------------
 * Scene 850 - Deck #5 - By Lift
 *
 *--------------------------------------------------------------------------*/

bool Scene850::Indicator::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) != 850))
		return NamedHotspot::startAction(action, event);
	else {
		Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;

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

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

bool Scene850::LiftDoor::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);
	else {
		Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;

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

bool Scene850::SickBayDoor::startAction(CursorType action, Event &event) {
	if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);
	else {
		Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;

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

bool Scene850::Clamp::startAction(CursorType action, Event &event) {
	if (!R2_GLOBALS.getFlag(7))
		return false;
	else if (action != CURSOR_USE)
		return SceneActor::startAction(action, event);
	else {
		Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;

		R2_GLOBALS._player.disableControl();
		scene->_spark.postInit();
		scene->_sceneMode = 850;
		scene->setAction(&scene->_sequenceManager1, scene, 850, &R2_GLOBALS._player, this,
			&scene->_spark, NULL);
		return true;
	}
}

bool Scene850::Panel::startAction(CursorType action, Event &event) {
	if ((action != CURSOR_USE) || R2_GLOBALS.getFlag(7))
		return SceneActor::startAction(action, event);
	else {
		Scene850 *scene = (Scene850 *)R2_GLOBALS._sceneManager._scene;

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

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

void Scene850::postInit(SceneObjectList *OwnerList) {
	loadScene(850);
	SceneExt::postInit();

	_liftDoor.postInit();
	_liftDoor.setup(850, 2, 1);
	_liftDoor.setPosition(Common::Point(188, 79));
	_liftDoor.setDetails(850, 3, -1, -1, 1, (SceneItem *)NULL);

	_sickBayDoor.postInit();
	_sickBayDoor.setup(850, 3, 1);
	_sickBayDoor.setPosition(Common::Point(62, 84));
	_sickBayDoor.setDetails(850, 9, -1, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_CLAMP) == 850) {
		_clamp.postInit();
		_clamp.setup(850, 5, 1);
		_clamp.setPosition(Common::Point(242, 93));
		_clamp.fixPriority(81);
		_clamp.animate(ANIM_MODE_2, NULL);
		_clamp.setDetails(850, 27, -1, -1, 1, (SceneItem *)NULL);
	}

	_panel.postInit();
	_panel.setVisage(850);

	if (R2_GLOBALS.getFlag(7))
		_panel.setFrame(7);

	_panel.setPosition(Common::Point(232, 119));
	_panel.fixPriority(82);
	_panel.setDetails(850, 24, -1, -1, 1, (SceneItem *)NULL);

	if (R2_INVENTORY.getObjectScene(R2_OPTICAL_FIBER) == 850) {
		_fiber.postInit();
		_fiber.setup(850, 6, 1);
		_fiber.setPosition(Common::Point(280, 87));
	}

	R2_GLOBALS._player.postInit();
	R2_GLOBALS._player.setVisage(10);
	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
	R2_GLOBALS._player.disableControl();

	_eastDoor.setDetails(Rect(289, 53, 315, 125), 850, 6, -1, 8, 1, NULL);
	_indicator.setDetails(Rect(275, 67, 286, 79), 850, 18, -1, 20, 1, NULL);
	_sickBayIndicator.setDetails(Rect(41, 51, 48, 61), 850, 15, -1, -1, 1, NULL);
	_liftControls.setDetails(Rect(156, 32, 166, 44), 850, 21, -1, -1, 1, NULL);
	_compartment.setDetails(Rect(4, 88, 153, 167), 850, 12, -1, -1, 1, NULL);
	_background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 850, 0, -1, -1, 1, NULL);

	switch (R2_GLOBALS._sceneManager._previousScene) {
	case 250:
		_sceneMode = 203;
		setAction(&_sequenceManager1, this, 203, &R2_GLOBALS._player, &_liftDoor, NULL);
		break;
	case 800:
		_sceneMode = 205;
		setAction(&_sequenceManager1, this, 205, &R2_GLOBALS._player, &_sickBayDoor, NULL);
		break;
	default:
		R2_GLOBALS._player.setStrip(3);
		R2_GLOBALS._player.setPosition(Common::Point(215, 115));
		R2_GLOBALS._player.enableControl();
		break;
	}
}

void Scene850::signal() {
	switch (_sceneMode) {
	case 202:
		R2_GLOBALS._sceneManager.changeScene(250);
		break;
	case 204:
		R2_GLOBALS._sceneManager.changeScene(800);
		break;
	case 850:
		R2_INVENTORY.setObjectScene(R2_CLAMP, 1);
		_clamp.remove();
		_spark.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 851:
		R2_INVENTORY.setObjectScene(R2_OPTICAL_FIBER, 1);
		_fiber.remove();
		R2_GLOBALS._player.enableControl();
		break;
	case 852:
		R2_GLOBALS.setFlag(7);
		R2_GLOBALS._player.enableControl();
		break;
	default:
		R2_GLOBALS._player.enableControl();
		break;
	}
}

/*--------------------------------------------------------------------------
 * Scene 900 - Lander Bay 2 - Crane Controls
 *
 *--------------------------------------------------------------------------*/

Scene900::Button::Button() {
	_buttonId = 0;
}

void Scene900::Button::synchronize(Serializer &s) {
	SceneActor::synchronize(s);

	s.syncAsSint16LE(_buttonId);
}


void Scene900::Button::initButton(int buttonId) {
	_buttonId = buttonId;
	postInit();
	setDetails(900, -1, -1, -1, 2, (SceneItem *) NULL);
}

Scene900::Scene900() {
	_controlsScreenNumber = 0;
	_magnetChangeAmount.x = 0;
	_magnetChangeAmount.y = 0;
}

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

	s.syncAsSint16LE(_controlsScreenNumber);
	s.syncAsSint16LE(_magnetChangeAmount.x);
	s.syncAsSint16LE(_magnetChangeAmount.y);
}

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

	if (action == CURSOR_USE) {
		R2_GLOBALS._sound2.play(14);
		switch (_buttonId) {
		case 2:
			if (scene->_controlsScreenNumber == 1) {
				scene->_sceneMode = 2;
				scene->signal();
			} else if (scene->_controlsScreenNumber == 2) {
				if (!R2_GLOBALS._tractorField) {
					scene->_aSound1.play(30);
					setup(900, 3, 11);
					R2_GLOBALS._tractorField = true;
					if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS == 700)) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70) && (scene->_cable._animateMode != ANIM_MODE_6)) {
						scene->_cable.animate(ANIM_MODE_6, NULL);
					} else {
						if (((scene->_electromagnet._percent * 49) / 100) + scene->_electromagnet._position.x == scene->_cable._position.x) {
							if (scene->_cable._position.x == 166 - (R2_GLOBALS._electromagnetZoom / 15)) {
								R2_GLOBALS._player.disableControl();
								scene->_sceneMode = 4;
								scene->_cable._moveDiff.y = (scene->_cable._position.y - (scene->_electromagnet._position.y + ((scene->_electromagnet._percent * 3) / 10) - 2)) / 9;
								Common::Point pt(scene->_electromagnet._position.x + ((scene->_electromagnet._percent * 49) / 100), scene->_electromagnet._position.y + ((scene->_electromagnet._percent * 3) / 10) - 2);
								NpcMover *mover = new NpcMover();
								scene->_cable.addMover(mover, &pt, this);
								scene->_cable.animate(ANIM_MODE_6, NULL);
							}
						}
					}
				} else {
					scene->_aSound1.play(53);
					setup(900, 3, 9);
					R2_GLOBALS._tractorField = false;

					if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8) && (scene->_cable._animateMode != ANIM_MODE_5)) {
							scene->_cable.animate(ANIM_MODE_5, NULL);
					} else if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 700) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (scene->_cable._frame < 8)) {
						R2_GLOBALS._cableAttached = false;
						if (scene->_cable._animateMode != 5) {
							R2_GLOBALS._player.disableControl();
							scene->_sceneMode = 5;
							scene->_cable.animate(ANIM_MODE_5, NULL);
							scene->_cable._moveDiff.y = (166 - scene->_cable._position.y) / 9;
							Common::Point pt(scene->_cable._position.x, 166 - (R2_GLOBALS._electromagnetZoom / 15));
							NpcMover *mover = new NpcMover();
							scene->_cable.addMover(mover, &pt, this);
						}
					}
				}
			}
			return true;
			break;
		case 3:
			if (scene->_controlsScreenNumber == 1) {
				scene->_sceneMode = 3;
				scene->signal();
			}
			return true;
			break;
		case 4:
			if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetZoom != 0)) {
				scene->_aSound1.play(38);
				scene->_magnetChangeAmount.y = -5;
			}
			return true;
			break;
		case 5:
			if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetZoom < 135)) {
				scene->_aSound1.play(38);
				scene->_magnetChangeAmount.y = 5;
			}
			return true;
			break;
		case 6:
			if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetChangeAmount > -10)) {
				scene->_aSound1.play(38);
				scene->_magnetChangeAmount.x = -5;
			}
			return true;
			break;
		case 7:
			if ((scene->_magnetChangeAmount.y == 0) && (scene->_magnetChangeAmount.x == 0) && (R2_GLOBALS._electromagnetChangeAmount < 20)) {
				scene->_aSound1.play(38);
				scene->_magnetChangeAmount.x = 5;
			}
			return true;
			break;
		case 8:
			SceneItem::display(5, 11, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
			return true;
			break;
		case 9:
			SceneItem::display(5, 12, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
			return true;
			break;
		default:
			if (scene->_controlsScreenNumber == 1) {
				R2_GLOBALS._player.disableControl();
				scene->_button2.remove();
				scene->_button3.remove();
				scene->_button4.remove();
				scene->_button5.remove();
				scene->_button6.remove();
				scene->_button7.remove();
				R2_GLOBALS._sound2.play(37);
				scene->_sceneMode = 901;
				scene->setAction(&scene->_sequenceManager1, scene, 901, &scene->_controls, this ,NULL);
			} else if ((scene->_controlsScreenNumber == 2) || (scene->_controlsScreenNumber == 3)) {
				scene->_sceneMode = 1;
				scene->signal();
			}

			return true;
			break;
		}
	} else if (action == CURSOR_LOOK) {
		SceneItem::display(900, ((_buttonId == 2) && (scene->_controlsScreenNumber == 2)) ? 21 : _buttonId + 11,
			SET_WIDTH, 280, SET_X, 160,  SET_POS_MODE, 1, SET_Y, 20, SET_EXT_BGCOLOR, 7, LIST_END);
		return true;
	} else {
		return SceneActor::startAction(action, event);
	}
}

void Scene900::postInit(SceneObjectList *OwnerList) {
	g_globals->gfxManager()._bounds.moveTo(Common::Point(0, 0));
	loadScene(900);
	SceneExt::postInit();
	R2_GLOBALS._sound1.play(34);

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

	_controls.postInit();
	_controls.setDetails(900, 3, -1, -1, 1, (SceneItem *) NULL);

	_magnetChangeAmount.x = 0;
	_magnetChangeAmount.y = 0;

	_electromagnet.postInit();
	_electromagnet.fixPriority(1);
	_electromagnet.setup(900, 1, 2);
	_electromagnet.setPosition(Common::Point(89, 0));
	_electromagnet._effect = EFFECT_SHADED;
	_electromagnet.setDetails(900, 6, -1, 8, 1, (SceneItem *) NULL);

	if ((R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) != 1) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 1)) {
		_cable.postInit();
		_cable.setPosition(Common::Point(0, 0));
		_cable.fixPriority(1);

		if (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) {
			if (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) != 700) {
				_cable.setup(901, 3, 2);
			} else if (R2_GLOBALS._tractorField && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
				_cable.setup(901, 2, 1);
			} else {
				_cable.setup(901, 2, 8);
			}
			_cable.setPosition(Common::Point(171, 145));
			_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
		} else {
			_cable.setDetails(700, -1, -1, -1, 1, (SceneItem *) NULL);
			if (!R2_GLOBALS._cableAttached) {
				_cable.setup(901, 1, 8);
				// Original set two times the same values: skipped
				_cable.setPosition(Common::Point((((100  - ((CABLE700_X * 350) / 100)) * 49) / 100) + ((CABLE700_Y * _electromagnet._percent * 6) / 100) + 89, 166 - (CABLE700_X / 3)));
				_cable.changeZoom(((100 - ((CABLE700_X * 350) / 100) + 52) / 10) * 10);
			}
		}
	}

	_background.setDetails(Rect(0, 0, 320, 200), 900, 0, -1, -1, 1, NULL);
	_sceneMode = 900;
	setAction(&_sequenceManager1, this, 900, &_controls, NULL);
}

void Scene900::remove() {
	if (_sceneMode != 901)
		R2_GLOBALS._sound1.play(10);

	SceneExt::remove();
}

void Scene900::signal() {
	switch (_sceneMode) {
	case 1:
		_controlsScreenNumber = 1;
		R2_GLOBALS._sound2.play(37);

		_button2.remove();
		_button3.remove();
		_button4.remove();
		_button5.remove();
		_button6.remove();
		_button7.remove();

		_button2.initButton(2);
		_button2.setup(900, 2, 1);
		_button2.setPosition(Common::Point(36, 166));

		_button3.initButton(3);
		_button3.setup(900, 2, 5);
		_button3.setPosition(Common::Point(117, 166));
		break;
	case 2:
		_controlsScreenNumber = 2;

		_button2.remove();
		_button3.remove();

		_button2.initButton(2);
		if (!R2_GLOBALS._tractorField)
			_button2.setup(900, 3, 9);
		else
			_button2.setup(900, 3, 11);
		_button2.setPosition(Common::Point(36, 166));

		_button4.initButton(5);
		_button4.setup(900, 3, 3);
		_button4.setPosition(Common::Point(76, 134));

		_button5.initButton(4);
		_button5.setup(900, 3, 7);
		_button5.setPosition(Common::Point(76, 156));

		_button6.initButton(6);
		_button6.setup(900, 3, 1);
		_button6.setPosition(Common::Point(55, 144));

		_button7.initButton(7);
		_button7.setup(900, 3, 5);
		_button7.setPosition(Common::Point(99, 144));

		break;
	case 3:
		_controlsScreenNumber = 3;

		_button2.remove();
		_button3.remove();
		_button4.remove();
		_button5.remove();
		_button6.remove();
		_button7.remove();

		_button2.initButton(8);
		_button2.setup(900, 4, 1);
		_button2.setPosition(Common::Point(36, 166));

		_button3.initButton(9);
		_button3.setup(900, 4, 5);
		_button3.setPosition(Common::Point(117, 166));
		break;
	case 4:
		_sceneMode = 0;
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		R2_GLOBALS._cableAttached = true;
		break;
	case 900:
		R2_GLOBALS._player.enableControl(CURSOR_USE);
		R2_GLOBALS._player._canWalk = false;

		_controls.setup(900, 1, 1);

		_button1.initButton(1);
		_button1.setup(900, 1, 3);
		_button1.setPosition(Common::Point(77, 168));

		_sceneMode = 1;
		signal();
		break;
	case 901:
		R2_GLOBALS._sceneManager.changeScene(700);
		break;
	case 5:
		_sceneMode = 0;
	// No break on purpose
	default:
		R2_GLOBALS._player.enableControl();
		R2_GLOBALS._player._canWalk = false;
		break;
	}
}

void Scene900::dispatch() {
	if (_magnetChangeAmount.y != 0) {
		if (_magnetChangeAmount.y < 0) {
			R2_GLOBALS._electromagnetZoom--;
			++_magnetChangeAmount.y;
		} else {
			++R2_GLOBALS._electromagnetZoom;
			_magnetChangeAmount.y--;
		}
	}

	if (_magnetChangeAmount.x != 0) {
		if (_magnetChangeAmount.x < 0) {
			R2_GLOBALS._electromagnetChangeAmount--;
			++_magnetChangeAmount.x;
		} else {
			++R2_GLOBALS._electromagnetChangeAmount;
			_magnetChangeAmount.x--;
		}
	}

	if (R2_GLOBALS._sceneObjects->contains(&_cable)) {
		if (R2_GLOBALS._tractorField && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (R2_GLOBALS._electromagnetChangeAmount == 20) && (R2_GLOBALS._electromagnetZoom == 70)) {
			if ((_cable._frame > 1) && (_cable._animateMode != ANIM_MODE_6))
				_cable.animate(ANIM_MODE_6, NULL);
		} else {
			if ((_cable._frame < 8) && (_cable._animateMode != ANIM_MODE_5) && !R2_GLOBALS._cableAttached && (R2_INVENTORY.getObjectScene(R2_CABLE_HARNESS) == 0) && (R2_INVENTORY.getObjectScene(R2_ATTRACTOR_CABLE_HARNESS) == 700) && (_sceneMode != 4))
				_cable.animate(ANIM_MODE_5, NULL);
		}
	}

	_electromagnet.changeZoom(100 - ((R2_GLOBALS._electromagnetZoom * 70) / 100));
	_electromagnet.setPosition(Common::Point(((_electromagnet._percent * R2_GLOBALS._electromagnetChangeAmount * 6) / 100) + 89, R2_GLOBALS._electromagnetZoom));

	if ((R2_GLOBALS._sceneObjects->contains(&_cable)) && R2_GLOBALS._cableAttached && (!_cable._mover) && (_cable._animateMode == ANIM_MODE_NONE)) {
		_cable.setPosition(Common::Point(_electromagnet._position.x + ((_electromagnet._percent * 49) / 100), _electromagnet._position.y + ((_electromagnet._percent * 3) / 10)));
		if (R2_GLOBALS._electromagnetZoom >= 75) {
			_cable.setup(901, 1, 1);
			_cable.changeZoom(((_electromagnet._percent + 52) / 10) * 10);
		} else {
			_cable.setup(901, 5, 1);
			_cable.changeZoom(((_electromagnet._percent / 10) * 10) + 30);
		}
	}
	Scene::dispatch();
}

} // End of namespace Ringworld2

} // End of namespace TsAGE