[Scummvm-cvs-logs] scummvm master -> c878731937a39f56cc63ef56d2190d2e02caa2d7

Strangerke Strangerke at scummvm.org
Thu Oct 16 07:59:19 CEST 2014


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
c878731937 TSAGE: Move Air Duct and Vampire lair mazes in separate source files


Commit: c878731937a39f56cc63ef56d2190d2e02caa2d7
    https://github.com/scummvm/scummvm/commit/c878731937a39f56cc63ef56d2190d2e02caa2d7
Author: Strangerke (strangerke at scummvm.org)
Date: 2014-10-16T07:56:48+02:00

Commit Message:
TSAGE: Move Air Duct and Vampire lair mazes in separate source files

Changed paths:
  A engines/tsage/ringworld2/ringworld2_airduct.cpp
  A engines/tsage/ringworld2/ringworld2_airduct.h
  A engines/tsage/ringworld2/ringworld2_vampire.cpp
  A engines/tsage/ringworld2/ringworld2_vampire.h
    engines/tsage/module.mk
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.h



diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk
index 3fc30f9..d62f398 100644
--- a/engines/tsage/module.mk
+++ b/engines/tsage/module.mk
@@ -35,14 +35,16 @@ MODULE_OBJS := \
 	ringworld/ringworld_scenes8.o \
 	ringworld/ringworld_scenes10.o \
 	ringworld/ringworld_speakers.o \
+	ringworld2/ringworld2_airduct.o \
 	ringworld2/ringworld2_dialogs.o \
 	ringworld2/ringworld2_logic.o \
+	ringworld2/ringworld2_outpost.o \
 	ringworld2/ringworld2_scenes0.o \
 	ringworld2/ringworld2_scenes1.o \
 	ringworld2/ringworld2_scenes2.o \
 	ringworld2/ringworld2_scenes3.o \
-	ringworld2/ringworld2_outpost.o \
 	ringworld2/ringworld2_speakers.o \
+	ringworld2/ringworld2_vampire.o \
 	saveload.o \
 	scenes.o \
 	sound.o \
diff --git a/engines/tsage/ringworld2/ringworld2_airduct.cpp b/engines/tsage/ringworld2/ringworld2_airduct.cpp
new file mode 100644
index 0000000..dc43dba
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_airduct.cpp
@@ -0,0 +1,914 @@
+/* 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 "graphics/cursorman.h"
+
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld2/ringworld2_airduct.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+/*--------------------------------------------------------------------------
+ * Scene 1200 - Air Ducts Maze
+ *
+ *--------------------------------------------------------------------------*/
+
+Scene1200::Scene1200() {
+	_nextCrawlDirection = 0;
+	_field414 = 0;
+	_field416 = 0;
+	_field418 = 0;
+	_field41A = 0;
+	_fixupMaze = false;
+}
+
+void Scene1200::synchronize(Serializer &s) {
+	SceneExt::synchronize(s);
+
+	s.syncAsSint16LE(_nextCrawlDirection);
+	s.syncAsSint16LE(_field414);
+	s.syncAsSint16LE(_field416);
+	s.syncAsSint16LE(_field418);
+	s.syncAsSint16LE(_field41A);
+	s.syncAsSint16LE(_fixupMaze);
+}
+
+Scene1200::LaserPanel::LaserPanel() {
+}
+
+void Scene1200::LaserPanel::Jumper::init(int state) {
+	_state = state;
+
+	SceneActor::postInit();
+	setup(1003, 1, 1);
+	fixPriority(255);
+
+	switch (_state) {
+	case 1:
+		switch (R2_GLOBALS._ductMazePanel1State) {
+		case 1:
+			setFrame2(2);
+			setPosition(Common::Point(129, 101));
+			break;
+		case 2:
+			setFrame2(3);
+			setPosition(Common::Point(135, 95));
+			break;
+		default:
+			break;
+		}
+		break;
+	case 2:
+		switch (R2_GLOBALS._ductMazePanel2State) {
+		case 1:
+			setFrame2(2);
+			setPosition(Common::Point(152, 101));
+			break;
+		case 2:
+			setFrame2(3);
+			setPosition(Common::Point(158, 122));
+			break;
+		case 3:
+			setFrame2(3);
+			setPosition(Common::Point(135, 122));
+			break;
+		default:
+			break;
+		}
+		break;
+	case 3:
+		switch (R2_GLOBALS._ductMazePanel3State) {
+		case 1:
+			setFrame2(3);
+			setPosition(Common::Point(158, 95));
+			break;
+		case 2:
+			setFrame2(2);
+			setPosition(Common::Point(175, 101));
+			break;
+		default:
+			break;
+		}
+		break;
+	default:
+		break;
+	}
+
+	setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL);
+}
+
+bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
+
+	R2_GLOBALS._sound2.play(260);
+	switch (_state) {
+	case 1:
+		if (R2_GLOBALS._ductMazePanel1State == 1) {
+			R2_GLOBALS._ductMazePanel1State = 2;
+			setFrame2(3);
+			setPosition(Common::Point(135, 95));
+		} else {
+			R2_GLOBALS._ductMazePanel1State = 1;
+			setFrame2(2);
+			setPosition(Common::Point(129, 101));
+		}
+		break;
+	case 2:
+		++R2_GLOBALS._ductMazePanel2State;
+		if (R2_GLOBALS._ductMazePanel2State == 4)
+			R2_GLOBALS._ductMazePanel2State = 1;
+
+		switch (R2_GLOBALS._ductMazePanel2State) {
+		case 1:
+			setFrame2(2);
+			setPosition(Common::Point(152, 101));
+			break;
+		case 2:
+			setFrame2(3);
+			setPosition(Common::Point(158, 122));
+			break;
+		case 3:
+			setFrame2(3);
+			setPosition(Common::Point(135, 122));
+			break;
+		default:
+			break;
+		}
+		break;
+	case 3:
+		if (R2_GLOBALS._ductMazePanel3State == 1) {
+			R2_GLOBALS._ductMazePanel3State = 2;
+			setFrame2(2);
+			setPosition(Common::Point(175, 101));
+		} else {
+			R2_GLOBALS._ductMazePanel3State = 1;
+			setFrame2(3);
+			setPosition(Common::Point(158, 95));
+		}
+		break;
+	default:
+		break;
+	}
+
+	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+	scene->_field418 = 0;
+
+	if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
+		scene->_field418 = 1;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
+		scene->_field418 = 2;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
+		scene->_field418 = 3;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
+		scene->_field418 = 4;
+
+	return true;
+}
+
+void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) {
+	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+
+	scene->_field41A = 1;
+	R2_GLOBALS._events.setCursor(CURSOR_USE);
+	setup2(1003, 1, 1, 100, 40);
+	setup3(1200, 11, -1, -1);
+	R2_GLOBALS._sound2.play(259);
+	_jumper1.init(1);
+	_jumper2.init(2);
+	_jumper3.init(3);
+
+	R2_GLOBALS._player._canWalk = false;
+}
+
+void Scene1200::LaserPanel::remove() {
+	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
+
+	scene->_field41A = 0;
+	scene->_sceneAreas.remove(&_jumper1);
+	scene->_sceneAreas.remove(&_jumper2);
+	scene->_sceneAreas.remove(&_jumper3);
+	_jumper1.remove();
+	_jumper2.remove();
+	_jumper3.remove();
+
+	ModalWindow::remove();
+	R2_GLOBALS._player._canWalk = true;
+}
+
+void Scene1200::postInit(SceneObjectList *OwnerList) {
+	loadScene(1200);
+	SceneExt::postInit();
+
+	if (R2_GLOBALS._sceneManager._previousScene < 3200)
+		R2_GLOBALS._sound1.play(257);
+
+	_nextCrawlDirection = CRAWL_EAST;
+	_field414 = 0;
+	_field416 = 0;
+	_field418 = 0;
+	_field41A = 0;
+
+	if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
+		_field418 = 1;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
+		_field418 = 2;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
+		_field418 = 3;
+	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
+		_field418 = 4;
+
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player.disableControl();
+	R2_GLOBALS._player.setup(3156, 1, 6);
+	R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+	R2_GLOBALS._player._numFrames = 10;
+	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200;
+
+	_actor1.postInit();
+	_actor1.hide();
+
+	_mazeUI.setDisplayBounds(Rect(110, 20, 210, 120));
+
+	_mazeUI.postInit();
+	_mazeUI.load(1);
+	_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
+
+	R2_GLOBALS._player.enableControl();
+	_item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL);
+}
+
+void Scene1200::signal() {
+	switch (_sceneMode++) {
+	case 1:
+	// No break on purpose
+	case 1200:
+	// No break on purpose
+	case 1201:
+	// No break on purpose
+	case 1202:
+	// No break on purpose
+	case 1203:
+		R2_GLOBALS._player.enableControl();
+		// CHECKME: The original is calling _eventManager.waitEvent();
+		_sceneMode = 2;
+		break;
+	case 10:
+		_field416 = 1;
+		_field414 = 6;
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.setStrip(1);
+		R2_GLOBALS._player.setFrame(5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 11:
+	// No break on purpose
+	case 21:
+	// No break on purpose
+	case 31:
+	// No break on purpose
+	case 41:
+		_field416 = 0;
+		break;
+	case 12:
+		_field414 = 14;
+		R2_GLOBALS._player._numFrames = 10;
+		R2_GLOBALS._player.setup(3155, 1, 4);
+		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+		break;
+	case 13:
+	// No break on purpose
+	case 16:
+	// No break on purpose
+	case 23:
+	// No break on purpose
+	case 26:
+	// No break on purpose
+	case 33:
+	// No break on purpose
+	case 36:
+	// No break on purpose
+	case 43:
+	// No break on purpose
+	case 46:
+		R2_GLOBALS._player.setFrame(4);
+		_sceneMode = 1;
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 15:
+	// No break on purpose
+	case 25:
+	// No break on purpose
+	case 35:
+	// No break on purpose
+	case 45:
+		_field414 = 20;
+		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+		break;
+	case 20:
+		_field416 = 1;
+		_field414 = 6;
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.setStrip(2);
+		R2_GLOBALS._player.setFrame(5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 22:
+		_field414 = 14;
+		R2_GLOBALS._player._numFrames = 10;
+		R2_GLOBALS._player.setup(3155, 2, 4);
+		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+		break;
+	case 30:
+		_field416 = 1;
+		_field414 = 6;
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.setStrip(3);
+		R2_GLOBALS._player.setFrame(5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 32:
+		_field414 = 14;
+		R2_GLOBALS._player._numFrames = 10;
+		R2_GLOBALS._player.setup(3155, 3, 4);
+		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+		break;
+	case 40:
+		_field416 = 1;
+		_field414 = 6;
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.setStrip(4);
+		R2_GLOBALS._player.setFrame(5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 42:
+		_field414 = 14;
+		R2_GLOBALS._player._numFrames = 10;
+		R2_GLOBALS._player.setup(3155, 4, 4);
+		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
+		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+		break;
+	case 50:
+	// No break on purpose
+	case 55:
+	// No break on purpose
+	case 60:
+		R2_GLOBALS._player.setup(3156, 5, 1);
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 51:
+	// No break on purpose
+	case 56:
+	// No break on purpose
+	case 117:
+		R2_GLOBALS._player.setup(3157, 1, 1);
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 52:
+	// No break on purpose
+	case 82:
+	// No break on purpose
+	case 118:
+		R2_GLOBALS._player.setup(3156, 3, 6);
+		_sceneMode = 1;
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 57:
+	// No break on purpose
+	case 91:
+	// No break on purpose
+	case 96:
+		R2_GLOBALS._player.setup(3157, 2, 1);
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 58:
+	// No break on purpose
+	case 92:
+	// No break on purpose
+	case 122:
+		R2_GLOBALS._player.setup(3156, 2, 6);
+		_sceneMode = 1;
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 61:
+		R2_GLOBALS._player.setup(3157, 4, 5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 62:
+	// No break on purpose
+	case 72:
+	// No break on purpose
+	case 98:
+		R2_GLOBALS._player.setup(3156, 4, 6);
+		_sceneMode = 1;
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 70:
+	// No break on purpose
+	case 75:
+	// No break on purpose
+	case 80:
+		R2_GLOBALS._player.setup(3156, 6, 1);
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 71:
+	// No break on purpose
+	case 76:
+	// No break on purpose
+	case 97:
+		R2_GLOBALS._player.setup(3157, 3, 1);
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 77:
+	// No break on purpose
+	case 111:
+	// No break on purpose
+	case 116:
+		R2_GLOBALS._player.setup(3157, 4, 1);
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 78:
+	// No break on purpose
+	case 102:
+	// No break on purpose
+	case 112:
+		R2_GLOBALS._player.setup(3156, 1, 6);
+		_sceneMode = 1;
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 81:
+		R2_GLOBALS._player.setup(3157, 2, 5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 90:
+	// No break on purpose
+	case 95:
+	// No break on purpose
+	case 100:
+		R2_GLOBALS._player.setup(3156, 7, 1);
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 101:
+		R2_GLOBALS._player.setup(3157, 1, 5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	case 110:
+	// No break on purpose
+	case 115:
+	// No break on purpose
+	case 120:
+		R2_GLOBALS._player.setup(3156, 8, 1);
+		R2_GLOBALS._player._numFrames = 5;
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+		break;
+	case 121:
+		R2_GLOBALS._player.setup(3157, 3, 5);
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
+	default:
+		// CHECKME: The original is walling _eventManager.waitEvent();
+		_sceneMode = 2;
+		break;
+	}
+}
+
+void Scene1200::process(Event &event) {
+	if (_field414 != 0)
+		return;
+
+	Scene::process(event);
+
+	if (!R2_GLOBALS._player._canWalk)
+		return;
+
+	if (event.eventType == EVENT_BUTTON_DOWN) {
+		Common::Point cellPos = R2_GLOBALS._ventCellPos;
+		_mazeUI.pixelToCellXY(cellPos);
+
+		int cellId = _mazeUI.getCellFromPixelXY(event.mousePos);
+		switch (R2_GLOBALS._events.getCursor()) {
+		case CURSOR_WALK:
+			event.handled = true;
+			if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
+				startCrawling(CRAWL_EAST);
+
+			if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
+				startCrawling(CRAWL_WEST);
+
+			if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120))
+				startCrawling(CRAWL_SOUTH);
+
+			if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50))
+				startCrawling(CRAWL_NORTH);
+			break;
+		case CURSOR_USE:
+			if (cellId > 36) {
+				if ( ((cellPos.x == 3)  && (cellPos.y == 33))
+					|| ((cellPos.x == 7)  && (cellPos.y == 33))
+					|| ((cellPos.x == 33) && (cellPos.y == 41))
+					|| ((cellPos.x == 5)  && (cellPos.y == 5))
+					|| ((cellPos.x == 13) && (cellPos.y == 21))
+					|| ((cellPos.x == 17) && (cellPos.y == 21))
+					|| ((cellPos.x == 17) && (cellPos.y == 5))
+					|| ((cellPos.x == 17) && (cellPos.y == 9))
+					|| ((cellPos.x == 29) && (cellPos.y == 17))
+					|| ((cellPos.x == 33) && (cellPos.y == 17))
+					|| ((cellPos.x == 35) && (cellPos.y == 17))
+					|| ((cellPos.x == 41) && (cellPos.y == 21)) ) {
+					_laserPanel.postInit();
+					event.handled = true;
+				}
+			}
+
+			if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) {
+				if ( ((cellPos.x == 3)  && (cellPos.y == 9))
+				  || ((cellPos.x == 11)  && (cellPos.y == 27))
+				  || ((cellPos.x == 17)  && (cellPos.y == 7))
+				  || ((cellPos.x == 17)  && (cellPos.y == 27))
+				  || ((cellPos.x == 17)  && (cellPos.y == 33))
+				  || (cellPos.x == 33) ) {
+					switch (cellPos.x) {
+					case 3:
+						R2_GLOBALS._sceneManager.changeScene(3150);
+						break;
+					case 33:
+						if (R2_GLOBALS._scientistConvIndex >= 4)
+							R2_GLOBALS._sceneManager.changeScene(3250);
+						else
+							SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
+						break;
+					default:
+						SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
+						break;
+					}
+					event.handled = true;
+				}
+			}
+			break;
+		case CURSOR_LOOK:
+			if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) {
+				event.handled = true;
+				switch (cellPos.x) {
+				case 3:
+					// It was your cell.
+					SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+					break;
+				case 9:
+						R2_GLOBALS._sceneManager.changeScene(3240);
+						break;
+				case 11:
+					if (cellPos.y == 27)
+						R2_GLOBALS._sceneManager.changeScene(3210);
+					else
+						// A vent grill
+						SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+					break;
+				case 17:
+					switch (cellPos.y) {
+					case 5:
+						R2_GLOBALS._sceneManager.changeScene(3230);
+						break;
+					case 21:
+						R2_GLOBALS._sceneManager.changeScene(3220);
+						break;
+					case 33:
+						R2_GLOBALS._sceneManager.changeScene(3200);
+						break;
+					default:
+						// A vent grill
+						SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+						break;
+					}
+					break;
+				case 33:
+					R2_GLOBALS._sceneManager.changeScene(3245);
+					break;
+				default:
+					SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+					break;
+				}
+			}
+			if (cellId > 36) {
+				// "An anti-pest laser"
+				event.handled = true;
+				SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+			}
+			break;
+		case CURSOR_TALK:
+			event.handled = true;
+			break;
+		default:
+			return;
+		}
+	} else if (event.eventType == EVENT_KEYPRESS) {
+		if (_field414) {
+			event.handled = false;
+			return;
+		}
+
+		switch (event.kbd.keycode) {
+		case Common::KEYCODE_KP8:
+		case Common::KEYCODE_UP:
+			startCrawling(CRAWL_NORTH);
+			break;
+		case Common::KEYCODE_KP4:
+		case Common::KEYCODE_LEFT:
+			startCrawling(CRAWL_WEST);
+			break;
+		case Common::KEYCODE_KP6:
+		case Common::KEYCODE_RIGHT:
+			startCrawling(CRAWL_EAST);
+			break;
+		case Common::KEYCODE_KP2:
+		case Common::KEYCODE_DOWN:
+			startCrawling(CRAWL_SOUTH);
+			break;
+		default:
+			event.handled = false;
+			return;
+			break;
+		}
+	} else
+		return;
+}
+
+void Scene1200::dispatch() {
+	Rect tmpRect;
+	Scene::dispatch();
+
+	if (_fixupMaze) {
+		_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
+		//_mazeUI.draw();
+		_fixupMaze = false;
+	}
+
+	if (_field414 != 0) {
+		tmpRect.set(110, 20, 210, 120);
+		_field414--;
+
+		switch (_nextCrawlDirection) {
+		case CRAWL_EAST:
+			R2_GLOBALS._ventCellPos.x += 2;
+			break;
+		case CRAWL_WEST:
+			R2_GLOBALS._ventCellPos.x -= 2;
+			break;
+		case CRAWL_SOUTH:
+			R2_GLOBALS._ventCellPos.y += 2;
+			break;
+		case CRAWL_NORTH:
+			R2_GLOBALS._ventCellPos.y -= 2;
+			break;
+		default:
+			break;
+		}
+
+		_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
+		//_mazeUI.draw();
+
+		if (_field416 != 0) {
+			switch(_nextCrawlDirection) {
+			case CRAWL_EAST:
+				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y));
+				break;
+			case CRAWL_WEST:
+				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y));
+				break;
+			case CRAWL_SOUTH:
+				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2));
+				break;
+			case CRAWL_NORTH:
+				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2));
+				break;
+			default:
+				break;
+			}
+		}
+		if (_field414 == 0) {
+			if (_field416 == 0)
+				R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+			signal();
+		}
+	}
+}
+
+void Scene1200::saveCharacter(int characterIndex) {
+	R2_GLOBALS._sound1.fadeOut2(NULL);
+	SceneExt::saveCharacter(characterIndex);
+}
+
+void Scene1200::startCrawling(CrawlDirection dir) {
+	Common::Point cellPos = R2_GLOBALS._ventCellPos;
+	_mazeUI.pixelToCellXY(cellPos);
+
+	switch (dir) {
+	case CRAWL_EAST:
+		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36))
+			&& ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4))
+				|| ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2))
+				|| ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1))
+				|| ((cellPos.x == 33) && (cellPos.y == 41)) )
+				)	{
+			R2_GLOBALS._player.disableControl();
+			_sceneMode = 1200;
+			setAction(&_sequenceManager, this, 1200, &_actor1, NULL);
+		} else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) {
+			switch (_nextCrawlDirection) {
+			case CRAWL_EAST:
+				if (R2_GLOBALS._player._visage == 3155)
+					_sceneMode = 15;
+				else
+					_sceneMode = 10;
+				break;
+			case CRAWL_WEST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 76;
+				else
+					_sceneMode = 75;
+				break;
+			case CRAWL_SOUTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 101;
+				else
+					_sceneMode = 100;
+				break;
+			case CRAWL_NORTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 111;
+				else
+					_sceneMode = 110;
+				break;
+			default:
+				break;
+			}
+			R2_GLOBALS._player.disableControl();
+			_nextCrawlDirection = 1;
+			signal();
+		}
+		break;
+	case CRAWL_WEST:
+		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36))
+			&& ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4))
+				|| ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2))
+				|| ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1))
+				|| ((cellPos.x == 5) && (cellPos.y == 5)) )
+				)	{
+			R2_GLOBALS._player.disableControl();
+			_sceneMode = 1201;
+			setAction(&_sequenceManager, this, 1201, &_actor1, NULL);
+		} else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) {
+			switch (_nextCrawlDirection) {
+			case CRAWL_EAST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 56;
+				else
+					_sceneMode = 55;
+				break;
+			case CRAWL_WEST:
+				if (R2_GLOBALS._player._visage == 3155)
+					_sceneMode = 25;
+				else
+					_sceneMode = 20;
+				break;
+			case CRAWL_SOUTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 91;
+				else
+					_sceneMode = 90;
+				break;
+			case CRAWL_NORTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 121;
+				else
+					_sceneMode = 120;
+				break;
+			default:
+				break;
+			}
+			R2_GLOBALS._player.disableControl();
+			_nextCrawlDirection = 2;
+			signal();
+		}
+		break;
+	case CRAWL_SOUTH:
+		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36))
+			&& ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3))
+				|| ((cellPos.x == 41) && (cellPos.y == 21)) )
+				)	{
+			R2_GLOBALS._player.disableControl();
+			_sceneMode = 1203;
+			setAction(&_sequenceManager, this, 1203, &_actor1, NULL);
+		} else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) {
+			switch (_nextCrawlDirection) {
+			case CRAWL_EAST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 51;
+				else
+					_sceneMode = 50;
+				break;
+			case CRAWL_WEST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 81;
+				else
+					_sceneMode = 80;
+				break;
+			case CRAWL_SOUTH:
+				if (R2_GLOBALS._player._visage == 3155)
+					_sceneMode = 35;
+				else
+					_sceneMode = 30;
+				break;
+			case CRAWL_NORTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 116;
+				else
+					_sceneMode = 115;
+				break;
+			default:
+				break;
+			}
+			R2_GLOBALS._player.disableControl();
+			_nextCrawlDirection = 3;
+			signal();
+		}
+		break;
+	case CRAWL_NORTH:
+		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36))
+			&& ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3))
+				|| ((cellPos.x == 35) && (cellPos.y == 17)) )
+				)	{
+			R2_GLOBALS._player.disableControl();
+			_sceneMode = 1202;
+			setAction(&_sequenceManager, this, 1202, &_actor1, NULL);
+		} else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) {
+			switch (_nextCrawlDirection) {
+			case CRAWL_EAST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 61;
+				else
+					_sceneMode = 60;
+				break;
+			case CRAWL_WEST:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 71;
+				else
+					_sceneMode = 70;
+				break;
+			case CRAWL_SOUTH:
+				if (R2_GLOBALS._player._visage == 3156)
+					_sceneMode = 96;
+				else
+					_sceneMode = 95;
+				break;
+			case CRAWL_NORTH:
+				if (R2_GLOBALS._player._visage == 3155)
+					_sceneMode = 45;
+				else
+					_sceneMode = 40;
+				break;
+			default:
+				_sceneMode = 1;
+				R2_GLOBALS._player.setup(3156, 4, 6);
+				break;
+			}
+			R2_GLOBALS._player.disableControl();
+			_nextCrawlDirection = 4;
+			signal();
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_airduct.h b/engines/tsage/ringworld2/ringworld2_airduct.h
new file mode 100644
index 0000000..4a89f58
--- /dev/null
+++ b/engines/tsage/ringworld2/ringworld2_airduct.h
@@ -0,0 +1,90 @@
+/* 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.
+ *
+ */
+
+#ifndef TSAGE_RINGWORLD2_AIRDUCT_H
+#define TSAGE_RINGWORLD2_AIRDUCT_H
+
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+#include "tsage/ringworld2/ringworld2_logic.h"
+
+namespace TsAGE {
+
+namespace Ringworld2 {
+
+using namespace TsAGE;
+
+class Scene1200 : public SceneExt {
+	enum CrawlDirection { CRAWL_EAST = 1, CRAWL_WEST = 2, CRAWL_SOUTH = 3, CRAWL_NORTH = 4 };
+
+	class LaserPanel: public ModalWindow {
+	public:
+		class Jumper : public SceneActorExt {
+		public:
+			void init(int state);
+			virtual bool startAction(CursorType action, Event &event);
+		};
+
+		Jumper _jumper1;
+		Jumper _jumper2;
+		Jumper _jumper3;
+
+		LaserPanel();
+
+		virtual void postInit(SceneObjectList *OwnerList = NULL);
+		virtual void remove();
+	};
+
+public:
+	NamedHotspot _item1;
+	SceneActor _actor1;
+	LaserPanel _laserPanel;
+	MazeUI _mazeUI;
+	SequenceManager _sequenceManager;
+
+	int _nextCrawlDirection;
+	int _field414;
+	int _field416;
+	int _field418;
+	int _field41A;
+	bool _fixupMaze;
+
+	Scene1200();
+	void synchronize(Serializer &s);
+
+	void startCrawling(CrawlDirection dir);
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void process(Event &event);
+	virtual void dispatch();
+	virtual void saveCharacter(int characterIndex);
+};
+
+} // End of namespace Ringworld2
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index a04fd56..d245419 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -32,7 +32,9 @@
 #include "tsage/ringworld2/ringworld2_scenes1.h"
 #include "tsage/ringworld2/ringworld2_scenes2.h"
 #include "tsage/ringworld2/ringworld2_scenes3.h"
+#include "tsage/ringworld2/ringworld2_airduct.h"
 #include "tsage/ringworld2/ringworld2_outpost.h"
+#include "tsage/ringworld2/ringworld2_vampire.h"
 
 namespace TsAGE {
 
diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
index 51879f1..81dc05e 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp
@@ -1321,1249 +1321,827 @@ void Scene1100::saveCharacter(int characterIndex) {
 }
 
 /*--------------------------------------------------------------------------
- * Scene 1200 - Air Ducts Maze
+ * Scene 1500 - Cutscene: Ship landing
  *
  *--------------------------------------------------------------------------*/
 
-Scene1200::Scene1200() {
-	_nextCrawlDirection = 0;
-	_field414 = 0;
-	_field416 = 0;
-	_field418 = 0;
-	_field41A = 0;
-	_fixupMaze = false;
-}
+void Scene1500::postInit(SceneObjectList *OwnerList) {
+	loadScene(1500);
+	R2_GLOBALS._uiElements._active = false;
+	setZoomPercents(170, 13, 240, 100);
+	SceneExt::postInit();
+	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
 
-void Scene1200::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
+	scalePalette(65, 65, 65);
 
-	s.syncAsSint16LE(_nextCrawlDirection);
-	s.syncAsSint16LE(_field414);
-	s.syncAsSint16LE(_field416);
-	s.syncAsSint16LE(_field418);
-	s.syncAsSint16LE(_field41A);
-	s.syncAsSint16LE(_fixupMaze);
-}
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player.hide();
+	R2_GLOBALS._player.disableControl();
+
+	_starshipShadow.postInit();
+	_starshipShadow.setup(1401, 1, 1);
+	_starshipShadow._effect = EFFECT_SHADOW_MAP;
+	_starshipShadow.fixPriority(10);
+	_starshipShadow._shadowMap = _shadowPaletteMap;
+
+	_starship.postInit();
+	_starship.setup(1400, 1, 1);
+	_starship._moveDiff = Common::Point(1, 1);
+	_starship._linkedActor = &_starshipShadow;
+
+	if (R2_GLOBALS._sceneManager._previousScene != 1010) {
+		_smallShipShadow.postInit();
+		_smallShipShadow.setup(1401, 2, 1);
+		_smallShipShadow._effect = EFFECT_SHADOW_MAP;
+		_smallShipShadow.fixPriority(10);
+		_smallShipShadow._shadowMap = _shadowPaletteMap;
+
+		_smallShip.postInit();
+		_smallShip._moveRate = 30;
+		_smallShip._moveDiff = Common::Point(1, 1);
+		_smallShip._linkedActor = &_smallShipShadow;
+	}
+
+	if (R2_GLOBALS._sceneManager._previousScene == 300) {
+		_starship.setPosition(Common::Point(189, 139), 5);
+
+		_smallShip.setup(1400, 1, 2);
+		_smallShip.setPosition(Common::Point(148, 108), 0);
+
+		_sceneMode = 20;
+		R2_GLOBALS._sound1.play(110);
+	} else if (R2_GLOBALS._sceneManager._previousScene == 1550) {
+		_starship.setPosition(Common::Point(189, 139), 5);
+
+		_smallShip.setup(1400, 2, 1);
+		_smallShip.changeZoom(-1);
+		_smallShip.setPosition(Common::Point(298, 258), 5);
+
+		_sceneMode = 10;
+		R2_GLOBALS._sound1.play(106);
+	} else {
+		_starship.setPosition(Common::Point(289, 239), -30);
+		_sceneMode = 0;
+		R2_GLOBALS._sound1.play(102);
+	}
 
-Scene1200::LaserPanel::LaserPanel() {
+	signal();
 }
 
-void Scene1200::LaserPanel::Jumper::init(int state) {
-	_state = state;
+void Scene1500::remove() {
+	R2_GLOBALS._uiElements._active = true;
+	R2_GLOBALS._uiElements._visible = true;
 
-	SceneActor::postInit();
-	setup(1003, 1, 1);
-	fixPriority(255);
+	SceneExt::remove();
+}
 
-	switch (_state) {
+void Scene1500::signal() {
+	switch(_sceneMode++) {
+	case 0:
+		R2_GLOBALS.setFlag(25);
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+	// No break on purpose
 	case 1:
-		switch (R2_GLOBALS._ductMazePanel1State) {
-		case 1:
-			setFrame2(2);
-			setPosition(Common::Point(129, 101));
-			break;
-		case 2:
-			setFrame2(3);
-			setPosition(Common::Point(135, 95));
-			break;
-		default:
-			break;
+		if (_starship._yDiff < 50) {
+			_starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1);
+			_sceneMode = 1;
 		}
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
 		break;
-	case 2:
-		switch (R2_GLOBALS._ductMazePanel2State) {
-		case 1:
-			setFrame2(2);
-			setPosition(Common::Point(152, 101));
-			break;
-		case 2:
-			setFrame2(3);
-			setPosition(Common::Point(158, 122));
-			break;
-		case 3:
-			setFrame2(3);
-			setPosition(Common::Point(135, 122));
-			break;
-		default:
-			break;
+	case 2: {
+		Common::Point pt(189, 139);
+		NpcMover *mover = new NpcMover();
+		_starship.addMover(mover, &pt, this);
 		}
 		break;
 	case 3:
-		switch (R2_GLOBALS._ductMazePanel3State) {
-		case 1:
-			setFrame2(3);
-			setPosition(Common::Point(158, 95));
-			break;
-		case 2:
-			setFrame2(2);
-			setPosition(Common::Point(175, 101));
-			break;
-		default:
-			break;
+		if (_starship._yDiff > 5) {
+			_starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1);
+			_sceneMode = 3;
 		}
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
 		break;
-	default:
+	case 13:
+		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+	// No break on purpose
+	case 4:
+		R2_GLOBALS._sceneManager.changeScene(300);
 		break;
-	}
-
-	setDetails(1200, 12, -1, -1, 2, (SceneItem *) NULL);
-}
-
-bool Scene1200::LaserPanel::Jumper::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	R2_GLOBALS._sound2.play(260);
-	switch (_state) {
-	case 1:
-		if (R2_GLOBALS._ductMazePanel1State == 1) {
-			R2_GLOBALS._ductMazePanel1State = 2;
-			setFrame2(3);
-			setPosition(Common::Point(135, 95));
-		} else {
-			R2_GLOBALS._ductMazePanel1State = 1;
-			setFrame2(2);
-			setPosition(Common::Point(129, 101));
+	case 10:
+	// No break on purpose
+	case 20:
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 11: {
+		Common::Point pt(148, 108);
+		NpcMover *mover = new NpcMover();
+		_smallShip.addMover(mover, &pt, this);
 		}
 		break;
-	case 2:
-		++R2_GLOBALS._ductMazePanel2State;
-		if (R2_GLOBALS._ductMazePanel2State == 4)
-			R2_GLOBALS._ductMazePanel2State = 1;
-
-		switch (R2_GLOBALS._ductMazePanel2State) {
-		case 1:
-			setFrame2(2);
-			setPosition(Common::Point(152, 101));
-			break;
-		case 2:
-			setFrame2(3);
-			setPosition(Common::Point(158, 122));
-			break;
-		case 3:
-			setFrame2(3);
-			setPosition(Common::Point(135, 122));
-			break;
-		default:
-			break;
+	case 12:
+		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+		break;
+	case 21: {
+		Common::Point pt(-2, -42);
+		NpcMover *mover = new NpcMover();
+		_smallShip.addMover(mover, &pt, NULL);
+		signal();
 		}
 		break;
-	case 3:
-		if (R2_GLOBALS._ductMazePanel3State == 1) {
-			R2_GLOBALS._ductMazePanel3State = 2;
-			setFrame2(2);
-			setPosition(Common::Point(175, 101));
-		} else {
-			R2_GLOBALS._ductMazePanel3State = 1;
-			setFrame2(3);
-			setPosition(Common::Point(158, 95));
+	case 22:
+		if (_starship._yDiff < 50) {
+			_starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1);
+			_sceneMode = 22;
+		}
+		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		break;
+	case 23: {
+		Common::Point pt(-13, -61);
+		NpcMover *mover = new NpcMover();
+		_starship.addMover(mover, &pt, this);
 		}
 		break;
+	case 24:
+		R2_GLOBALS._sceneManager.changeScene(1550);
+		break;
 	default:
 		break;
 	}
-
-	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
-	scene->_field418 = 0;
-
-	if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
-		scene->_field418 = 1;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
-		scene->_field418 = 2;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
-		scene->_field418 = 3;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
-		scene->_field418 = 4;
-
-	return true;
 }
 
-void Scene1200::LaserPanel::postInit(SceneObjectList *OwnerList) {
-	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
-
-	scene->_field41A = 1;
-	R2_GLOBALS._events.setCursor(CURSOR_USE);
-	setup2(1003, 1, 1, 100, 40);
-	setup3(1200, 11, -1, -1);
-	R2_GLOBALS._sound2.play(259);
-	_jumper1.init(1);
-	_jumper2.init(2);
-	_jumper3.init(3);
+void Scene1500::dispatch() {
+	if (_sceneMode > 10) {
+		float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y));
+		if (yDiff > 6)
+			_smallShip.setPosition(_smallShip._position, (int) yDiff);
+	}
 
-	R2_GLOBALS._player._canWalk = false;
+	Scene::dispatch();
 }
 
-void Scene1200::LaserPanel::remove() {
-	Scene1200 *scene = (Scene1200 *)R2_GLOBALS._sceneManager._scene;
-
-	scene->_field41A = 0;
-	scene->_sceneAreas.remove(&_jumper1);
-	scene->_sceneAreas.remove(&_jumper2);
-	scene->_sceneAreas.remove(&_jumper3);
-	_jumper1.remove();
-	_jumper2.remove();
-	_jumper3.remove();
-
-	ModalWindow::remove();
-	R2_GLOBALS._player._canWalk = true;
-}
+/*--------------------------------------------------------------------------
+ * Scene 1525 - Cutscene - Ship
+ *
+ *--------------------------------------------------------------------------*/
 
-void Scene1200::postInit(SceneObjectList *OwnerList) {
-	loadScene(1200);
+void Scene1525::postInit(SceneObjectList *OwnerList) {
+	loadScene(1525);
+	R2_GLOBALS._uiElements._active = false;
 	SceneExt::postInit();
 
-	if (R2_GLOBALS._sceneManager._previousScene < 3200)
-		R2_GLOBALS._sound1.play(257);
-
-	_nextCrawlDirection = CRAWL_EAST;
-	_field414 = 0;
-	_field416 = 0;
-	_field418 = 0;
-	_field41A = 0;
-
-	if ((R2_GLOBALS._ductMazePanel1State == 1) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
-		_field418 = 1;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 1))
-		_field418 = 2;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 1) && (R2_GLOBALS._ductMazePanel3State == 2))
-		_field418 = 3;
-	else if ((R2_GLOBALS._ductMazePanel1State == 2) && (R2_GLOBALS._ductMazePanel2State == 3) && (R2_GLOBALS._ductMazePanel3State == 1))
-		_field418 = 4;
-
 	R2_GLOBALS._player.postInit();
+	if (R2_GLOBALS._sceneManager._previousScene == 525)
+		R2_GLOBALS._player.setup(1525, 1, 1);
+	else
+		R2_GLOBALS._player.setup(1525, 1, 16);
+	R2_GLOBALS._player.setPosition(Common::Point(244, 148));
 	R2_GLOBALS._player.disableControl();
-	R2_GLOBALS._player.setup(3156, 1, 6);
-	R2_GLOBALS._player.setPosition(Common::Point(160, 70));
-	R2_GLOBALS._player._numFrames = 10;
-	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1200;
-
-	_actor1.postInit();
-	_actor1.hide();
-
-	_mazeUI.setDisplayBounds(Rect(110, 20, 210, 120));
 
-	_mazeUI.postInit();
-	_mazeUI.load(1);
-	_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
-
-	R2_GLOBALS._player.enableControl();
-	_item1.setDetails(Rect(0, 0, 320, 200), 1200, 0, 1, 2, 1, NULL);
+	_sceneMode = 0;
+	setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
 }
 
-void Scene1200::signal() {
+void Scene1525::signal() {
 	switch (_sceneMode++) {
-	case 1:
-	// No break on purpose
-	case 1200:
-	// No break on purpose
-	case 1201:
-	// No break on purpose
-	case 1202:
-	// No break on purpose
-	case 1203:
-		R2_GLOBALS._player.enableControl();
-		// CHECKME: The original is calling _eventManager.waitEvent();
-		_sceneMode = 2;
-		break;
-	case 10:
-		_field416 = 1;
-		_field414 = 6;
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.setStrip(1);
-		R2_GLOBALS._player.setFrame(5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+	case 0:
+		if (R2_GLOBALS._sceneManager._previousScene == 525)
+			setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL);
+		else
+			setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL);
 		break;
-	case 11:
-	// No break on purpose
-	case 21:
-	// No break on purpose
-	case 31:
-	// No break on purpose
-	case 41:
-		_field416 = 0;
+	case 1:
+		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
 		break;
-	case 12:
-		_field414 = 14;
-		R2_GLOBALS._player._numFrames = 10;
-		R2_GLOBALS._player.setup(3155, 1, 4);
-		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
-		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
-		break;
-	case 13:
-	// No break on purpose
-	case 16:
-	// No break on purpose
-	case 23:
-	// No break on purpose
-	case 26:
-	// No break on purpose
-	case 33:
-	// No break on purpose
-	case 36:
-	// No break on purpose
-	case 43:
-	// No break on purpose
-	case 46:
-		R2_GLOBALS._player.setFrame(4);
-		_sceneMode = 1;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 15:
-	// No break on purpose
-	case 25:
-	// No break on purpose
-	case 35:
-	// No break on purpose
-	case 45:
-		_field414 = 20;
-		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
-		break;
-	case 20:
-		_field416 = 1;
-		_field414 = 6;
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.setStrip(2);
-		R2_GLOBALS._player.setFrame(5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 22:
-		_field414 = 14;
-		R2_GLOBALS._player._numFrames = 10;
-		R2_GLOBALS._player.setup(3155, 2, 4);
-		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
-		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
-		break;
-	case 30:
-		_field416 = 1;
-		_field414 = 6;
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.setStrip(3);
-		R2_GLOBALS._player.setFrame(5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 32:
-		_field414 = 14;
-		R2_GLOBALS._player._numFrames = 10;
-		R2_GLOBALS._player.setup(3155, 3, 4);
-		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
-		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
-		break;
-	case 40:
-		_field416 = 1;
-		_field414 = 6;
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.setStrip(4);
-		R2_GLOBALS._player.setFrame(5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 42:
-		_field414 = 14;
-		R2_GLOBALS._player._numFrames = 10;
-		R2_GLOBALS._player.setup(3155, 4, 4);
-		R2_GLOBALS._player.setPosition(Common::Point(160, 70));
-		R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
-		break;
-	case 50:
-	// No break on purpose
-	case 55:
-	// No break on purpose
-	case 60:
-		R2_GLOBALS._player.setup(3156, 5, 1);
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 51:
-	// No break on purpose
-	case 56:
-	// No break on purpose
-	case 117:
-		R2_GLOBALS._player.setup(3157, 1, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 52:
-	// No break on purpose
-	case 82:
-	// No break on purpose
-	case 118:
-		R2_GLOBALS._player.setup(3156, 3, 6);
-		_sceneMode = 1;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 57:
-	// No break on purpose
-	case 91:
-	// No break on purpose
-	case 96:
-		R2_GLOBALS._player.setup(3157, 2, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 58:
-	// No break on purpose
-	case 92:
-	// No break on purpose
-	case 122:
-		R2_GLOBALS._player.setup(3156, 2, 6);
-		_sceneMode = 1;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 61:
-		R2_GLOBALS._player.setup(3157, 4, 5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 62:
-	// No break on purpose
-	case 72:
-	// No break on purpose
-	case 98:
-		R2_GLOBALS._player.setup(3156, 4, 6);
-		_sceneMode = 1;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 70:
-	// No break on purpose
-	case 75:
-	// No break on purpose
-	case 80:
-		R2_GLOBALS._player.setup(3156, 6, 1);
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 71:
-	// No break on purpose
-	case 76:
-	// No break on purpose
-	case 97:
-		R2_GLOBALS._player.setup(3157, 3, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 77:
-	// No break on purpose
-	case 111:
-	// No break on purpose
-	case 116:
-		R2_GLOBALS._player.setup(3157, 4, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 78:
-	// No break on purpose
-	case 102:
-	// No break on purpose
-	case 112:
-		R2_GLOBALS._player.setup(3156, 1, 6);
-		_sceneMode = 1;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 81:
-		R2_GLOBALS._player.setup(3157, 2, 5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 90:
-	// No break on purpose
-	case 95:
-	// No break on purpose
-	case 100:
-		R2_GLOBALS._player.setup(3156, 7, 1);
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 101:
-		R2_GLOBALS._player.setup(3157, 1, 5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 110:
-	// No break on purpose
-	case 115:
-	// No break on purpose
-	case 120:
-		R2_GLOBALS._player.setup(3156, 8, 1);
-		R2_GLOBALS._player._numFrames = 5;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 121:
-		R2_GLOBALS._player.setup(3157, 3, 5);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	default:
-		// CHECKME: The original is walling _eventManager.waitEvent();
-		_sceneMode = 2;
+	case 2:
+		if (R2_GLOBALS._sceneManager._previousScene == 1530)
+			R2_GLOBALS._sceneManager.changeScene(1550);
+		else
+			R2_GLOBALS._sceneManager.changeScene(1530);
+	default:
 		break;
 	}
 }
 
-void Scene1200::process(Event &event) {
-	if (_field414 != 0)
-		return;
+/*--------------------------------------------------------------------------
+ * Scene 1530 - Cutscene - Crashing on Rimwall
+ *
+ *--------------------------------------------------------------------------*/
 
-	Scene::process(event);
+void Scene1530::postInit(SceneObjectList *OwnerList) {
+	if (R2_GLOBALS._sceneManager._previousScene == 1000)
+		loadScene(1650);
+	else if (R2_GLOBALS._sceneManager._previousScene == 1580)
+		loadScene(1550);
+	else
+		loadScene(1530);
 
-	if (!R2_GLOBALS._player._canWalk)
-		return;
+	R2_GLOBALS._uiElements._active = false;
+	SceneExt::postInit();
+	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
 
-	if (event.eventType == EVENT_BUTTON_DOWN) {
-		Common::Point cellPos = R2_GLOBALS._ventCellPos;
-		_mazeUI.pixelToCellXY(cellPos);
+	_stripManager.addSpeaker(&_quinnSpeaker);
+	_stripManager.addSpeaker(&_seekerSpeaker);
 
-		int cellId = _mazeUI.getCellFromPixelXY(event.mousePos);
-		switch (R2_GLOBALS._events.getCursor()) {
-		case CURSOR_WALK:
-			event.handled = true;
-			if ((event.mousePos.x > 179) && (event.mousePos.x < 210) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
-				startCrawling(CRAWL_EAST);
+	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
+		R2_GLOBALS._player.postInit();
+		R2_GLOBALS._player.hide();
+		R2_GLOBALS._player.disableControl();
 
-			if ((event.mousePos.x > 109) && (event.mousePos.x < 140) && (event.mousePos.y > 50) && (event.mousePos.y < 89))
-				startCrawling(CRAWL_WEST);
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(538, this);
+		R2_GLOBALS._sound1.play(114);
 
-			if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 89) && (event.mousePos.y < 120))
-				startCrawling(CRAWL_SOUTH);
+		_sceneMode = 3;
+	} else if (R2_GLOBALS._sceneManager._previousScene == 1580) {
+		R2_GLOBALS._player.postInit();
+		R2_GLOBALS._player._characterIndex = R2_QUINN;
+		R2_GLOBALS._player.setObjectWrapper(NULL);
+		R2_GLOBALS._player.setup(1516, 6, 1);
+		R2_GLOBALS._player.setPosition(Common::Point(160, 125));
+		R2_GLOBALS._player._moveRate = 30;
+		R2_GLOBALS._player._moveDiff = Common::Point(4, 1);
 
-			if ((event.mousePos.x > 140) && (event.mousePos.x < 179) && (event.mousePos.y > 19) && (event.mousePos.y < 50))
-				startCrawling(CRAWL_NORTH);
-			break;
-		case CURSOR_USE:
-			if (cellId > 36) {
-				if ( ((cellPos.x == 3)  && (cellPos.y == 33))
-					|| ((cellPos.x == 7)  && (cellPos.y == 33))
-					|| ((cellPos.x == 33) && (cellPos.y == 41))
-					|| ((cellPos.x == 5)  && (cellPos.y == 5))
-					|| ((cellPos.x == 13) && (cellPos.y == 21))
-					|| ((cellPos.x == 17) && (cellPos.y == 21))
-					|| ((cellPos.x == 17) && (cellPos.y == 5))
-					|| ((cellPos.x == 17) && (cellPos.y == 9))
-					|| ((cellPos.x == 29) && (cellPos.y == 17))
-					|| ((cellPos.x == 33) && (cellPos.y == 17))
-					|| ((cellPos.x == 35) && (cellPos.y == 17))
-					|| ((cellPos.x == 41) && (cellPos.y == 21)) ) {
-					_laserPanel.postInit();
-					event.handled = true;
-				}
-			}
+		_leftReactor.postInit();
+		_leftReactor.setup(1516, 7, 1);
+		_leftReactor.setPosition(Common::Point(121, 41));
+		_leftReactor.animate(ANIM_MODE_2, NULL);
 
-			if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) {
-				if ( ((cellPos.x == 3)  && (cellPos.y == 9))
-				  || ((cellPos.x == 11)  && (cellPos.y == 27))
-				  || ((cellPos.x == 17)  && (cellPos.y == 7))
-				  || ((cellPos.x == 17)  && (cellPos.y == 27))
-				  || ((cellPos.x == 17)  && (cellPos.y == 33))
-				  || (cellPos.x == 33) ) {
-					switch (cellPos.x) {
-					case 3:
-						R2_GLOBALS._sceneManager.changeScene(3150);
-						break;
-					case 33:
-						if (R2_GLOBALS._scientistConvIndex >= 4)
-							R2_GLOBALS._sceneManager.changeScene(3250);
-						else
-							SceneItem::display(1200, 6, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
-						break;
-					default:
-						SceneItem::display(1200, 5, 0, 280, 1, 160, 9, 1, 2, 20, 7, 154, LIST_END);
-						break;
-					}
-					event.handled = true;
-				}
-			}
-			break;
-		case CURSOR_LOOK:
-			if ((cellId == 1) || (cellId == 4) || (cellId == 11) || (cellId == 14)) {
-				event.handled = true;
-				switch (cellPos.x) {
-				case 3:
-					// It was your cell.
-					SceneItem::display(1200, 8, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-					break;
-				case 9:
-						R2_GLOBALS._sceneManager.changeScene(3240);
-						break;
-				case 11:
-					if (cellPos.y == 27)
-						R2_GLOBALS._sceneManager.changeScene(3210);
-					else
-						// A vent grill
-						SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-					break;
-				case 17:
-					switch (cellPos.y) {
-					case 5:
-						R2_GLOBALS._sceneManager.changeScene(3230);
-						break;
-					case 21:
-						R2_GLOBALS._sceneManager.changeScene(3220);
-						break;
-					case 33:
-						R2_GLOBALS._sceneManager.changeScene(3200);
-						break;
-					default:
-						// A vent grill
-						SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-						break;
-					}
-					break;
-				case 33:
-					R2_GLOBALS._sceneManager.changeScene(3245);
-					break;
-				default:
-					SceneItem::display(1200, 10, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-					break;
-				}
-			}
-			if (cellId > 36) {
-				// "An anti-pest laser"
-				event.handled = true;
-				SceneItem::display(1200, 9, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-			}
-			break;
-		case CURSOR_TALK:
-			event.handled = true;
-			break;
-		default:
-			return;
-		}
-	} else if (event.eventType == EVENT_KEYPRESS) {
-		if (_field414) {
-			event.handled = false;
-			return;
-		}
+		_rightReactor.postInit();
+		_rightReactor.setup(1516, 8, 1);
+		_rightReactor.setPosition(Common::Point(107, 116));
+		_rightReactor.animate(ANIM_MODE_2, NULL);
 
-		switch (event.kbd.keycode) {
-		case Common::KEYCODE_KP8:
-		case Common::KEYCODE_UP:
-			startCrawling(CRAWL_NORTH);
-			break;
-		case Common::KEYCODE_KP4:
-		case Common::KEYCODE_LEFT:
-			startCrawling(CRAWL_WEST);
-			break;
-		case Common::KEYCODE_KP6:
-		case Common::KEYCODE_RIGHT:
-			startCrawling(CRAWL_EAST);
-			break;
-		case Common::KEYCODE_KP2:
-		case Common::KEYCODE_DOWN:
-			startCrawling(CRAWL_SOUTH);
-			break;
-		default:
-			event.handled = false;
-			return;
-			break;
-		}
-	} else
-		return;
-}
+		R2_GLOBALS._player.disableControl();
+		Common::Point pt(480, 75);
+		NpcMover *mover = new NpcMover();
+		R2_GLOBALS._player.addMover(mover, &pt, this);
+		R2_GLOBALS._sound1.play(111);
 
-void Scene1200::dispatch() {
-	Rect tmpRect;
-	Scene::dispatch();
+		_sceneMode = 1;
+	} else {
+		_seeker.postInit();
+		_seeker._effect = EFFECT_SHADED;
 
-	if (_fixupMaze) {
-		_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
-		//_mazeUI.draw();
-		_fixupMaze = false;
-	}
+		R2_GLOBALS._player.postInit();
+		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+		R2_GLOBALS._player.disableControl();
 
-	if (_field414 != 0) {
-		tmpRect.set(110, 20, 210, 120);
-		_field414--;
+		setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL);
 
-		switch (_nextCrawlDirection) {
-		case CRAWL_EAST:
-			R2_GLOBALS._ventCellPos.x += 2;
-			break;
-		case CRAWL_WEST:
-			R2_GLOBALS._ventCellPos.x -= 2;
-			break;
-		case CRAWL_SOUTH:
-			R2_GLOBALS._ventCellPos.y += 2;
-			break;
-		case CRAWL_NORTH:
-			R2_GLOBALS._ventCellPos.y -= 2;
-			break;
-		default:
-			break;
-		}
+		_sceneMode = 2;
+	}
 
-		_mazeUI.setMazePosition(R2_GLOBALS._ventCellPos);
-		//_mazeUI.draw();
+}
 
-		if (_field416 != 0) {
-			switch(_nextCrawlDirection) {
-			case CRAWL_EAST:
-				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x - 2, R2_GLOBALS._player._position.y));
-				break;
-			case CRAWL_WEST:
-				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x + 2, R2_GLOBALS._player._position.y));
-				break;
-			case CRAWL_SOUTH:
-				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 2));
-				break;
-			case CRAWL_NORTH:
-				R2_GLOBALS._player.setPosition(Common::Point(R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 2));
-				break;
-			default:
-				break;
-			}
-		}
-		if (_field414 == 0) {
-			if (_field416 == 0)
-				R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
-			signal();
-		}
+void Scene1530::signal() {
+	switch (_sceneMode - 1) {
+	case 0:
+		R2_GLOBALS._sceneManager.changeScene(1000);
+		break;
+	case 1:
+		R2_GLOBALS._sceneManager.changeScene(1525);
+		break;
+	case 2:
+		R2_GLOBALS._player.disableControl();
+		_sceneMode = 4;
+		R2_GLOBALS._player.show();
+		setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL);
+		break;
+	case 3:
+		R2_GLOBALS._sceneManager.changeScene(1700);
+		break;
+	default:
+		break;
 	}
 }
 
-void Scene1200::saveCharacter(int characterIndex) {
-	R2_GLOBALS._sound1.fadeOut2(NULL);
-	SceneExt::saveCharacter(characterIndex);
+void Scene1530::dispatch() {
+	int16 x = R2_GLOBALS._player._position.x;
+	int16 y = R2_GLOBALS._player._position.y;
+
+	_leftReactor.setPosition(Common::Point(x - 39, y - 85));
+	_rightReactor.setPosition(Common::Point(x - 53, y - 9));
+
+	Scene::dispatch();
 }
 
-void Scene1200::startCrawling(CrawlDirection dir) {
-	Common::Point cellPos = R2_GLOBALS._ventCellPos;
-	_mazeUI.pixelToCellXY(cellPos);
+/*--------------------------------------------------------------------------
+ * Scene 1550 - Spaceport
+ *
+ *--------------------------------------------------------------------------*/
 
-	switch (dir) {
-	case CRAWL_EAST:
-		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(200, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(200, 88)) > 36))
-			&& ( ((cellPos.x == 3) && (cellPos.y == 33) && (_field418 != 4))
-				|| ((cellPos.x == 13) && (cellPos.y == 21) && (_field418 != 2))
-				|| ((cellPos.x == 29) && (cellPos.y == 17) && (_field418 != 1))
-				|| ((cellPos.x == 33) && (cellPos.y == 41)) )
-				)	{
-			R2_GLOBALS._player.disableControl();
-			_sceneMode = 1200;
-			setAction(&_sequenceManager, this, 1200, &_actor1, NULL);
-		} else if (_mazeUI.getCellFromPixelXY(Common::Point(200, 69)) == 36) {
-			switch (_nextCrawlDirection) {
-			case CRAWL_EAST:
-				if (R2_GLOBALS._player._visage == 3155)
-					_sceneMode = 15;
-				else
-					_sceneMode = 10;
-				break;
-			case CRAWL_WEST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 76;
-				else
-					_sceneMode = 75;
-				break;
-			case CRAWL_SOUTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 101;
-				else
-					_sceneMode = 100;
-				break;
-			case CRAWL_NORTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 111;
-				else
-					_sceneMode = 110;
-				break;
-			default:
-				break;
-			}
-			R2_GLOBALS._player.disableControl();
-			_nextCrawlDirection = 1;
-			signal();
-		}
-		break;
-	case CRAWL_WEST:
-		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(120, 50)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(120, 88)) > 36))
-			&& ( ((cellPos.x == 7) && (cellPos.y == 33) && (_field418 != 4))
-				|| ((cellPos.x == 17) && (cellPos.y == 21) && (_field418 != 2))
-				|| ((cellPos.x == 33) && (cellPos.y == 17) && (_field418 != 1))
-				|| ((cellPos.x == 5) && (cellPos.y == 5)) )
-				)	{
-			R2_GLOBALS._player.disableControl();
-			_sceneMode = 1201;
-			setAction(&_sequenceManager, this, 1201, &_actor1, NULL);
-		} else if (_mazeUI.getCellFromPixelXY(Common::Point(120, 69)) == 36) {
-			switch (_nextCrawlDirection) {
-			case CRAWL_EAST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 56;
-				else
-					_sceneMode = 55;
-				break;
-			case CRAWL_WEST:
-				if (R2_GLOBALS._player._visage == 3155)
-					_sceneMode = 25;
-				else
-					_sceneMode = 20;
-				break;
-			case CRAWL_SOUTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 91;
-				else
-					_sceneMode = 90;
-				break;
-			case CRAWL_NORTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 121;
-				else
-					_sceneMode = 120;
-				break;
-			default:
-				break;
-			}
+Scene1550::Junk::Junk() {
+	_junkNumber = 0;
+}
+
+void Scene1550::Junk::synchronize(Serializer &s) {
+	SceneActor::synchronize(s);
+
+	s.syncAsSint16LE(_junkNumber);
+}
+
+bool Scene1550::Junk::startAction(CursorType action, Event &event) {
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_USE:
+		if (_visage == 1561) {
 			R2_GLOBALS._player.disableControl();
-			_nextCrawlDirection = 2;
-			signal();
+			scene->_sceneMode = 40;
+			Common::Point pt(_position.x + 5, _position.y + 20);
+			PlayerMover *mover = new PlayerMover();
+			R2_GLOBALS._player.addMover(mover, &pt, scene);
+			return true;
 		}
+		return SceneActor::startAction(action, event);
 		break;
-	case CRAWL_SOUTH:
-		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 110)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 110)) > 36))
-			&& ( ((cellPos.x == 17) && (cellPos.y == 5) && (_field418 != 3))
-				|| ((cellPos.x == 41) && (cellPos.y == 21)) )
-				)	{
-			R2_GLOBALS._player.disableControl();
-			_sceneMode = 1203;
-			setAction(&_sequenceManager, this, 1203, &_actor1, NULL);
-		} else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 110)) == 36) {
-			switch (_nextCrawlDirection) {
-			case CRAWL_EAST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 51;
-				else
-					_sceneMode = 50;
-				break;
-			case CRAWL_WEST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 81;
-				else
-					_sceneMode = 80;
+	case CURSOR_LOOK:
+		if (_visage == 1561) {
+			switch (_frame) {
+			case 2:
+				SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
-			case CRAWL_SOUTH:
-				if (R2_GLOBALS._player._visage == 3155)
-					_sceneMode = 35;
-				else
-					_sceneMode = 30;
+			case 3:
+				SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
-			case CRAWL_NORTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 116;
-				else
-					_sceneMode = 115;
+			case 4:
+				SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
 			default:
 				break;
 			}
-			R2_GLOBALS._player.disableControl();
-			_nextCrawlDirection = 3;
-			signal();
-		}
-		break;
-	case CRAWL_NORTH:
-		if ( ((_mazeUI.getCellFromPixelXY(Common::Point(140, 30)) > 36) || (_mazeUI.getCellFromPixelXY(Common::Point(178, 30)) > 36))
-			&& ( ((cellPos.x == 17) && (cellPos.y == 9) && (_field418 != 3))
-				|| ((cellPos.x == 35) && (cellPos.y == 17)) )
-				)	{
-			R2_GLOBALS._player.disableControl();
-			_sceneMode = 1202;
-			setAction(&_sequenceManager, this, 1202, &_actor1, NULL);
-		} else if (_mazeUI.getCellFromPixelXY(Common::Point(160, 30)) == 36) {
-			switch (_nextCrawlDirection) {
-			case CRAWL_EAST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 61;
-				else
-					_sceneMode = 60;
-				break;
-			case CRAWL_WEST:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 71;
-				else
-					_sceneMode = 70;
+		} else {
+			switch ((((_strip - 1) * 5) + _frame) % 3) {
+			case 0:
+				SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
-			case CRAWL_SOUTH:
-				if (R2_GLOBALS._player._visage == 3156)
-					_sceneMode = 96;
-				else
-					_sceneMode = 95;
+			case 1:
+				SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
-			case CRAWL_NORTH:
-				if (R2_GLOBALS._player._visage == 3155)
-					_sceneMode = 45;
-				else
-					_sceneMode = 40;
+			case 2:
+				SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 				break;
 			default:
-				_sceneMode = 1;
-				R2_GLOBALS._player.setup(3156, 4, 6);
 				break;
 			}
-			R2_GLOBALS._player.disableControl();
-			_nextCrawlDirection = 4;
-			signal();
 		}
+		return true;
 		break;
 	default:
+		return SceneActor::startAction(action, event);
 		break;
 	}
 }
 
-/*--------------------------------------------------------------------------
- * Scene 1500 - Cutscene: Ship landing
- *
- *--------------------------------------------------------------------------*/
-
-void Scene1500::postInit(SceneObjectList *OwnerList) {
-	loadScene(1500);
-	R2_GLOBALS._uiElements._active = false;
-	setZoomPercents(170, 13, 240, 100);
-	SceneExt::postInit();
-	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
-
-	scalePalette(65, 65, 65);
-
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.hide();
-	R2_GLOBALS._player.disableControl();
-
-	_starshipShadow.postInit();
-	_starshipShadow.setup(1401, 1, 1);
-	_starshipShadow._effect = EFFECT_SHADOW_MAP;
-	_starshipShadow.fixPriority(10);
-	_starshipShadow._shadowMap = _shadowPaletteMap;
-
-	_starship.postInit();
-	_starship.setup(1400, 1, 1);
-	_starship._moveDiff = Common::Point(1, 1);
-	_starship._linkedActor = &_starshipShadow;
-
-	if (R2_GLOBALS._sceneManager._previousScene != 1010) {
-		_smallShipShadow.postInit();
-		_smallShipShadow.setup(1401, 2, 1);
-		_smallShipShadow._effect = EFFECT_SHADOW_MAP;
-		_smallShipShadow.fixPriority(10);
-		_smallShipShadow._shadowMap = _shadowPaletteMap;
-
-		_smallShip.postInit();
-		_smallShip._moveRate = 30;
-		_smallShip._moveDiff = Common::Point(1, 1);
-		_smallShip._linkedActor = &_smallShipShadow;
-	}
-
-	if (R2_GLOBALS._sceneManager._previousScene == 300) {
-		_starship.setPosition(Common::Point(189, 139), 5);
-
-		_smallShip.setup(1400, 1, 2);
-		_smallShip.setPosition(Common::Point(148, 108), 0);
-
-		_sceneMode = 20;
-		R2_GLOBALS._sound1.play(110);
-	} else if (R2_GLOBALS._sceneManager._previousScene == 1550) {
-		_starship.setPosition(Common::Point(189, 139), 5);
-
-		_smallShip.setup(1400, 2, 1);
-		_smallShip.changeZoom(-1);
-		_smallShip.setPosition(Common::Point(298, 258), 5);
-
-		_sceneMode = 10;
-		R2_GLOBALS._sound1.play(106);
-	} else {
-		_starship.setPosition(Common::Point(289, 239), -30);
-		_sceneMode = 0;
-		R2_GLOBALS._sound1.play(102);
-	}
-
-	signal();
+Scene1550::ShipComponent::ShipComponent() {
+	_componentId = 0;
 }
 
-void Scene1500::remove() {
-	R2_GLOBALS._uiElements._active = true;
-	R2_GLOBALS._uiElements._visible = true;
+void Scene1550::ShipComponent::synchronize(Serializer &s) {
+	SceneActor::synchronize(s);
 
-	SceneExt::remove();
+	s.syncAsSint16LE(_componentId);
 }
 
-void Scene1500::signal() {
-	switch(_sceneMode++) {
-	case 0:
-		R2_GLOBALS.setFlag(25);
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-	// No break on purpose
-	case 1:
-		if (_starship._yDiff < 50) {
-			_starship.setPosition(Common::Point(289, 239), _starship._yDiff + 1);
-			_sceneMode = 1;
-		}
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 2: {
-		Common::Point pt(189, 139);
-		NpcMover *mover = new NpcMover();
-		_starship.addMover(mover, &pt, this);
-		}
-		break;
-	case 3:
-		if (_starship._yDiff > 5) {
-			_starship.setPosition(Common::Point(189, 139), _starship._yDiff - 1);
-			_sceneMode = 3;
+bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) {
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_USE:
+		if (_componentId == 8) {
+			scene->_dontExit = true;
+			R2_GLOBALS._player.disableControl();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1576;
+			else
+				scene->_sceneMode = 1584;
+			// strcpy(scene->_shipComponents[7]._actorName, 'hatch');
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[7], NULL);
+			return true;
 		}
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	case 13:
-		R2_GLOBALS._player._characterIndex = R2_MIRANDA;
-	// No break on purpose
-	case 4:
-		R2_GLOBALS._sceneManager.changeScene(300);
+		return SceneActor::startAction(action, event);
 		break;
-	case 10:
-	// No break on purpose
-	case 20:
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+	case CURSOR_LOOK:
+		if (_componentId == 8)
+			SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		else if (_frame == 1)
+			SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		else
+			SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		return true;
 		break;
-	case 11: {
-		Common::Point pt(148, 108);
-		NpcMover *mover = new NpcMover();
-		_smallShip.addMover(mover, &pt, this);
+	case R2_FUEL_CELL:
+		scene->_dontExit = true;
+		if (_componentId == 6) {
+			R2_GLOBALS._player.disableControl();
+			scene->_wreckage2.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1574;
+			else
+				scene->_sceneMode = 1582;
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL);
+			return true;
 		}
+		return SceneActor::startAction(action, event);
 		break;
-	case 12:
-		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
-		break;
-	case 21: {
-		Common::Point pt(-2, -42);
-		NpcMover *mover = new NpcMover();
-		_smallShip.addMover(mover, &pt, NULL);
-		signal();
+	case R2_GYROSCOPE:
+		scene->_dontExit = true;
+		if (_componentId == 3) {
+			R2_GLOBALS._player.disableControl();
+			scene->_wreckage2.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1571;
+			else
+				scene->_sceneMode = 1581;
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL);
+			return true;
 		}
+		return SceneActor::startAction(action, event);
 		break;
-	case 22:
-		if (_starship._yDiff < 50) {
-			_starship.setPosition(Common::Point(189, 139), _starship._yDiff + 1);
-			_sceneMode = 22;
+	case R2_GUIDANCE_MODULE:
+		scene->_dontExit = true;
+		if (_componentId == 1) {
+			R2_GLOBALS._player.disableControl();
+			scene->_wreckage2.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1569;
+			else
+				scene->_sceneMode = 1579;
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL);
+			return true;
 		}
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+		return SceneActor::startAction(action, event);
 		break;
-	case 23: {
-		Common::Point pt(-13, -61);
-		NpcMover *mover = new NpcMover();
-		_starship.addMover(mover, &pt, this);
+	case R2_THRUSTER_VALVE:
+		scene->_dontExit = true;
+		if (_componentId == 4) {
+			R2_GLOBALS._player.disableControl();
+			scene->_sceneMode = 1572;
+			scene->_wreckage2.postInit();
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL);
+			return true;
 		}
+		return SceneActor::startAction(action, event);
 		break;
-	case 24:
-		R2_GLOBALS._sceneManager.changeScene(1550);
+	case R2_RADAR_MECHANISM:
+		scene->_dontExit = true;
+		if (_componentId == 2) {
+			R2_GLOBALS._player.disableControl();
+			scene->_wreckage2.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1570;
+			else
+				scene->_sceneMode = 1580;
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL);
+			return true;
+		}
+		return SceneActor::startAction(action, event);
+		break;
+	case R2_IGNITOR:
+		scene->_dontExit = true;
+		if (_componentId == 5) {
+			R2_GLOBALS._player.disableControl();
+			scene->_sceneMode = 1573;
+			scene->_wreckage2.postInit();
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL);
+			return true;
+		}
+		return SceneActor::startAction(action, event);
+		break;
+	case R2_BATTERY:
+		scene->_dontExit = true;
+		if (_componentId == 7) {
+			R2_GLOBALS._player.disableControl();
+			scene->_wreckage2.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				scene->_sceneMode = 1575;
+			else
+				scene->_sceneMode = 1583;
+			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL);
+			return true;
+		}
+		return SceneActor::startAction(action, event);
 		break;
 	default:
+		return SceneActor::startAction(action, event);
 		break;
 	}
 }
 
-void Scene1500::dispatch() {
-	if (_sceneMode > 10) {
-		float yDiff = sqrt((float) (_smallShip._position.x * _smallShip._position.x) + (_smallShip._position.y * _smallShip._position.y));
-		if (yDiff > 6)
-			_smallShip.setPosition(_smallShip._position, (int) yDiff);
+void Scene1550::ShipComponent::setupShipComponent(int componentId) {
+	_componentId = componentId;
+	postInit();
+	setup(1517, _componentId, 1);
+
+	switch (_componentId) {
+	case 1:
+		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
+			setFrame(5);
+		setPosition(Common::Point(287, 85));
+		break;
+	case 2:
+		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0)
+			setFrame(5);
+		setPosition(Common::Point(248, 100));
+		break;
+	case 3:
+		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
+			setFrame(5);
+		setPosition(Common::Point(217, 85));
+		break;
+	case 4:
+		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0)
+			setFrame(5);
+		setPosition(Common::Point(161, 121));
+		break;
+	case 5:
+		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)
+			setFrame(5);
+		setPosition(Common::Point(117, 121));
+		break;
+	case 6:
+		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0)
+			setFrame(5);
+		setPosition(Common::Point(111, 85));
+		break;
+	case 7:
+		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 0)
+			setFrame(5);
+		setPosition(Common::Point(95, 84));
+		break;
+	case 8: {
+		setup(1516, 1, 1);
+		setPosition(Common::Point(201, 45));
+		Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+		if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578))
+			hide();
+		fixPriority(92);
+		setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL);
+		}
+		break;
+	default:
+		break;
 	}
 
-	Scene::dispatch();
+	fixPriority(92);
+	setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL);
 }
 
-/*--------------------------------------------------------------------------
- * Scene 1525 - Cutscene - Ship
- *
- *--------------------------------------------------------------------------*/
-
-void Scene1525::postInit(SceneObjectList *OwnerList) {
-	loadScene(1525);
-	R2_GLOBALS._uiElements._active = false;
-	SceneExt::postInit();
+Scene1550::DishControlsWindow::DishControl::DishControl() {
+	_controlId = 0;
+}
 
-	R2_GLOBALS._player.postInit();
-	if (R2_GLOBALS._sceneManager._previousScene == 525)
-		R2_GLOBALS._player.setup(1525, 1, 1);
-	else
-		R2_GLOBALS._player.setup(1525, 1, 16);
-	R2_GLOBALS._player.setPosition(Common::Point(244, 148));
-	R2_GLOBALS._player.disableControl();
+void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) {
+	SceneActor::synchronize(s);
 
-	_sceneMode = 0;
-	setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+	s.syncAsSint16LE(_controlId);
 }
 
-void Scene1525::signal() {
-	switch (_sceneMode++) {
-	case 0:
-		if (R2_GLOBALS._sceneManager._previousScene == 525)
-			setAction(&_sequenceManager, this, 1525, &R2_GLOBALS._player, NULL);
-		else
-			setAction(&_sequenceManager, this, 1526, &R2_GLOBALS._player, NULL);
-		break;
+bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
+
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+	switch (_controlId) {
 	case 1:
-		setAction(&_sequenceManager, this, 2, &R2_GLOBALS._player, NULL);
+		// Button control
+		if (scene->_dish._frame == 5) {
+			R2_GLOBALS._player.disableControl();
+			scene->_sceneMode = 25;
+			if (scene->_walkway._frame == 1) {
+				scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL);
+				R2_GLOBALS.setFlag(20);
+				setFrame(2);
+			} else {
+				scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL);
+				R2_GLOBALS.clearFlag(20);
+				setFrame(1);
+			}
+			scene->_dishControlsWindow.remove();
+		}
 		break;
 	case 2:
-		if (R2_GLOBALS._sceneManager._previousScene == 1530)
-			R2_GLOBALS._sceneManager.changeScene(1550);
-		else
-			R2_GLOBALS._sceneManager.changeScene(1530);
+		// Lever control
+		R2_GLOBALS._player.disableControl();
+		if (scene->_dish._frame == 1) {
+			scene->_sceneMode = 23;
+			scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL);
+		} else {
+			if (scene->_walkway._frame == 1)
+				scene->_sceneMode = 24;
+			else
+				scene->_sceneMode = 22;
+			scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL);
+		}
+	break;
 	default:
 		break;
 	}
+	return true;
 }
 
-/*--------------------------------------------------------------------------
- * Scene 1530 - Cutscene - Crashing on Rimwall
- *
- *--------------------------------------------------------------------------*/
+void Scene1550::DishControlsWindow::remove() {
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
 
-void Scene1530::postInit(SceneObjectList *OwnerList) {
-	if (R2_GLOBALS._sceneManager._previousScene == 1000)
-		loadScene(1650);
-	else if (R2_GLOBALS._sceneManager._previousScene == 1580)
-		loadScene(1550);
-	else
-		loadScene(1530);
+	_button.remove();
+	_lever.remove();
 
-	R2_GLOBALS._uiElements._active = false;
-	SceneExt::postInit();
-	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
+	ModalWindow::remove();
 
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
+	if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29))
+		return;
 
-	if (R2_GLOBALS._sceneManager._previousScene == 1000) {
-		R2_GLOBALS._player.postInit();
-		R2_GLOBALS._player.hide();
-		R2_GLOBALS._player.disableControl();
+	R2_GLOBALS._player.disableControl();
+	if (scene->_walkway._frame == 1) {
+		scene->_sceneMode = 1559;
+		scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL);
+	} else {
+		scene->_sceneMode = 1562;
+		scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL);
+	}
+}
 
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(538, this);
-		R2_GLOBALS._sound1.play(114);
+void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum,
+		int posX, int posY) {
+	// Call inherited setup
+	ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
 
-		_sceneMode = 3;
-	} else if (R2_GLOBALS._sceneManager._previousScene == 1580) {
-		R2_GLOBALS._player.postInit();
-		R2_GLOBALS._player._characterIndex = R2_QUINN;
-		R2_GLOBALS._player.setObjectWrapper(NULL);
-		R2_GLOBALS._player.setup(1516, 6, 1);
-		R2_GLOBALS._player.setPosition(Common::Point(160, 125));
-		R2_GLOBALS._player._moveRate = 30;
-		R2_GLOBALS._player._moveDiff = Common::Point(4, 1);
+	// Further setup
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+	setup3(1550, 67, -1, -1);
+	_button.postInit();
+	_button._controlId = 1;
+	if (scene->_walkway._frame == 1)
+		_button.setup(1559, 3, 1);
+	else
+		_button.setup(1559, 3, 2);
+	_button.setPosition(Common::Point(142, 79));
+	_button.fixPriority(251);
+	_button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
 
-		_leftReactor.postInit();
-		_leftReactor.setup(1516, 7, 1);
-		_leftReactor.setPosition(Common::Point(121, 41));
-		_leftReactor.animate(ANIM_MODE_2, NULL);
+	_lever.postInit();
+	_lever._numFrames = 5;
+	_lever._controlId = 2;
+	if (scene->_dish._frame == 1)
+		_lever.setup(1559, 2, 1);
+	else
+		_lever.setup(1559, 2, 5);
+	_lever.setPosition(Common::Point(156, 103));
+	_lever.fixPriority(251);
+	_lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
+}
 
-		_rightReactor.postInit();
-		_rightReactor.setup(1516, 8, 1);
-		_rightReactor.setPosition(Common::Point(107, 116));
-		_rightReactor.animate(ANIM_MODE_2, NULL);
+bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) {
+	return SceneHotspot::startAction(action, event);
+}
 
-		R2_GLOBALS._player.disableControl();
-		Common::Point pt(480, 75);
-		NpcMover *mover = new NpcMover();
-		R2_GLOBALS._player.addMover(mover, &pt, this);
-		R2_GLOBALS._sound1.play(111);
+bool Scene1550::Wreckage::startAction(CursorType action, Event &event) {
+	return SceneActor::startAction(action, event);
+}
 
-		_sceneMode = 1;
-	} else {
-		_seeker.postInit();
-		_seeker._effect = EFFECT_SHADED;
+bool Scene1550::Companion::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_TALK)
+		return SceneActor::startAction(action, event);
 
-		R2_GLOBALS._player.postInit();
-		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-		R2_GLOBALS._player.disableControl();
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+	scene->_sceneMode = 80;
+	scene->signal();
 
-		setAction(&_sequenceManager, this, 1530, &R2_GLOBALS._player, &_seeker, NULL);
+	return true;
+}
 
-		_sceneMode = 2;
-	}
+bool Scene1550::AirBag::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
+
+	R2_GLOBALS._player.disableControl();
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+	scene->_dontExit = true;
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		scene->_sceneMode = 1552;
+	else
+		scene->_sceneMode = 1588;
 
+	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL);
+	return true;
 }
 
-void Scene1530::signal() {
-	switch (_sceneMode - 1) {
-	case 0:
-		R2_GLOBALS._sceneManager.changeScene(1000);
-		break;
-	case 1:
-		R2_GLOBALS._sceneManager.changeScene(1525);
-		break;
-	case 2:
+bool Scene1550::Joystick::startAction(CursorType action, Event &event) {
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_USE:
+		scene->_sceneMode = 50;
 		R2_GLOBALS._player.disableControl();
-		_sceneMode = 4;
-		R2_GLOBALS._player.show();
-		setAction(&_sequenceManager, this, 1650, &R2_GLOBALS._player, NULL);
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+			scene->_stripManager.start(518, scene);
+		else
+			scene->_stripManager.start(520, scene);
+		return true;
 		break;
-	case 3:
-		R2_GLOBALS._sceneManager.changeScene(1700);
+	case CURSOR_LOOK:
+		SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		return true;
 		break;
 	default:
-		break;
+		return SceneActor::startAction(action, event);
 	}
 }
 
-void Scene1530::dispatch() {
-	int16 x = R2_GLOBALS._player._position.x;
-	int16 y = R2_GLOBALS._player._position.y;
+bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
 
-	_leftReactor.setPosition(Common::Point(x - 39, y - 85));
-	_rightReactor.setPosition(Common::Point(x - 53, y - 9));
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+	R2_GLOBALS._player.disableControl();
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		scene->_sceneMode = 1555;
+	else
+		scene->_sceneMode = 1589;
 
-	Scene::dispatch();
+	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+		&scene->_gyroscope, NULL);
+	return true;
 }
 
-/*--------------------------------------------------------------------------
- * Scene 1550 - Spaceport
- *
- *--------------------------------------------------------------------------*/
+bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
 
-Scene1550::Junk::Junk() {
-	_junkNumber = 0;
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+	R2_GLOBALS._player.disableControl();
+	scene->_dontExit = true;
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		scene->_sceneMode = 1586;
+	else
+		scene->_sceneMode = 1587;
+
+	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
+		&scene->_diagnosticsDisplay, NULL);
+	return true;
 }
 
-void Scene1550::Junk::synchronize(Serializer &s) {
-	SceneActor::synchronize(s);
+bool Scene1550::DishTower::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
+
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
+
+	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
+		R2_GLOBALS._player.disableControl();
+		scene->_sceneMode = 1585;
+		scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL);
+	} else {
+		R2_GLOBALS._player.disableControl();
+		switch(scene->_dishMode) {
+		case 0:
+			scene->_dish.fixPriority(168);
+			scene->_walkway.fixPriority(125);
+			scene->_sceneMode = 1558;
+			scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL);
+			break;
+		case 1:
+			return SceneActor::startAction(action, event);
+			break;
+		case 2:
+			scene->_dishMode = 1;
+			scene->_sceneMode = 1563;
+			scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL);
+			break;
+		default:
+			break;
+		}
+	}
+	return true;
 
-	s.syncAsSint16LE(_junkNumber);
 }
 
-bool Scene1550::Junk::startAction(CursorType action, Event &event) {
+bool Scene1550::Dish::startAction(CursorType action, Event &event) {
 	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
 
 	switch (action) {
 	case CURSOR_USE:
-		if (_visage == 1561) {
+		if (scene->_dishMode != 2)
+			return SceneActor::startAction(action, event);
+
+		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
 			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 40;
-			Common::Point pt(_position.x + 5, _position.y + 20);
-			PlayerMover *mover = new PlayerMover();
-			R2_GLOBALS._player.addMover(mover, &pt, scene);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
+			scene->_sceneMode = 1564;
+			scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL);
+		} else
+			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		return true;
 		break;
 	case CURSOR_LOOK:
-		if (_visage == 1561) {
-			switch (_frame) {
-			case 2:
-				SceneItem::display(1550, 23, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			case 3:
-				SceneItem::display(1550, 26, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			case 4:
-				SceneItem::display(1550, 35, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			default:
-				break;
-			}
-		} else {
-			switch ((((_strip - 1) * 5) + _frame) % 3) {
-			case 0:
-				SceneItem::display(1550, 62, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			case 1:
-				SceneItem::display(1550, 53, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			case 2:
-				SceneItem::display(1550, 76, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-				break;
-			default:
-				break;
-			}
-		}
+		if (scene->_dishMode != 2)
+			return SceneActor::startAction(action, event);
+
+		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
+			SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		} else
+			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
 		return true;
 		break;
 	default:
@@ -2572,758 +2150,301 @@ bool Scene1550::Junk::startAction(CursorType action, Event &event) {
 	}
 }
 
-Scene1550::ShipComponent::ShipComponent() {
-	_componentId = 0;
+/*--------------------------------------------------------------------------*/
+
+Scene1550::Scene1550() {
+	_dontExit = false;
+	_wallType = 0;
+	_dishMode = 0;
+	_sceneResourceId = 0;
+	_walkRegionsId = 0;
 }
 
-void Scene1550::ShipComponent::synchronize(Serializer &s) {
-	SceneActor::synchronize(s);
+void Scene1550::synchronize(Serializer &s) {
+	SceneExt::synchronize(s);
 
-	s.syncAsSint16LE(_componentId);
+	s.syncAsSint16LE(_dontExit);
+	s.syncAsByte(_wallType);
+	s.syncAsSint16LE(_dishMode);
+	s.syncAsSint16LE(_sceneResourceId);
+	s.syncAsSint16LE(_walkRegionsId);
 }
 
-bool Scene1550::ShipComponent::startAction(CursorType action, Event &event) {
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (action) {
-	case CURSOR_USE:
-		if (_componentId == 8) {
-			scene->_dontExit = true;
-			R2_GLOBALS._player.disableControl();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1576;
-			else
-				scene->_sceneMode = 1584;
-			// strcpy(scene->_shipComponents[7]._actorName, 'hatch');
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[7], NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case CURSOR_LOOK:
-		if (_componentId == 8)
-			SceneItem::display(1550, 75, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		else if (_frame == 1)
-			SceneItem::display(1550, 70, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		else
-			SceneItem::display(1550, 71, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		return true;
-		break;
-	case R2_FUEL_CELL:
-		scene->_dontExit = true;
-		if (_componentId == 6) {
-			R2_GLOBALS._player.disableControl();
-			scene->_wreckage2.postInit();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1574;
-			else
-				scene->_sceneMode = 1582;
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[5], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case R2_GYROSCOPE:
-		scene->_dontExit = true;
-		if (_componentId == 3) {
-			R2_GLOBALS._player.disableControl();
-			scene->_wreckage2.postInit();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1571;
-			else
-				scene->_sceneMode = 1581;
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[2], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case R2_GUIDANCE_MODULE:
-		scene->_dontExit = true;
-		if (_componentId == 1) {
-			R2_GLOBALS._player.disableControl();
-			scene->_wreckage2.postInit();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1569;
-			else
-				scene->_sceneMode = 1579;
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[0], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case R2_THRUSTER_VALVE:
-		scene->_dontExit = true;
-		if (_componentId == 4) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 1572;
-			scene->_wreckage2.postInit();
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[3], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case R2_RADAR_MECHANISM:
-		scene->_dontExit = true;
-		if (_componentId == 2) {
-			R2_GLOBALS._player.disableControl();
-			scene->_wreckage2.postInit();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1570;
-			else
-				scene->_sceneMode = 1580;
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[1], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
-		break;
-	case R2_IGNITOR:
-		scene->_dontExit = true;
-		if (_componentId == 5) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 1573;
-			scene->_wreckage2.postInit();
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[4], &scene->_wreckage2, NULL);
-			return true;
-		}
-		return SceneActor::startAction(action, event);
+void Scene1550::postInit(SceneObjectList *OwnerList) {
+	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
+		// Exiting the intact spaceship
+		loadScene(1234);
+	else
+		// Normal scene entry
+		loadScene(1550);
+	SceneExt::postInit();
+
+	scalePalette(65, 65, 65);
+	setZoomPercents(30, 75, 170, 100);
+	_sceneResourceId = 1550;
+	_walkRegionsId = 0;
+
+	if (R2_GLOBALS._sceneManager._previousScene == -1)
+		R2_GLOBALS.setFlag(16);
+
+	if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 1550) && (R2_GLOBALS._player._characterScene[R2_QUINN] != 1580)) {
+		R2_GLOBALS._player._characterScene[R2_QUINN] = 1550;
+		R2_GLOBALS._player._characterScene[R2_SEEKER] = 1550;
+	}
+
+	_stripManager.setColors(60, 255);
+	_stripManager.setFontNumber(3);
+	_stripManager.addSpeaker(&_quinnSpeaker);
+	_stripManager.addSpeaker(&_seekerSpeaker);
+
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player._effect = EFFECT_SHADED2;
+
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		R2_GLOBALS._player.setup(1500, 3, 1);
+	else
+		R2_GLOBALS._player.setup(1505, 3, 1);
+
+	R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
+
+	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
+		R2_GLOBALS._player.setPosition(Common::Point(157, 135));
+	else
+		R2_GLOBALS._player.setPosition(Common::Point(160, 100));
+
+	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+	R2_GLOBALS._player.disableControl();
+
+	_wallType = 0;
+	_companion.changeZoom(-1);
+	R2_GLOBALS._player.changeZoom(-1);
+
+	switch (R2_GLOBALS._sceneManager._previousScene) {
+	case 1530:
+		R2_GLOBALS._stripModifier = 0;
+	// No break on purpose
+	case 300:
+	// No break on purpose
+	case 1500:
+	// No break on purpose
+	case 3150:
+		R2_GLOBALS._sound1.play(105);
 		break;
-	case R2_BATTERY:
-		scene->_dontExit = true;
-		if (_componentId == 7) {
+	case 1580:
+		// Leaving intact ship
+		if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) {
 			R2_GLOBALS._player.disableControl();
-			scene->_wreckage2.postInit();
+			R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
+
+			_dontExit = true;
+
+			_wreckage2.postInit();
+			_shipComponents[7].setupShipComponent(8);
+			_shipComponents[7].hide();
 			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				scene->_sceneMode = 1575;
+				_sceneMode = 1577;
 			else
-				scene->_sceneMode = 1583;
-			scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_shipComponents[6], &scene->_wreckage2, NULL);
-			return true;
+				_sceneMode = 1578;
+
+			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL);
+			R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550;
+		} else {
+			R2_GLOBALS._player.enableControl();
 		}
-		return SceneActor::startAction(action, event);
 		break;
 	default:
-		return SceneActor::startAction(action, event);
 		break;
 	}
-}
 
-void Scene1550::ShipComponent::setupShipComponent(int componentId) {
-	_componentId = componentId;
-	postInit();
-	setup(1517, _componentId, 1);
+	enterArea();
 
-	switch (_componentId) {
+	_intactHull1.setDetails(16, 1550, 10, -1, -1);
+	_intactHull2.setDetails(24, 1550, 10, -1, -1);
+	_background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
+
+	if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) {
+		_sceneMode = 70;
+		if (!R2_GLOBALS._sceneObjects->contains(&_companion))
+			_companion.postInit();
+
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+			_companion.setVisage(1505);
+		else
+			_companion.setVisage(1500);
+
+		_companion.changeZoom(77);
+		_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+
+		assert(_walkRegionsId >= 1550);
+		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
+
+		setAction(&_sequenceManager1, this, 1590, &_companion, NULL);
+	} else if ((_sceneMode != 1577) && (_sceneMode != 1578))
+		R2_GLOBALS._player.enableControl();
+}
+
+void Scene1550::signal() {
+	switch (_sceneMode) {
 	case 1:
-		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
-			setFrame(5);
-		setPosition(Common::Point(287, 85));
-		break;
-	case 2:
-		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0)
-			setFrame(5);
-		setPosition(Common::Point(248, 100));
-		break;
+	// No break on purpose
 	case 3:
-		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
-			setFrame(5);
-		setPosition(Common::Point(217, 85));
-		break;
-	case 4:
-		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0)
-			setFrame(5);
-		setPosition(Common::Point(161, 121));
-		break;
+	// No break on purpose
 	case 5:
-		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)
-			setFrame(5);
-		setPosition(Common::Point(117, 121));
-		break;
-	case 6:
-		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0)
-			setFrame(5);
-		setPosition(Common::Point(111, 85));
-		break;
+	// No break on purpose
 	case 7:
-		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 0)
-			setFrame(5);
-		setPosition(Common::Point(95, 84));
-		break;
-	case 8: {
-		setup(1516, 1, 1);
-		setPosition(Common::Point(201, 45));
-		Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-		if ((scene->_sceneMode == 1577) || (scene->_sceneMode == 1578))
-			hide();
-		fixPriority(92);
-		setDetails(1550, 70, -1, -1, 2, (SceneItem *) NULL);
-		}
+		_dontExit = false;
+		R2_GLOBALS._player.enableControl(CURSOR_WALK);
 		break;
-	default:
+	case 20:
+	// No break on purpose
+	case 21:
+	// No break on purpose
+	case 25:
+	// No break on purpose
+	case 1563:
+		// Show the communication dish controls window
+		R2_GLOBALS.clearFlag(20);
+		_dishControlsWindow.setup2(1559, 1, 1, 160, 125);
+		R2_GLOBALS._player.enableControl();
+		_sceneMode = 0;
 		break;
-	}
-
-	fixPriority(92);
-	setDetails(1550, 70, -1, -1, 2, (SceneItem *)NULL);
-}
-
-Scene1550::DishControlsWindow::DishControl::DishControl() {
-	_controlId = 0;
-}
-
-void Scene1550::DishControlsWindow::DishControl::synchronize(Serializer &s) {
-	SceneActor::synchronize(s);
-
-	s.syncAsSint16LE(_controlId);
-}
-
-bool Scene1550::DishControlsWindow::DishControl::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (_controlId) {
-	case 1:
-		// Button control
-		if (scene->_dish._frame == 5) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 25;
-			if (scene->_walkway._frame == 1) {
-				scene->setAction(&scene->_sequenceManager1, scene, 1560, &scene->_walkway, NULL);
-				R2_GLOBALS.setFlag(20);
-				setFrame(2);
-			} else {
-				scene->setAction(&scene->_sequenceManager1, scene, 1561, &scene->_walkway, NULL);
-				R2_GLOBALS.clearFlag(20);
-				setFrame(1);
-			}
-			scene->_dishControlsWindow.remove();
+	case 22:
+		_dishControlsWindow.remove();
+		_sceneMode = 24;
+		setAction(&_sequenceManager1, this, 1561, &_walkway, NULL);
+		R2_GLOBALS.clearFlag(20);
+		break;
+	case 23:
+		_dishControlsWindow.remove();
+		_sceneMode = 20;
+		setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL);
+		R2_GLOBALS.setFlag(19);
+		break;
+	case 24:
+		_dishControlsWindow.remove();
+		_sceneMode = 21;
+		setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL);
+		R2_GLOBALS.clearFlag(19);
+		break;
+	case 30:
+	// No break on purpose
+	case 1556:
+	// No break on purpose
+	case 1557:
+	// Nothing on purpose
+		break;
+	case 40: {
+			_sceneMode = 41;
+			Common::Point pt(_junk[0]._position.x, _junk[0]._position.y + 20);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
 		}
 		break;
-	case 2:
-		// Lever control
-		R2_GLOBALS._player.disableControl();
-		if (scene->_dish._frame == 1) {
-			scene->_sceneMode = 23;
-			scene->setAction(&scene->_sequenceManager1, scene, 1560, this, NULL);
+	case 41:
+		_sceneMode = 42;
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+			R2_GLOBALS._player.setup(1502, 8, 1);
 		} else {
-			if (scene->_walkway._frame == 1)
-				scene->_sceneMode = 24;
-			else
-				scene->_sceneMode = 22;
-			scene->setAction(&scene->_sequenceManager1, scene, 1561, this, NULL);
+			R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14);
+			R2_GLOBALS._player.setup(1516, 4, 1);
 		}
-	break;
-	default:
+		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
 		break;
-	}
-	return true;
-}
-
-void Scene1550::DishControlsWindow::remove() {
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	_button.remove();
-	_lever.remove();
 
-	ModalWindow::remove();
+	case 42: {
+		_sceneMode = 43;
+		int junkRegionIndex = R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 3];
+		R2_GLOBALS._walkRegions.enableRegion(scene1550JunkRegions[junkRegionIndex]);
 
-	if ((scene->_sceneMode >= 20) && (scene->_sceneMode <= 29))
-		return;
+		switch (_junk[0]._frame) {
+		case 1:
+			R2_INVENTORY.setObjectScene(R2_JOYSTICK, R2_GLOBALS._player._characterIndex);
+			break;
+		case 2:
+			R2_INVENTORY.setObjectScene(R2_FUEL_CELL, R2_GLOBALS._player._characterIndex);
+			break;
+		case 3:
+			R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, R2_GLOBALS._player._characterIndex);
+			break;
+		case 4:
+			R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, R2_GLOBALS._player._characterIndex);
+			break;
+		case 5:
+			R2_INVENTORY.setObjectScene(R2_BATTERY, R2_GLOBALS._player._characterIndex);
+			break;
+		case 6:
+			R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
+			break;
+		default:
+			break;
+		}
 
-	R2_GLOBALS._player.disableControl();
-	if (scene->_walkway._frame == 1) {
-		scene->_sceneMode = 1559;
-		scene->setAction(&scene->_sequenceManager1, scene, 1559, &R2_GLOBALS._player, NULL);
-	} else {
-		scene->_sceneMode = 1562;
-		scene->setAction(&scene->_sequenceManager1, scene, 1562, &R2_GLOBALS._player, NULL);
+		_junk[0].remove();
+		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
+		break;
 	}
-}
-
-void Scene1550::DishControlsWindow::setup2(int visage, int stripFrameNum, int frameNum,
-		int posX, int posY) {
-	// Call inherited setup
-	ModalWindow::setup2(visage, stripFrameNum, frameNum, posX, posY);
-
-	// Further setup
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-	setup3(1550, 67, -1, -1);
-	_button.postInit();
-	_button._controlId = 1;
-	if (scene->_walkway._frame == 1)
-		_button.setup(1559, 3, 1);
-	else
-		_button.setup(1559, 3, 2);
-	_button.setPosition(Common::Point(142, 79));
-	_button.fixPriority(251);
-	_button.setDetails(1550, 68, -1, -1, 2, (SceneItem *) NULL);
-
-	_lever.postInit();
-	_lever._numFrames = 5;
-	_lever._controlId = 2;
-	if (scene->_dish._frame == 1)
-		_lever.setup(1559, 2, 1);
-	else
-		_lever.setup(1559, 2, 5);
-	_lever.setPosition(Common::Point(156, 103));
-	_lever.fixPriority(251);
-	_lever.setDetails(1550, 69, -1, -1, 2, (SceneItem *) NULL);
-}
-
-bool Scene1550::WorkingShip::startAction(CursorType action, Event &event) {
-	return SceneHotspot::startAction(action, event);
-}
-
-bool Scene1550::Wreckage::startAction(CursorType action, Event &event) {
-	return SceneActor::startAction(action, event);
-}
-
-bool Scene1550::Companion::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_TALK)
-		return SceneActor::startAction(action, event);
-
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-	scene->_sceneMode = 80;
-	scene->signal();
-
-	return true;
-}
-
-bool Scene1550::AirBag::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	R2_GLOBALS._player.disableControl();
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-	scene->_dontExit = true;
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		scene->_sceneMode = 1552;
-	else
-		scene->_sceneMode = 1588;
-
-	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player, &scene->_airbag, NULL);
-	return true;
-}
-
-bool Scene1550::Joystick::startAction(CursorType action, Event &event) {
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (action) {
-	case CURSOR_USE:
-		scene->_sceneMode = 50;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+	case 43:
+		R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 2] = 0;
 		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			scene->_stripManager.start(518, scene);
-		else
-			scene->_stripManager.start(520, scene);
-		return true;
-		break;
-	case CURSOR_LOOK:
-		SceneItem::display(1550, 41, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		return true;
+			R2_GLOBALS._player.setVisage(1500);
+		else {
+			R2_GLOBALS._player.changeZoom(-1);
+			R2_GLOBALS._player.setVisage(1505);
+		}
+		R2_GLOBALS._player.animate(ANIM_MODE_1, this);
+		R2_GLOBALS._player.setStrip(8);
+		R2_GLOBALS._player.enableControl();
 		break;
-	default:
-		return SceneActor::startAction(action, event);
-	}
-}
-
-bool Scene1550::Gyroscope::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-	R2_GLOBALS._player.disableControl();
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		scene->_sceneMode = 1555;
-	else
-		scene->_sceneMode = 1589;
-
-	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
-		&scene->_gyroscope, NULL);
-	return true;
-}
-
-bool Scene1550::DiagnosticsDisplay::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-	R2_GLOBALS._player.disableControl();
-	scene->_dontExit = true;
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		scene->_sceneMode = 1586;
-	else
-		scene->_sceneMode = 1587;
-
-	scene->setAction(&scene->_sequenceManager1, scene, scene->_sceneMode, &R2_GLOBALS._player,
-		&scene->_diagnosticsDisplay, NULL);
-	return true;
-}
-
-bool Scene1550::DishTower::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
-		R2_GLOBALS._player.disableControl();
-		scene->_sceneMode = 1585;
-		scene->setAction(&scene->_sequenceManager1, scene, 1585, &R2_GLOBALS._player, NULL);
-	} else {
-		R2_GLOBALS._player.disableControl();
-		switch(scene->_dishMode) {
-		case 0:
-			scene->_dish.fixPriority(168);
-			scene->_walkway.fixPriority(125);
-			scene->_sceneMode = 1558;
-			scene->setAction(&scene->_sequenceManager1, scene, 1558, &R2_GLOBALS._player, NULL);
-			break;
-		case 1:
-			return SceneActor::startAction(action, event);
-			break;
-		case 2:
-			scene->_dishMode = 1;
-			scene->_sceneMode = 1563;
-			scene->setAction(&scene->_sequenceManager1, scene, 1563, &R2_GLOBALS._player, &scene->_walkway, NULL);
-			break;
-		default:
-			break;
+	case 50:
+		// Removed (useless ?) call to sub_1D227
+		++_sceneMode;
+		setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL);
+		if (g_globals->_sceneObjects->contains(&_companion))
+			signal();
+		else {
+			_companion.postInit();
+			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+				_companion.setVisage(1505);
+			else
+				_companion.setVisage(1500);
+			_companion.changeZoom(77);
+			_companion.setAction(&_sequenceManager2, this, 1590, &_companion, NULL);
+			_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
 		}
-	}
-	return true;
-
-}
-
-bool Scene1550::Dish::startAction(CursorType action, Event &event) {
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (action) {
-	case CURSOR_USE:
-		if (scene->_dishMode != 2)
-			return SceneActor::startAction(action, event);
-
-		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 1564;
-			scene->setAction(&scene->_sequenceManager1, scene, 1564, &R2_GLOBALS._player, NULL);
-		} else
-			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		return true;
 		break;
-	case CURSOR_LOOK:
-		if (scene->_dishMode != 2)
-			return SceneActor::startAction(action, event);
-
-		if (R2_INVENTORY.getObjectScene(R2_BATTERY) == 1550) {
-			SceneItem::display(1550, 74, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		} else
-			SceneItem::display(1550, 64, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		return true;
+	case 51:
+		++_sceneMode;
 		break;
-	default:
-		return SceneActor::startAction(action, event);
+	case 52:
+		_companion.changeZoom(-1);
+		_sceneMode = 1592;
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+			setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion,
+				&_junk[0], &_joystick, NULL);
+		else
+			setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion,
+				&_junk[0], &_joystick, NULL);
 		break;
-	}
-}
-
-/*--------------------------------------------------------------------------*/
-
-Scene1550::Scene1550() {
-	_dontExit = false;
-	_wallType = 0;
-	_dishMode = 0;
-	_sceneResourceId = 0;
-	_walkRegionsId = 0;
-}
-
-void Scene1550::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
-
-	s.syncAsSint16LE(_dontExit);
-	s.syncAsByte(_wallType);
-	s.syncAsSint16LE(_dishMode);
-	s.syncAsSint16LE(_sceneResourceId);
-	s.syncAsSint16LE(_walkRegionsId);
-}
-
-void Scene1550::postInit(SceneObjectList *OwnerList) {
-	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
-			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
-		// Exiting the intact spaceship
-		loadScene(1234);
-	else
-		// Normal scene entry
-		loadScene(1550);
-	SceneExt::postInit();
-
-	scalePalette(65, 65, 65);
-	setZoomPercents(30, 75, 170, 100);
-	_sceneResourceId = 1550;
-	_walkRegionsId = 0;
-
-	if (R2_GLOBALS._sceneManager._previousScene == -1)
-		R2_GLOBALS.setFlag(16);
-
-	if ((R2_GLOBALS._player._characterScene[R2_QUINN] != 1550) && (R2_GLOBALS._player._characterScene[R2_QUINN] != 1580)) {
-		R2_GLOBALS._player._characterScene[R2_QUINN] = 1550;
-		R2_GLOBALS._player._characterScene[R2_SEEKER] = 1550;
-	}
-
-	_stripManager.setColors(60, 255);
-	_stripManager.setFontNumber(3);
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
-
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player._effect = EFFECT_SHADED2;
-
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		R2_GLOBALS._player.setup(1500, 3, 1);
-	else
-		R2_GLOBALS._player.setup(1505, 3, 1);
-
-	R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
-
-	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
-			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11))
-		R2_GLOBALS._player.setPosition(Common::Point(157, 135));
-	else
-		R2_GLOBALS._player.setPosition(Common::Point(160, 100));
-
-	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-	R2_GLOBALS._player.disableControl();
-
-	_wallType = 0;
-	_companion.changeZoom(-1);
-	R2_GLOBALS._player.changeZoom(-1);
-
-	switch (R2_GLOBALS._sceneManager._previousScene) {
-	case 1530:
-		R2_GLOBALS._stripModifier = 0;
-	// No break on purpose
-	case 300:
-	// No break on purpose
-	case 1500:
-	// No break on purpose
-	case 3150:
-		R2_GLOBALS._sound1.play(105);
+	case 61:
+		R2_GLOBALS._player.enableControl(CURSOR_USE);
+		R2_GLOBALS._player._canWalk = false;
+		_dishMode = 2;
 		break;
-	case 1580:
-		// Leaving intact ship
-		if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1580) {
-			R2_GLOBALS._player.disableControl();
-			R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
-
-			_dontExit = true;
-
-			_wreckage2.postInit();
-			_shipComponents[7].setupShipComponent(8);
-			_shipComponents[7].hide();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				_sceneMode = 1577;
-			else
-				_sceneMode = 1578;
-
-			setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_wreckage2, &_shipComponents[7], NULL);
-			R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 1550;
-		} else {
-			R2_GLOBALS._player.enableControl();
+	case 62:
+		R2_GLOBALS._player.enableControl(CURSOR_TALK);
+		if (_dishMode == 2) {
+			R2_GLOBALS._player.enableControl(CURSOR_USE);
+			R2_GLOBALS._player._canWalk = false;
 		}
 		break;
-	default:
-		break;
-	}
-
-	enterArea();
-
-	_intactHull1.setDetails(16, 1550, 10, -1, -1);
-	_intactHull2.setDetails(24, 1550, 10, -1, -1);
-	_background.setDetails(Rect(0, 0, 320, 200), 1550, 0, 1, -1, 1, NULL);
-
-	if ((R2_GLOBALS._sceneManager._previousScene == 1500) && (R2_GLOBALS.getFlag(16))) {
-		_sceneMode = 70;
-		if (!R2_GLOBALS._sceneObjects->contains(&_companion))
-			_companion.postInit();
-
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			_companion.setVisage(1505);
-		else
-			_companion.setVisage(1500);
-
-		_companion.changeZoom(77);
-		_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
-
-		assert(_walkRegionsId >= 1550);
-		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
-
-		setAction(&_sequenceManager1, this, 1590, &_companion, NULL);
-	} else if ((_sceneMode != 1577) && (_sceneMode != 1578))
-		R2_GLOBALS._player.enableControl();
-}
-
-void Scene1550::signal() {
-	switch (_sceneMode) {
-	case 1:
-	// No break on purpose
-	case 3:
-	// No break on purpose
-	case 5:
-	// No break on purpose
-	case 7:
-		_dontExit = false;
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		break;
-	case 20:
-	// No break on purpose
-	case 21:
-	// No break on purpose
-	case 25:
-	// No break on purpose
-	case 1563:
-		// Show the communication dish controls window
-		R2_GLOBALS.clearFlag(20);
-		_dishControlsWindow.setup2(1559, 1, 1, 160, 125);
-		R2_GLOBALS._player.enableControl();
-		_sceneMode = 0;
-		break;
-	case 22:
-		_dishControlsWindow.remove();
-		_sceneMode = 24;
-		setAction(&_sequenceManager1, this, 1561, &_walkway, NULL);
-		R2_GLOBALS.clearFlag(20);
-		break;
-	case 23:
-		_dishControlsWindow.remove();
-		_sceneMode = 20;
-		setAction(&_sequenceManager1, this, 1566, &_dish, &_dishTowerShadow, NULL);
-		R2_GLOBALS.setFlag(19);
-		break;
-	case 24:
-		_dishControlsWindow.remove();
-		_sceneMode = 21;
-		setAction(&_sequenceManager1, this, 1567, &_dish, &_dishTowerShadow, NULL);
-		R2_GLOBALS.clearFlag(19);
-		break;
-	case 30:
-	// No break on purpose
-	case 1556:
-	// No break on purpose
-	case 1557:
-	// Nothing on purpose
-		break;
-	case 40: {
-			_sceneMode = 41;
-			Common::Point pt(_junk[0]._position.x, _junk[0]._position.y + 20);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		}
-		break;
-	case 41:
-		_sceneMode = 42;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_GLOBALS._player.setup(1502, 8, 1);
-		} else {
-			R2_GLOBALS._player.changeZoom(R2_GLOBALS._player._percent + 14);
-			R2_GLOBALS._player.setup(1516, 4, 1);
-		}
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-
-	case 42: {
-		_sceneMode = 43;
-		int junkRegionIndex = R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 3];
-		R2_GLOBALS._walkRegions.enableRegion(scene1550JunkRegions[junkRegionIndex]);
-
-		switch (_junk[0]._frame) {
-		case 1:
-			R2_INVENTORY.setObjectScene(R2_JOYSTICK, R2_GLOBALS._player._characterIndex);
-			break;
-		case 2:
-			R2_INVENTORY.setObjectScene(R2_FUEL_CELL, R2_GLOBALS._player._characterIndex);
-			break;
-		case 3:
-			R2_INVENTORY.setObjectScene(R2_GUIDANCE_MODULE, R2_GLOBALS._player._characterIndex);
-			break;
-		case 4:
-			R2_INVENTORY.setObjectScene(R2_RADAR_MECHANISM, R2_GLOBALS._player._characterIndex);
-			break;
-		case 5:
-			R2_INVENTORY.setObjectScene(R2_BATTERY, R2_GLOBALS._player._characterIndex);
-			break;
-		case 6:
-			R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
-			break;
-		default:
-			break;
-		}
-
-		_junk[0].remove();
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	}
-	case 43:
-		R2_GLOBALS._scene1550JunkLocations[_junk[0]._junkNumber + 2] = 0;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			R2_GLOBALS._player.setVisage(1500);
-		else {
-			R2_GLOBALS._player.changeZoom(-1);
-			R2_GLOBALS._player.setVisage(1505);
-		}
-		R2_GLOBALS._player.animate(ANIM_MODE_1, this);
-		R2_GLOBALS._player.setStrip(8);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 50:
-		// Removed (useless ?) call to sub_1D227
-		++_sceneMode;
-		setAction(&_sequenceManager1, this, 1591, &R2_GLOBALS._player, NULL);
-		if (g_globals->_sceneObjects->contains(&_companion))
-			signal();
-		else {
-			_companion.postInit();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				_companion.setVisage(1505);
-			else
-				_companion.setVisage(1500);
-			_companion.changeZoom(77);
-			_companion.setAction(&_sequenceManager2, this, 1590, &_companion, NULL);
-			_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
-		}
-		break;
-	case 51:
-		++_sceneMode;
-		break;
-	case 52:
-		_companion.changeZoom(-1);
-		_sceneMode = 1592;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			setAction(&_sequenceManager1, this, 1592, &R2_GLOBALS._player, &_companion,
-				&_junk[0], &_joystick, NULL);
-		else
-			setAction(&_sequenceManager1, this, 1593, &R2_GLOBALS._player, &_companion,
-				&_junk[0], &_joystick, NULL);
-		break;
-	case 61:
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
-		R2_GLOBALS._player._canWalk = false;
-		_dishMode = 2;
-		break;
-	case 62:
-		R2_GLOBALS._player.enableControl(CURSOR_TALK);
-		if (_dishMode == 2) {
-			R2_GLOBALS._player.enableControl(CURSOR_USE);
-			R2_GLOBALS._player._canWalk = false;
-		}
-		break;
-	case 70:
-		R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
-		//R2_GLOBALS._s1550PlayerAreas[0] = 1;
-		_sceneMode = 60;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(500, this);
+	case 70:
+		R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
+		//R2_GLOBALS._s1550PlayerAreas[0] = 1;
+		_sceneMode = 60;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(500, this);
 		break;
 	case 80:
 		if (R2_GLOBALS.getFlag(16)) {
@@ -3453,7191 +2574,5400 @@ void Scene1550::signal() {
 	// No break on purpose
 	case 1582:
 		_dontExit = false;
-		_wreckage2.remove();
-		R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1575:
-	// No break on purpose
-	case 1583:
-		_dontExit = false;
-		_wreckage2.remove();
-		R2_INVENTORY.setObjectScene(R2_BATTERY, 0);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1576:
-	// No break on purpose
-	case 1584:
-		R2_GLOBALS._sceneManager.changeScene(1580);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1577:
-	// No break on purpose
-	case 1578:
-		_sceneMode = 0;
-		_wreckage2.remove();
-		_dontExit = false;
-		R2_GLOBALS._player.fixPriority(-1);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1585:
-		SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1586:
-	// No break on purpose
-	case 1587:
-		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
-		_diagnosticsDisplay.remove();
-		_dontExit = false;
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1592:
-		_joystick.remove();
-		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1);
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
-		} else {
-			R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER];
-		}
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		break;
-	default:
-		_sceneMode = 62;
-		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
-		break;
-	}
-}
-
-void Scene1550::process(Event &event) {
-	if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) {
-		int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
-		if (curReg == 0)
-			_dontExit = true;
-		else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90)))
-			_dontExit = true;
-		else
-			_dontExit = false;
-
-		if ((curReg == 13) || (curReg == 14))
-			_dontExit = false;
-	}
-
-	Scene::process(event);
-}
-
-void Scene1550::dispatch() {
-	Scene::dispatch();
-
-	// Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
-	assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER));
-
-	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) {
-		R2_GLOBALS._player._shade = 0;
-
-		// NOTE: Original game contains a switch based on an uninitialized variable.
-		// We're leaving this code here, but ifdef'ed out, in case we can ever figure out
-		// what the original programmers intended the value to come from
-#if 0
-		int missingVariable = 0;
-		switch (missingVariable) {
-		case 144:
-		// No break on purpose
-		case 146:
-			_dish._frame = 5;
-			R2_GLOBALS._player._shade = 3;
-			break;
-		case 148:
-		// No break on purpose
-		case 149:
-			_dish._frame = 1;
-		// No break on purpose
-		case 147:
-		// No break on purpose
-		case 150:
-			R2_GLOBALS._player._shade = 3;
-			break;
-		default:
-			break;
-		}
-#endif
-	}
-
-	if (_dontExit)
-		return;
-
-	switch (R2_GLOBALS._player.getRegionIndex() - 11) {
-	case 0:
-	// No break on purpose
-	case 5:
-		// Exiting the top of the screen
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 1;
-		_dontExit = true;
-		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
-
-		enterArea();
-
-		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145));
-		if (R2_GLOBALS._player._position.x < 160) {
-			Common::Point pt(R2_GLOBALS._player._position.x + 5, 135);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
-			Common::Point pt(R2_GLOBALS._player._position.x, 135);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		} else {
-			Common::Point pt(R2_GLOBALS._player._position.x - 5, 135);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		}
-		break;
-	case 1:
-		// Exiting the bottom of the screen
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 3;
-		_dontExit = true;
-		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
-
-		enterArea();
-
-		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19));
-		if (R2_GLOBALS._player._position.x < 160) {
-			Common::Point pt(R2_GLOBALS._player._position.x + 5, 29);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
-			Common::Point pt(R2_GLOBALS._player._position.x, 29);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		} else {
-			Common::Point pt(R2_GLOBALS._player._position.x - 5, 29);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		}
-		break;
-	case 2:
-		// Exiting the right of the screen
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 5;
-		_dontExit = true;
-		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
-
-		enterArea();
-
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
-			if (R2_GLOBALS._player._position.y >= 85) {
-				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
-				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20);
-				NpcMover *mover = new NpcMover();
-				R2_GLOBALS._player.addMover(mover, &pt, this);
-			} else {
-				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
-				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20);
-				NpcMover *mover = new NpcMover();
-				R2_GLOBALS._player.addMover(mover, &pt, this);
-			}
-		} else {
-			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
-			Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		}
-		break;
-	case 3:
-		// Exiting to the left of the screen
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 7;
-		_dontExit = true;
-		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
-
-		enterArea();
-
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 24) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
-			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2));
-			Common::Point pt(265, 29);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		} else if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
-			if (R2_GLOBALS._player._position.y >= 85) {
-				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
-				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20);
-				NpcMover *mover = new NpcMover();
-				R2_GLOBALS._player.addMover(mover, &pt, this);
-			} else {
-				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
-				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20);
-				NpcMover *mover = new NpcMover();
-				R2_GLOBALS._player.addMover(mover, &pt, this);
-			}
-		} else {
-			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
-			Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y);
-			NpcMover *mover = new NpcMover();
-			R2_GLOBALS._player.addMover(mover, &pt, this);
-		}
-		break;
-	default:
-		break;
-	}
-}
-
-void Scene1550::saveCharacter(int characterIndex) {
-	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
-		R2_GLOBALS._sound1.fadeOut2(NULL);
-
-	SceneExt::saveCharacter(characterIndex);
-}
-
-void Scene1550::Wall::setupWall(int frameNumber, int strip) {
-	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
-
-	postInit();
-	if (scene->_wallType == 2)
-		setup(1551, strip, frameNumber);
-	else
-		setup(1554, strip, frameNumber);
-
-	switch (strip) {
-	case 0:
-		switch (frameNumber - 1) {
-		case 0:
-			setup(1551, 1, 1);
-			setPosition(Common::Point(30, 67));
-			break;
-		case 1:
-			setup(1560, 1, 5);
-			setPosition(Common::Point(141, 54));
-			break;
-		case 2:
-			setup(1560, 2, 5);
-			setPosition(Common::Point(178, 54));
-			break;
-		case 3:
-			setup(1560, 2, 1);
-			setPosition(Common::Point(289, 67));
-			break;
-		case 4:
-			setup(1560, 2, 2);
-			setPosition(Common::Point(298, 132));
-			break;
-		case 5:
-			setup(1560, 1, 2);
-			setPosition(Common::Point(21, 132));
-			break;
-		case 6:
-			setup(1560, 2, 4);
-			setPosition(Common::Point(285, 123));
-			break;
-		case 7:
-			setup(1560, 1, 3);
-			setPosition(Common::Point(30, 111));
-			break;
-		case 8:
-			setup(1560, 2, 3);
-			setPosition(Common::Point(289, 111));
-			break;
-		case 9:
-			setup(1560, 1, 4);
-			setPosition(Common::Point(34, 123));
-			break;
-		default:
-			break;
-		}
-		fixPriority(1);
-		break;
-	case 1:
-		if (frameNumber == 3) {
-			setup(1553, 3, 1);
-			setPosition(Common::Point(48, 44));
-			fixPriority(2);
-		} else {
-			fixPriority(1);
-			setPosition(Common::Point(32, 17));
-		}
-
-		switch (frameNumber) {
-		case 2:
-			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		case 3:
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		default:
-			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		}
-		break;
-	case 2:
-		fixPriority(1);
-		switch (frameNumber) {
-		case 4:
-			setup(1553, 4, 1);
-			setPosition(Common::Point(48, 168));
-			break;
-		case 5:
-			setup(1553, 3, 2);
-			setPosition(Common::Point(20, 168));
-			fixPriority(250);
-			break;
-		default:
-			setPosition(Common::Point(28, 116));
-			break;
-		}
-
-		switch (frameNumber) {
-		case 2:
-			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		case 4:
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		case 5:
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		default:
-			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		}
-		break;
-	case 3:
-		switch (frameNumber) {
-		case 2:
-			fixPriority(2);
-			if (scene->_wallType == 2)
-				setup(1553, 2, 1);
-			else
-				setup(1556, 2, 1);
-			setPosition(Common::Point(160, 44));
-			break;
-		case 3:
-			fixPriority(2);
-			setup(1553, 5, 1);
-			setPosition(Common::Point(178, 44));
-			break;
-		default:
-			fixPriority(1);
-			setPosition(Common::Point(160, 17));
-			break;
-		}
-
-		if (frameNumber == 1)
-			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
-		else
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-		break;
-	case 4:
-		if (frameNumber == 2) {
-			fixPriority(250);
-			if (scene->_wallType == 2)
-				setup(1553, 1, 1);
-			else
-				setup(1556, 1, 1);
-		} else {
-			fixPriority(2);
-		}
-
-		if (frameNumber != 1)
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-
-		setPosition(Common::Point(160, 168));
-		break;
-	case 5:
-		fixPriority(1);
-		setPosition(Common::Point(287, 17));
-
-		switch (frameNumber) {
-		case 2:
-			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		case 3:
-			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		default:
-			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
-			break;
-		}
-		break;
-	case 6:
-		fixPriority(1);
-		setPosition(Common::Point(291, 116));
-
-		if (frameNumber == 2)
-			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
-		else
-			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
-		break;
-	default:
-		break;
-	}
-
-}
-
-void Scene1550::enterArea() {
-	_walkRegionsId = 0;
-	_dishMode = 0;
-
-	_wallCorner1.remove();
-	_westWall.remove();
-	_northWall.remove();
-	_southWall.remove();
-	_wallCorner2.remove();
-	_eastWall.remove();
-
-	for (int i = 0; i < 8; ++i)
-		_junk[i].remove();
-
-	_wreckage.remove();
-
-	for (int i = 0; i < 8; ++i)
-		_shipComponents[i].remove();
-
-	_airbag.remove();
-	_joystick.remove();
-	_gyroscope.remove();
-	_wreckage4.remove();
-	_diagnosticsDisplay.remove();
-
-	if ((_sceneMode != 1577) && (_sceneMode != 1578))
-		_wreckage2.remove();
-
-	_wreckage3.remove();
-	_companion.remove();
-	_dish.remove();
-	_dishTowerShadow.remove();
-	_dishTower.remove();
-	_walkway.remove();
-
-	// Set up of special walk regions for certain areas
-	switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) {
-	case 0:
-		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
-		case 3:
-			R2_GLOBALS._walkRegions.load(1554);
-			_walkRegionsId = 1554;
-			break;
-		case 4:
-			R2_GLOBALS._walkRegions.load(1553);
-			_walkRegionsId = 1553;
-			break;
-		default:
-			break;
-		}
-		break;
-	case 3:
-	// No break on purpose
-	case 4:
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) {
-			if (!R2_GLOBALS.getFlag(16)) {
-				R2_GLOBALS._walkRegions.load(1559);
-				_walkRegionsId = 1559;
-			}
-		}
-		break;
-	case 7:
-		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
-		case 10:
-			R2_GLOBALS._walkRegions.load(1555);
-			_walkRegionsId = 1555;
-			break;
-		case 11:
-			R2_GLOBALS._walkRegions.load(1556);
-			_walkRegionsId = 1556;
-			break;
-		default:
-			break;
-		}
-		break;
-	case 11:
-		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
-		case 24:
-			R2_GLOBALS._walkRegions.load(1558);
-			_walkRegionsId = 1558;
-			break;
-		case 25:
-			R2_GLOBALS._walkRegions.load(1557);
-			_walkRegionsId = 1557;
-			break;
-		default:
-			break;
-		}
-		break;
-	case 16:
-		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
-		case 2:
-			R2_GLOBALS._walkRegions.load(1552);
-			_walkRegionsId = 1552;
-			break;
-		case 3:
-			R2_GLOBALS._walkRegions.load(1551);
-			_walkRegionsId = 1551;
-			break;
-		case 15:
-			R2_GLOBALS._walkRegions.load(1575);
-			_walkRegionsId = 1575;
-		default:
-			break;
-		}
-		break;
-	default:
-		break;
-	}
-
-	int varA = 0;
-
-	// This section handles checks if the ARM spacecraft have not yet seized
-	// control of Lance of Truth.
-	if (!R2_GLOBALS.getFlag(16)) {
-		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) {
-		case 0:
-			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) {
-				case 0:
-					varA = 1553;
-					_northWall.setupWall(6, 0);
-					break;
-				case 1:
-				// No break on purpose
-				case 2:
-				// No break on purpose
-				case 3:
-				// No break on purpose
-				case 4:
-					varA = 1553;
-					break;
-				case 5:
-					varA = 1553;
-					_northWall.setupWall(6, 0);
-					break;
-				default:
-					break;
-			}
-			break;
-		case 1:
-		// No break on purpose
-		case 2:
-			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
-			case 0:
-				varA = 1550;
-				_northWall.setupWall(9, 0);
-				break;
-			case 1:
-				varA = 1552;
-				_northWall.setupWall(10, 0);
-				break;
-			case 2:
-			// No break on purpose
-			case 3:
-			// No break on purpose
-			case 4:
-			// No break on purpose
-			case 5:
-				varA = 1552;
-				break;
-			case 6:
-				varA = 1552;
-				_northWall.setupWall(7, 0);
-				break;
-			case 7:
-				varA = 1550;
-				_northWall.setupWall(8, 0);
-				break;
-			default:
-				break;
-			}
-			break;
-		case 3:
-			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
-			case 0:
-				varA = 1550;
-				_northWall.setupWall(4, 0);
-				break;
-			case 1:
-				varA = 1550;
-				_northWall.setupWall(3, 0);
-				break;
-			case 2:
-			// No break on purpose
-			case 3:
-			// No break on purpose
-			case 4:
-			// No break on purpose
-			case 5:
-				varA = 1551;
-				break;
-			case 6:
-				varA = 1550;
-				_northWall.setupWall(2, 0);
-				break;
-			case 7:
-				varA = 1550;
-				_northWall.setupWall(1, 0);
-				break;
-			default:
-				break;
-			}
-			break;
-		default:
-			break;
-		}
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) &&
-				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) &&
-				((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) ||
-				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) {
-			// In an area where the cutscene can be triggered, so start it
-			R2_GLOBALS.setFlag(16);
-			R2_GLOBALS._sceneManager.changeScene(1500);
-		}
-	}
-
-	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
-			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
-		if (_screenNumber != 1234) {
-			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
-			loadScene(1234);
-			R2_GLOBALS._sceneManager._hasPalette = false;
-			_wallType = 0;
-		}
-	} else if (_screenNumber == 1234) {
-		R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
-		loadScene(1550);
-		R2_GLOBALS._sceneManager._hasPalette = false;
-	}
-
-	if (_screenNumber == 1234)
-		_walkRegionsId = 1576;
-
-	if (_wallType == 0) {
-		_wallType = 1;
-	} else {
-		if (_wallType == 2) {
-			_wallType = 3;
-		} else {
-			_wallType = 2;
-		}
-
-		if (R2_GLOBALS._sceneManager._sceneNumber == 1550){
-#if 0
-			warning("Mouse_hideIfNeeded()");
-			warning("gfx_set_pane_p");
-			for (int i = 3; i != 168; ++i) {
-				warning("sub294D2(4, i, 312,  var14C)");
-				warning("missing for loop, to be implemented");
-				warning("gfx_draw_slice");
-			}
-			warning("gfx_flip_screen()");
-			warning("gfx_set_pane_p()");
-#endif
-			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
-
-			if (varA == 0) {
-				if (_sceneResourceId != 1550) {
-					g_globals->_scenePalette.loadPalette(1550);
-					R2_GLOBALS._sceneManager._hasPalette = true;
-				}
-			} else {
-				g_globals->_scenePalette.loadPalette(varA);
-				R2_GLOBALS._sceneManager._hasPalette = true;
-			}
-
-			if (R2_GLOBALS._sceneManager._hasPalette)
-				_sceneResourceId = varA;
-
-//			warning("sub_2C429()");
-		}
-	}
-
-	// Scene setup dependent on the type of cell specified in the scene map
-	switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) +
-		R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) {
-	case 0:
-		// Standard cell
-		if (_walkRegionsId == 0) {
-			R2_GLOBALS._walkRegions.load(1550);
-			_walkRegionsId = 1550;
-		}
-		break;
-	case 1:
-		// North end of the spaceport
-		if (_walkRegionsId == 0) {
-			R2_GLOBALS._walkRegions.load(1560);
-			_walkRegionsId = 1560;
-		}
-		_wallCorner1.setupWall(2, 1);
-		_northWall.setupWall(1, 3);
-		_wallCorner2.setupWall(2, 5);
-		break;
-	case 2:
-		R2_GLOBALS._walkRegions.load(1561);
-		_walkRegionsId = 1561;
-		_wallCorner1.setupWall(2, 1);
-		_westWall.setupWall(2, 2);
-		_northWall.setupWall(1, 3);
-		_wallCorner2.setupWall(2, 5);
-		break;
-	case 3:
-		R2_GLOBALS._walkRegions.load(1562);
-		_walkRegionsId = 1562;
-		_wallCorner1.setupWall(2, 1);
-		_northWall.setupWall(1, 3);
-		_wallCorner2.setupWall(2, 5);
-		_eastWall.setupWall(2, 6);
-		break;
-	case 4:
-		R2_GLOBALS._walkRegions.load(1563);
-		_walkRegionsId = 1563;
-		_northWall.setupWall(2, 3);
-		break;
-	case 5:
-		R2_GLOBALS._walkRegions.load(1564);
-		_walkRegionsId = 1564;
-		_southWall.setupWall(2, 4);
-		break;
-	case 6:
-		R2_GLOBALS._walkRegions.load(1565);
-		_walkRegionsId = 1565;
-		_wallCorner1.setupWall(1, 1);
-		_westWall.setupWall(1, 2);
-		_northWall.setupWall(3, 3);
-		break;
-	case 7:
-		R2_GLOBALS._walkRegions.load(1566);
-		_walkRegionsId = 1566;
-		_wallCorner1.setupWall(1, 1);
-		_westWall.setupWall(1, 2);
-		_northWall.setupWall(2, 4);
-		break;
-	case 8:
-		R2_GLOBALS._walkRegions.load(1567);
-		_walkRegionsId = 1567;
-		_westWall.setupWall(5, 2);
-		break;
-	case 9:
-		R2_GLOBALS._walkRegions.load(1568);
-		_walkRegionsId = 1568;
-		_westWall.setupWall(4, 2);
-		break;
-	case 10:
-		R2_GLOBALS._walkRegions.load(1569);
-		_walkRegionsId = 1569;
-		_wallCorner1.setupWall(3, 1);
-		break;
-	case 11:
-		R2_GLOBALS._walkRegions.load(1570);
-		_walkRegionsId = 1570;
-		_wallCorner1.setupWall(1, 1);
-		_westWall.setupWall(1, 2);
-		break;
-	case 12:
-		R2_GLOBALS._walkRegions.load(1571);
-		_walkRegionsId = 1571;
-		_wallCorner2.setupWall(1, 5);
-		_eastWall.setupWall(1, 6);
-		break;
-	case 13:
-		R2_GLOBALS._walkRegions.load(1572);
-		_walkRegionsId = 1572;
-		_wallCorner1.setupWall(1, 1);
-		_westWall.setupWall(1, 2);
-		_southWall.setupWall(1, 4);
-		break;
-	case 14:
-		R2_GLOBALS._walkRegions.load(1573);
-		_walkRegionsId = 1573;
-		_southWall.setupWall(1, 4);
-		_wallCorner2.setupWall(1, 5);
-		_eastWall.setupWall(1, 6);
-		break;
-	case 15:
-		// South wall
-		R2_GLOBALS._walkRegions.load(1574);
-		_walkRegionsId = 1574;
-		_southWall.setupWall(1, 4);
-		break;
-	case 16:
-		R2_GLOBALS._walkRegions.load(1570);
-		_walkRegionsId = 1570;
-		_wallCorner1.setupWall(2, 1);
-		_westWall.setupWall(2, 2);
-		break;
-	case 17:
-		R2_GLOBALS._walkRegions.load(1570);
-		_walkRegionsId = 1570;
-		_wallCorner1.setupWall(2, 1);
-		_westWall.setupWall(3, 2);
-		break;
-	case 18:
-		R2_GLOBALS._walkRegions.load(1571);
-		_walkRegionsId = 1571;
-		_wallCorner2.setupWall(2, 5);
-		_eastWall.setupWall(2, 6);
-		break;
-	case 19:
-		R2_GLOBALS._walkRegions.load(1571);
-		_walkRegionsId = 1571;
-		_wallCorner2.setupWall(2, 5);
-		_eastWall.setupWall(3, 6);
-		break;
-	default:
-		break;
-	}
-
-	int di = 0;
-	int tmpIdx = 0;
-	for (int i = 0; i < 127 * 4; i += 4) {
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) &&
-				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) &&
-				(R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) {
-			tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3];
-			_junk[di].postInit();
-			_junk[di]._effect = EFFECT_SHADED2;
-			_junk[di]._shade = 0;
-			//_junk[di]._junkState = tmpIdx;
-			_junk[di]._junkNumber = i;
-			_junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL);
-			if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) {
-				_junk[di].changeZoom(-1);
-				_junk[di].setPosition(Common::Point(150, 70));
-				_junk[di].setup(1562, 1, 1);
-
-				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[2]);
-				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[3]);
-				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[6]);
-				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]);
-
-				if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) {
-					_joystick.postInit();
-					_joystick.setup(1562, 3, 1);
-					_joystick.setPosition(Common::Point(150, 70));
-					_joystick.fixPriority(10);
-					_joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
-				}
-			} else {
-				if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) {
-					_junk[di].changeZoom(100);
-					_junk[di].setup(1561, 1, R2_GLOBALS._scene1550JunkLocations[i + 2] - 40);
-				} else {
-					_junk[di].changeZoom(-1);
-					_junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1);
-				}
-				_junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx]));
-				if (scene1550JunkRegions[tmpIdx] != 0)
-					R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]);
-				di++;
-			}
-		}
-	}
-
-	// Loop for detecting and setting up certain special areas within the map
-	for (int i = 0; i < 15 * 3; i += 3) {
-		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i])
-				&& (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) {
-			int areaType = scene1550SpecialAreas[i + 2];
-			switch (areaType) {
-			case 1:
-				if (!R2_GLOBALS.getFlag(16)) {
-					_wreckage2.postInit();
-					if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3)
-						_wreckage2.setup(1555, 2, 1);
-					else
-						_wreckage2.setup(1555, 1, 1);
-					_wreckage2.setPosition(Common::Point(150, 100));
-					_wreckage2.fixPriority(92);
-					_wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
-				}
-				break;
-			case 2:
-				_dish.postInit();
-				if (R2_GLOBALS.getFlag(19))
-					_dish.setup(1556, 3, 5);
-				else
-					_dish.setup(1556, 3, 1);
-				_dish.changeZoom(95);
-				_dish.setPosition(Common::Point(165, 83));
-				_dish.fixPriority(168);
-				_dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
-
-				_dishTower.postInit();
-				_dishTower.setup(1556, 4, 1);
-				_dishTower.setPosition(Common::Point(191, 123));
-				_dishTower.changeZoom(95);
-				_dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
-
-				_dishTowerShadow.postInit();
-				_dishTowerShadow._numFrames = 5;
-				if (R2_GLOBALS.getFlag(19))
-					_dishTowerShadow.setup(1556, 8, 5);
-				else
-					_dishTowerShadow.setup(1556, 8, 1);
-
-				_dishTowerShadow.setPosition(Common::Point(156, 151));
-				_dishTowerShadow.fixPriority(10);
-
-				_walkway.postInit();
-				if (R2_GLOBALS.getFlag(20))
-					_walkway.setup(1558, 3, 10);
-				else
-					_walkway.setup(1558, 3, 1);
-
-				_walkway.setPosition(Common::Point(172, 48));
-				_walkway.fixPriority(169);
-				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]);
-				break;
-			case 3:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 1, 1);
-				_wreckage.setPosition(Common::Point(259, 55));
-				_wreckage.fixPriority(133);
-				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 1, 2);
-				_wreckage2.setPosition(Common::Point(259, 133));
-				_wreckage2.fixPriority(105);
-				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-				if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) {
-					_gyroscope.postInit();
-					_gyroscope.setup(1550, 7, 2);
-					_gyroscope.setPosition(Common::Point(227, 30));
-					_gyroscope.fixPriority(130);
-					_gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
-				}
-				break;
-			case 4:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 1, 4);
-				_wreckage.setPosition(Common::Point(76, 131));
-				_wreckage.fixPriority(10);
-				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 1, 3);
-				_wreckage2.setPosition(Common::Point(76, 64));
-				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-				if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) {
-					_diagnosticsDisplay.postInit();
-					_diagnosticsDisplay.setup(1504, 4, 1);
-					_diagnosticsDisplay.setPosition(Common::Point(49, 35));
-					_diagnosticsDisplay.animate(ANIM_MODE_2, NULL);
-					_diagnosticsDisplay._numFrames = 4;
-					_diagnosticsDisplay.fixPriority(65);
-					_diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
-				}
-				if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) {
-					_airbag.postInit();
-					_airbag.setup(1550, 7, 1);
-					_airbag.setPosition(Common::Point(45, 44));
-					_airbag.fixPriority(150);
-					_airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
-				}
-				break;
-			case 5:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 2, 4);
-				_wreckage.setPosition(Common::Point(243, 131));
-				_wreckage.fixPriority(10);
-				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 2, 3);
-				_wreckage2.setPosition(Common::Point(243, 64));
-				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-				break;
-			case 6:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 2, 1);
-				_wreckage.setPosition(Common::Point(60, 55));
-				_wreckage.fixPriority(133);
-				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 2, 2);
-				_wreckage2.setPosition(Common::Point(60, 133));
-				_wreckage2.fixPriority(106);
-				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
-				break;
-			case 7:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 3, 1);
-				_wreckage.setPosition(Common::Point(281, 132));
-				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-				break;
-			case 8:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 3, 2);
-				_wreckage.setPosition(Common::Point(57, 96));
-				_wreckage.fixPriority(70);
-				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 3, 3);
-				_wreckage2.setPosition(Common::Point(145, 88));
-				_wreckage2.fixPriority(55);
-				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage3.postInit();
-				_wreckage3.setup(1550, 3, 4);
-				_wreckage3.setPosition(Common::Point(64, 137));
-				_wreckage3.fixPriority(115);
-				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage4.postInit();
-				_wreckage4.setup(1550, 5, 1);
-				_wreckage4.setPosition(Common::Point(60, 90));
-				_wreckage4.fixPriority(45);
-				break;
-			case 9:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 4, 2);
-				_wreckage.setPosition(Common::Point(262, 96));
-				_wreckage.fixPriority(70);
-				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage2.postInit();
-				_wreckage2.setup(1550, 4, 3);
-				_wreckage2.setPosition(Common::Point(174, 88));
-				_wreckage2.fixPriority(55);
-				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage3.postInit();
-				_wreckage3.setup(1550, 4, 4);
-				_wreckage3.setPosition(Common::Point(255, 137));
-				_wreckage3.fixPriority(115);
-				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-
-				_wreckage4.postInit();
-				_wreckage4.setup(1550, 6, 1);
-				_wreckage4.setPosition(Common::Point(259, 90));
-				_wreckage4.fixPriority(45);
-				break;
-			case 10:
-				_wreckage.postInit();
-				_wreckage.setup(1550, 4, 1);
-				_wreckage.setPosition(Common::Point(38, 132));
-				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
-				break;
-			case 12:
-				// Intact ship
-				_shipComponents[7].setupShipComponent(8);
-				_shipComponents[0].setupShipComponent(1);
-				_shipComponents[1].setupShipComponent(2);
-				_shipComponents[2].setupShipComponent(3);
-				_shipComponents[3].setupShipComponent(4);
-				_shipComponents[4].setupShipComponent(5);
-				_shipComponents[5].setupShipComponent(6);
-				_shipComponents[6].setupShipComponent(7);
-				break;
-			default:
-				break;
-			}
-		}
-	}
-
-	if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) {
-		_companion.postInit();
-		_companion._effect = EFFECT_SHADED2;
-		_companion.changeZoom(-1);
-
-		assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008));
-		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
-		_companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8));
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) {
-				_companion.setup(1516, 3, 17);
-				_companion.setPosition(Common::Point(272, 94));
-				_companion.fixPriority(91);
-				_companion.changeZoom(100);
-				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
-			} else {
-				_companion.setup(1505, 6, 1);
-				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
-			}
-		} else {
-			if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1580) {
-				_companion.setup(1516, 2, 14);
-				_companion.setPosition(Common::Point(276, 97));
-				_companion.fixPriority(91);
-				_companion.changeZoom(100);
-				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
-			} else {
-				_companion.setup(1500, 6, 1);
-				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
-			}
-		}
-	}
-	R2_GLOBALS._uiElements.updateInventory();
-}
-
-/*--------------------------------------------------------------------------
- * Scene 1575 - Spaceport - unused ship scene
- *
- *--------------------------------------------------------------------------*/
-
-Scene1575::Button::Button() {
-	_buttonId = 0;
-	_pressed = false;
-}
-
-void Scene1575::Button::synchronize(Serializer &s) {
-	NamedHotspot::synchronize(s);
-
-	s.syncAsSint16LE(_buttonId);
-	s.syncAsSint16LE(_pressed);
-}
-
-void Scene1575::Button::process(Event &event) {
-	Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
-	bool isInBounds = _bounds.contains(event.mousePos);
-	CursorType cursor = R2_GLOBALS._events.getCursor();
-
-	if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) ||
-		(_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) {
-		// Button pressed
-		_pressed = true;
-		Common::Point pos = scene->_actor1._position;
-		event.handled = true;
-
-		if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) {
-			switch (_buttonId) {
-			case 1:
-				if (R2_GLOBALS.getFlag(18)) {
-					scene->_actor14.hide();
-					scene->_actor15.hide();
-					R2_GLOBALS.clearFlag(18);
-				} else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
-					scene->_actor14.show();
-					scene->_actor15.show();
-					R2_GLOBALS.setFlag(18);
-				} else {
-					SceneItem::display("That's probably not a good thing, ya know!");
-				}
-				break;
-			case 2:
-				if (scene->_field41A < 780) {
-					if (pos.x > 54)
-						pos.x -= 65;
-					pos.x += 2;
-					scene->_field41A += 2;
-
-					for (int i = 0; i < 17; i++)
-						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
-
-					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
-					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
-					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
-					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
-					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
-				}
-				break;
-			case 3:
-				if (scene->_field41A > 0) {
-					if (pos.x < -8)
-						pos.x += 65;
-
-					pos.x -= 2;
-					scene->_field41A -= 2;
-					for (int i = 0; i < 17; i++)
-						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
-
-					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
-					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
-					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
-					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
-					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
-				}
-				break;
-			case 4: {
-					if (pos.y < 176) {
-						++pos.y;
-						for (int i = 0; i < 17; ++i)
-							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
-
-						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
-						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
-						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
-						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
-						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
-					}
-				}
-				break;
-			case 5: {
-					if (pos.y > 145) {
-						--pos.y;
-						for (int i = 0; i < 17; ++i)
-							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
-
-						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
-						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
-						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
-						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
-						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
-					}
-				}
-				break;
-			case 6:
-				R2_GLOBALS._sceneManager.changeScene(1550);
-				break;
-			default:
-				break;
-			}
-
-			int j = 0;
-			for (int i = 0; i < 17; i++) {
-				if (scene->_arrActor[i]._bounds.contains(85, 116))
-					j = i;
-			}
-
-			if (scene->_actor13._bounds.contains(85, 116))
-				j = 18;
-
-			if (scene->_actor12._bounds.contains(85, 116))
-				j = 19;
-
-			if (j)
-				scene->_actor11.show();
-			else
-				scene->_actor11.hide();
-		} else {
-			SceneItem::display("Better not move the laser while it's firing!");
-		}
-	} else {
-		_pressed = false;
-	}
-}
-
-bool Scene1575::Button::startAction(CursorType action, Event &event) {
-	if (action == CURSOR_USE)
-		return false;
-	return SceneHotspot::startAction(action, event);
-}
-
-void Scene1575::Button::initButton(int buttonId) {
-	_buttonId = buttonId;
-	_pressed = false;
-	EventHandler::postInit();
-
-	switch (_buttonId) {
-	case 1:
-		setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL);
-		break;
-	case 2:
-		setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL);
-		break;
-	case 3:
-		setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL);
-		break;
-	case 4:
-		setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL);
-		break;
-	case 5:
-		setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL);
-		break;
-	case 6:
-		setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL);
-		break;
-	default:
-		break;
-	}
-}
-
-/*--------------------------------------------------------------------------*/
-
-Scene1575::Scene1575() {
-	_field412 = 0;
-	_field414 = 390;
-	_field416 = 0;
-	_field418 = 0;
-	_field41A = 0;
-}
-
-void Scene1575::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
-
-	s.syncAsSint16LE(_field412);
-	s.syncAsSint16LE(_field414);
-	s.syncAsSint16LE(_field416);
-	s.syncAsSint16LE(_field418);
-	s.syncAsSint16LE(_field41A);
-}
-
-double hypotenuse(double v1, double v2) {
-	return sqrt(v1 * v1 + v2 * v2);
-}
-
-void Scene1575::postInit(SceneObjectList *OwnerList) {
-	loadScene(1575);
-	R2_GLOBALS._uiElements._active = false;
-	SceneExt::postInit();
-	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
-
-	_actor1.postInit();
-	_actor1.setup(1575, 1, 1);
-	_actor1.setPosition(Common::Point(54, 161));
-	_actor1.fixPriority(5);
-
-	_actor2.postInit();
-	_actor2.setup(1575, 1, 1);
-	_actor2.setPosition(Common::Point(119, 161));
-	_actor2.fixPriority(5);
-
-	_actor3.postInit();
-	_actor3.setup(1575, 1, 1);
-	_actor3.setPosition(Common::Point(184, 161));
-	_actor3.fixPriority(5);
-
-	for (int i = 0; i < 17; i++) {
-		_arrActor[i].postInit();
-		_arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]);
-
-		double v1 = hypotenuse(2.0, 3 - k5A7F6[3 * i]);
-		v1 += hypotenuse(2.0, 3 - k5A7F6[3 * i + 1]);
-		int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0);
-
-		int angle = R2_GLOBALS._gfxManagerInstance.getAngle(
-			Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1]));
-		int xp = angle * 78 / 9 - 319;
-
-		_arrActor[i].setPosition(Common::Point(xp, yp));
-		_arrActor[i].fixPriority(6);
-	}
-
-	_actor4.postInit();
-	_actor4.setup(1575, 3, 1);
-	_actor4.setPosition(Common::Point(48, 81));
-
-	_actor5.postInit();
-	_actor5.setup(1575, 3,1);
-	_actor5.setPosition(Common::Point(121, 81));
-
-	_actor6.postInit();
-	_actor6.setup(1575, 3, 2);
-	_actor6.setPosition(Common::Point(203, 80));
-
-	_actor7.postInit();
-	_actor7.setup(1575, 3, 2);
-	_actor7.setPosition(Common::Point(217, 80));
-
-	_actor8.postInit();
-	_actor8.setup(1575, 3, 2);
-	_actor8.setPosition(Common::Point(231, 80));
-
-	_actor9.postInit();
-	_actor9.setup(1575, 3, 2);
-	_actor9.setPosition(Common::Point(273, 91));
-
-	_actor10.postInit();
-	_actor10.setup(1575, 3, 2);
-	_actor10.setPosition(Common::Point(287, 91));
-
-	// Initialize buttons
-	_button1.initButton(1);
-	_button2.initButton(2);
-	_button3.initButton(3);
-	_button4.initButton(4);
-	_button5.initButton(5);
-	_button6.initButton(6);
-
-	_actor11.postInit();
-	_actor11.setup(1575, 4, 2);
-	_actor11.setPosition(Common::Point(84, 116));
-	_actor11.hide();
-
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.hide();
-	R2_GLOBALS._player.enableControl();
-
-	do {
-		_field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
-		_field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
-	} while ((_field412) && (_field414));
-
-	if (_field412 < 0)
-		_actor4.hide();
-
-	if (_field414 < 0)
-		_actor5.hide();
-
-	_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
-	_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
-
-	_actor13.postInit();
-	_actor13.setup(1575, 2, 4);
-
-	// TODO
-	warning("TODO: another immense pile of floating operations");
-
-	_actor12.postInit();
-	_actor12.fixPriority(12);
-
-	if (R2_GLOBALS.getFlag(17)) {
-		_actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y));
-		_actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y));
-	}
-
-	_actor14.postInit();
-	_actor14.setup(1575, 5, 1);
-	_actor14.setPosition(Common::Point(85, 176));
-	_actor14.fixPriority(7);
-	_actor14.hide();
-
-	_actor15.postInit();
-	_actor15.setup(1575, 5, 2);
-	_actor15.setPosition(Common::Point(85, 147));
-	_actor15.fixPriority(7);
-	_actor15.hide();
-}
-
-void Scene1575::remove() {
-	SceneExt::remove();
-	R2_GLOBALS._uiElements._active = true;
-}
-
-void Scene1575::signal() {
-	R2_GLOBALS._player.enableControl();
-}
-
-void Scene1575::process(Event &event) {
-	Scene::process(event);
-
-	g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
-}
-
-void Scene1575::dispatch() {
-	if (_field412 <= 0) {
-		++_field412;
-		if (_field412 == 0) {
-			_actor4.show();
-			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
-		}
-	} else {
-		_field412--;
-		if (_field412 ==0) {
-			_actor4.hide();
-			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
-		}
-	}
-
-	if (_field414 <= 0) {
-		++_field414;
-		if (_field414 == 0) {
-			_actor5.show();
-			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
-		}
-	} else {
-		_field414--;
-		if (_field414 == 0) {
-			_actor5.hide();
-			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
-		}
-	}
-
-	if (_field416 == 0) {
-		switch(R2_GLOBALS._randomSource.getRandomNumber(3)) {
-		case 0:
-			_actor6.hide();
-			_actor7.hide();
-			_actor8.hide();
-			break;
-		case 1:
-			_actor6.show();
-			_actor7.hide();
-			_actor8.hide();
-			break;
-		case 2:
-			_actor6.show();
-			_actor7.show();
-			_actor8.hide();
-			break;
-		case 3:
-			_actor6.show();
-			_actor7.show();
-			_actor8.show();
-			break;
-		default:
-			break;
-		}
-		_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
-	} else {
-		--_field416;
-	}
-
-	if (_field418 == 0) {
-		switch(R2_GLOBALS._randomSource.getRandomNumber(2)) {
-		case 0:
-			_actor9.hide();
-			_actor10.hide();
-			break;
-		case 1:
-			_actor9.show();
-			_actor10.hide();
-			break;
-		case 2:
-			_actor9.show();
-			_actor10.show();
-			break;
-		default:
-			break;
+		_wreckage2.remove();
+		R2_INVENTORY.setObjectScene(R2_FUEL_CELL, 0);
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1575:
+	// No break on purpose
+	case 1583:
+		_dontExit = false;
+		_wreckage2.remove();
+		R2_INVENTORY.setObjectScene(R2_BATTERY, 0);
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1576:
+	// No break on purpose
+	case 1584:
+		R2_GLOBALS._sceneManager.changeScene(1580);
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1577:
+	// No break on purpose
+	case 1578:
+		_sceneMode = 0;
+		_wreckage2.remove();
+		_dontExit = false;
+		R2_GLOBALS._player.fixPriority(-1);
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1585:
+		SceneItem::display(1550, 66, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1586:
+	// No break on purpose
+	case 1587:
+		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, R2_GLOBALS._player._characterIndex);
+		_diagnosticsDisplay.remove();
+		_dontExit = false;
+		R2_GLOBALS._player.enableControl();
+		break;
+	case 1592:
+		_joystick.remove();
+		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1);
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+			R2_GLOBALS._s1550PlayerArea[R2_SEEKER] = R2_GLOBALS._s1550PlayerArea[R2_QUINN];
+		} else {
+			R2_GLOBALS._s1550PlayerArea[R2_QUINN] = R2_GLOBALS._s1550PlayerArea[R2_SEEKER];
 		}
-		_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
-	} else {
-		_field418--;
-	}
-	Scene::dispatch();
-}
-
-/*--------------------------------------------------------------------------
- * Scene 1580 - Inside wreck
- *
- *--------------------------------------------------------------------------*/
-
-Scene1580::Scene1580() {
-}
-
-void Scene1580::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
-}
-
-bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) {
-	if (action == R2_JOYSTICK) {
-		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
-		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580);
-		R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug);
-		scene->_joystick.postInit();
-		scene->_joystick.setup(1580, 1, 4);
-		scene->_joystick.setPosition(Common::Point(159, 163));
-		scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
-
-		scene->_arrActor[5].remove();
-
-		return true;
+		R2_GLOBALS._player.enableControl(CURSOR_WALK);
+		break;
+	default:
+		_sceneMode = 62;
+		setAction(&_sequenceManager1, this, 1, &R2_GLOBALS._player, NULL);
+		break;
 	}
-
-	return SceneHotspot::startAction(action, event);
 }
 
-bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) {
-	if (action == R2_DIAGNOSTICS_DISPLAY) {
-		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
-		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580);
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._sceneItems.remove(&scene->_screenSlot);
-
-		scene->_screen.postInit();
-		scene->_screen.setup(1580, 1, 1);
-		scene->_screen.setPosition(Common::Point(124, 108));
-		scene->_screen.fixPriority(10);
-
-		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580)
-			scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick);
+void Scene1550::process(Event &event) {
+	if ((!R2_GLOBALS._player._canWalk) && (R2_GLOBALS._events.getCursor() == R2_NEGATOR_GUN) && (event.eventType == EVENT_BUTTON_DOWN) && (this->_screenNumber == 1234)) {
+		int curReg = R2_GLOBALS._sceneRegions.indexOf(event.mousePos);
+		if (curReg == 0)
+			_dontExit = true;
+		else if (((R2_GLOBALS._player._position.y < 90) && (event.mousePos.y > 90)) || ((R2_GLOBALS._player._position.y > 90) && (event.mousePos.y < 90)))
+			_dontExit = true;
 		else
-			scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
-
-		scene->_screenDisplay.postInit();
-		scene->_screenDisplay.setup(1580, 3, 1);
-		scene->_screenDisplay.setPosition(Common::Point(124, 109));
-		scene->_screenDisplay.fixPriority(20);
-		//scene->_field412 = 1;
-		scene->_sceneMode = 10;
-		scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL);
+			_dontExit = false;
 
-		return true;
+		if ((curReg == 13) || (curReg == 14))
+			_dontExit = false;
 	}
 
-	return SceneHotspot::startAction(action, event);
+	Scene::process(event);
 }
 
-bool Scene1580::Joystick::startAction(CursorType action, Event &event) {
-	if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580)
-		&& (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
-		&& (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
-		&& (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) && (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)) {
-		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-		scene->_sceneMode = 31;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			scene->_stripManager.start(536, scene);
-		else
-			scene->_stripManager.start(537, scene);
-
-		return true;
-	}
+void Scene1550::dispatch() {
+	Scene::dispatch();
 
-	return SceneActor::startAction(action, event);
-}
+	// Arrays related to this scene are all hacky in the origina: they are based on the impossibility to use Miranda
+	assert ((R2_GLOBALS._player._characterIndex == R2_QUINN) || (R2_GLOBALS._player._characterIndex == R2_SEEKER));
 
-bool Scene1580::Screen::startAction(CursorType action, Event &event) {
-	if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) {
-		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 15) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 16)) {
+		R2_GLOBALS._player._shade = 0;
 
-		R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex);
-		scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
-		scene->_screenDisplay.remove();
-		remove();
-		return true;
+		// NOTE: Original game contains a switch based on an uninitialized variable.
+		// We're leaving this code here, but ifdef'ed out, in case we can ever figure out
+		// what the original programmers intended the value to come from
+#if 0
+		int missingVariable = 0;
+		switch (missingVariable) {
+		case 144:
+		// No break on purpose
+		case 146:
+			_dish._frame = 5;
+			R2_GLOBALS._player._shade = 3;
+			break;
+		case 148:
+		// No break on purpose
+		case 149:
+			_dish._frame = 1;
+		// No break on purpose
+		case 147:
+		// No break on purpose
+		case 150:
+			R2_GLOBALS._player._shade = 3;
+			break;
+		default:
+			break;
+		}
+#endif
 	}
 
-	return SceneActor::startAction(action, event);
-}
-
-bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment);
-	scene->_sceneMode = 0;
-	animate(ANIM_MODE_5, scene);
-
-	return true;
-}
-
-bool Scene1580::HatchButton::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	setFrame(2);
-	scene->_sceneMode = 20;
-	scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL);
+	if (_dontExit)
+		return;
 
-	return true;
-}
+	switch (R2_GLOBALS._player.getRegionIndex() - 11) {
+	case 0:
+	// No break on purpose
+	case 5:
+		// Exiting the top of the screen
+		R2_GLOBALS._player.disableControl();
+		_sceneMode = 1;
+		_dontExit = true;
+		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
 
-bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) {
-	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+		enterArea();
 
-	switch (action) {
-	case CURSOR_USE:
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 1);
-			remove();
-			return true;
-		}
-		break;
-	case R2_COM_SCANNER:
-		scene->_sceneMode = 30;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		scene->_stripManager.start(529, scene);
-		return true;
-		break;
-	case R2_COM_SCANNER_2:
-		scene->_sceneMode = 30;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		scene->_stripManager.start(527, scene);
-		return true;
-		break;
-	default:
+		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 108) * 172) / 100), 145));
+		if (R2_GLOBALS._player._position.x < 160) {
+			Common::Point pt(R2_GLOBALS._player._position.x + 5, 135);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
+			Common::Point pt(R2_GLOBALS._player._position.x, 135);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		} else {
+			Common::Point pt(R2_GLOBALS._player._position.x - 5, 135);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		}
 		break;
-	}
-
-	return SceneActor::startAction(action, event);
-}
+	case 1:
+		// Exiting the bottom of the screen
+		R2_GLOBALS._player.disableControl();
+		_sceneMode = 3;
+		_dontExit = true;
+		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y;
 
-bool Scene1580::Ignitor::startAction(CursorType action, Event &event) {
-	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+		enterArea();
 
-	switch (action) {
-	case CURSOR_USE:
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_INVENTORY.setObjectScene(R2_IGNITOR, 1);
-			remove();
-			return true;
+		R2_GLOBALS._player.setPosition(Common::Point( 160 - (((((160 - R2_GLOBALS._player._position.x) * 100) / 172) * 108) / 100), 19));
+		if (R2_GLOBALS._player._position.x < 160) {
+			Common::Point pt(R2_GLOBALS._player._position.x + 5, 29);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		} else if (R2_GLOBALS._player._position.x <= 160) { // the check is really in the original...
+			Common::Point pt(R2_GLOBALS._player._position.x, 29);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		} else {
+			Common::Point pt(R2_GLOBALS._player._position.x - 5, 29);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
 		}
 		break;
-	case R2_COM_SCANNER:
-		scene->_sceneMode = 30;
+	case 2:
+		// Exiting the right of the screen
 		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		scene->_stripManager.start(529, scene);
-		return true;
+		_sceneMode = 5;
+		_dontExit = true;
+		++R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
+
+		enterArea();
+
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
+			if (R2_GLOBALS._player._position.y >= 85) {
+				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
+				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y + 20);
+				NpcMover *mover = new NpcMover();
+				R2_GLOBALS._player.addMover(mover, &pt, this);
+			} else {
+				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
+				Common::Point pt(R2_GLOBALS._player._position.x + 30, R2_GLOBALS._player._position.y - 20);
+				NpcMover *mover = new NpcMover();
+				R2_GLOBALS._player.addMover(mover, &pt, this);
+			}
+		} else {
+			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
+			Common::Point pt(R2_GLOBALS._player._position.x + 10, R2_GLOBALS._player._position.y);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		}
 		break;
-	case R2_COM_SCANNER_2:
-		scene->_sceneMode = 30;
+	case 3:
+		// Exiting to the left of the screen
 		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		scene->_stripManager.start(527, scene);
-		return true;
+		_sceneMode = 7;
+		_dontExit = true;
+		--R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x;
+
+		enterArea();
+
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 24) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
+			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y / 2));
+			Common::Point pt(265, 29);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		} else if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) && (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11) && (R2_GLOBALS._player._position.y > 50) && (R2_GLOBALS._player._position.y < 135)) {
+			if (R2_GLOBALS._player._position.y >= 85) {
+				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y + 10));
+				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y + 20);
+				NpcMover *mover = new NpcMover();
+				R2_GLOBALS._player.addMover(mover, &pt, this);
+			} else {
+				R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y - 10));
+				Common::Point pt(R2_GLOBALS._player._position.x - 30, R2_GLOBALS._player._position.y - 20);
+				NpcMover *mover = new NpcMover();
+				R2_GLOBALS._player.addMover(mover, &pt, this);
+			}
+		} else {
+			R2_GLOBALS._player.setPosition(Common::Point(320 - R2_GLOBALS._player._position.x, R2_GLOBALS._player._position.y));
+			Common::Point pt(R2_GLOBALS._player._position.x - 10, R2_GLOBALS._player._position.y);
+			NpcMover *mover = new NpcMover();
+			R2_GLOBALS._player.addMover(mover, &pt, this);
+		}
 		break;
 	default:
 		break;
 	}
-
-	return SceneActor::startAction(action, event);
 }
 
-void Scene1580::postInit(SceneObjectList *OwnerList) {
-	loadScene(1580);
-	R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL;
-	SceneExt::postInit();
-
-	_stripManager.setColors(60, 255);
-	_stripManager.setFontNumber(3);
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
-
-	_sceneMode = 0;
-
-	R2_GLOBALS._player.disableControl();
-	if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) {
-		_joystick.postInit();
-		_joystick.setup(1580, 1, 4);
-		_joystick.setPosition(Common::Point(159, 163));
-		_joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
-	} else {
-		_joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
-	}
-
-	if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) {
-		_screen.postInit();
-		_screen.setup(1580, 1, 1);
-		_screen.setPosition(Common::Point(124, 108));
-		_screen.fixPriority(10);
-		_screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
-
-		_screenDisplay.postInit();
-		_screenDisplay.setup(1580, 1, 3);
-		_screenDisplay.setPosition(Common::Point(124, 96));
-		_screenDisplay.fixPriority(20);
-	} else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) {
-		_screen.postInit();
-		_screen.setup(1580, 1, 1);
-		_screen.setPosition(Common::Point(124, 108));
-		_screen.fixPriority(10);
-		_screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
-
-		_screenDisplay.postInit();
-		_screenDisplay.setup(1580, 3, 1);
-		_screenDisplay.setPosition(Common::Point(124, 109));
-		_screenDisplay.fixPriority(20);
-
-		_sceneMode = 10;
-	} else {
-		_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
-	}
-
-	_storageCompartment.postInit();
-	if (R2_GLOBALS.getFlag(58) == 0) {
-		_storageCompartment.setup(1580, 5, 1);
-		_storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
-	} else {
-		_storageCompartment.setup(1580, 5, 6);
-	}
-
-	_storageCompartment.setPosition(Common::Point(216, 108));
-	_storageCompartment.fixPriority(100);
-
-	_hatchButton.postInit();
-	_hatchButton.setup(1580, 4, 1);
-	_hatchButton.setPosition(Common::Point(291, 147));
-	_hatchButton.fixPriority(100);
-	_hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
-
-	if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) {
-		_thrusterValve.postInit();
-		_thrusterValve.setup(1580, 6, 2);
-		_thrusterValve.setPosition(Common::Point(222, 108));
-		_thrusterValve.fixPriority(50);
-		_thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
-	}
-
-	if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) {
-		_ignitor.postInit();
-		_ignitor.setup(1580, 6, 1);
-		_ignitor.setPosition(Common::Point(195, 108));
-		_ignitor.fixPriority(50);
-		_ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
-	}
+void Scene1550::saveCharacter(int characterIndex) {
+	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
+		R2_GLOBALS._sound1.fadeOut2(NULL);
 
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.hide();
-	setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-	_background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
+	SceneExt::saveCharacter(characterIndex);
 }
 
-void Scene1580::signal() {
-	switch (_sceneMode++) {
-	case 10:
-		_screenDisplay.animate(ANIM_MODE_5, this);
-		break;
-	case 11:
-		_screenDisplay.setup(1580, 1, 2);
-		_screenDisplay.setPosition(Common::Point(124, 94));
+void Scene1550::Wall::setupWall(int frameNumber, int strip) {
+	Scene1550 *scene = (Scene1550 *)R2_GLOBALS._sceneManager._scene;
 
-		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) {
-			_arrActor[0].postInit();
-			_arrActor[0].setup(1580, 2, 1);
-			_arrActor[0].setPosition(Common::Point(138, 56));
+	postInit();
+	if (scene->_wallType == 2)
+		setup(1551, strip, frameNumber);
+	else
+		setup(1554, strip, frameNumber);
+
+	switch (strip) {
+	case 0:
+		switch (frameNumber - 1) {
+		case 0:
+			setup(1551, 1, 1);
+			setPosition(Common::Point(30, 67));
+			break;
+		case 1:
+			setup(1560, 1, 5);
+			setPosition(Common::Point(141, 54));
+			break;
+		case 2:
+			setup(1560, 2, 5);
+			setPosition(Common::Point(178, 54));
+			break;
+		case 3:
+			setup(1560, 2, 1);
+			setPosition(Common::Point(289, 67));
+			break;
+		case 4:
+			setup(1560, 2, 2);
+			setPosition(Common::Point(298, 132));
+			break;
+		case 5:
+			setup(1560, 1, 2);
+			setPosition(Common::Point(21, 132));
+			break;
+		case 6:
+			setup(1560, 2, 4);
+			setPosition(Common::Point(285, 123));
+			break;
+		case 7:
+			setup(1560, 1, 3);
+			setPosition(Common::Point(30, 111));
+			break;
+		case 8:
+			setup(1560, 2, 3);
+			setPosition(Common::Point(289, 111));
+			break;
+		case 9:
+			setup(1560, 1, 4);
+			setPosition(Common::Point(34, 123));
+			break;
+		default:
+			break;
 		}
-
-		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) != 0) {
-			_arrActor[1].postInit();
-			_arrActor[1].setup(1580, 2, 2);
-			_arrActor[1].setPosition(Common::Point(140, 66));
+		fixPriority(1);
+		break;
+	case 1:
+		if (frameNumber == 3) {
+			setup(1553, 3, 1);
+			setPosition(Common::Point(48, 44));
+			fixPriority(2);
+		} else {
+			fixPriority(1);
+			setPosition(Common::Point(32, 17));
 		}
 
-		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) != 0) {
-			_arrActor[2].postInit();
-			_arrActor[2].setup(1580, 2, 3);
-			_arrActor[2].setPosition(Common::Point(142, 85));
+		switch (frameNumber) {
+		case 2:
+			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		case 3:
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		default:
+			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+			break;
 		}
-
-		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) != 0) {
-			_arrActor[3].postInit();
-			_arrActor[3].setup(1580, 2, 4);
-			_arrActor[3].setPosition(Common::Point(142, 92));
+		break;
+	case 2:
+		fixPriority(1);
+		switch (frameNumber) {
+		case 4:
+			setup(1553, 4, 1);
+			setPosition(Common::Point(48, 168));
+			break;
+		case 5:
+			setup(1553, 3, 2);
+			setPosition(Common::Point(20, 168));
+			fixPriority(250);
+			break;
+		default:
+			setPosition(Common::Point(28, 116));
+			break;
 		}
 
-		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) != 0) {
-			_arrActor[4].postInit();
-			_arrActor[4].setup(1580, 2, 5);
-			_arrActor[4].setPosition(Common::Point(108, 54));
+		switch (frameNumber) {
+		case 2:
+			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		case 4:
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		case 5:
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		default:
+			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+			break;
 		}
-
-		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) != 1580) {
-			_arrActor[5].postInit();
-			_arrActor[5].setup(1580, 2, 6);
-			_arrActor[5].setPosition(Common::Point(110, 64));
+		break;
+	case 3:
+		switch (frameNumber) {
+		case 2:
+			fixPriority(2);
+			if (scene->_wallType == 2)
+				setup(1553, 2, 1);
+			else
+				setup(1556, 2, 1);
+			setPosition(Common::Point(160, 44));
+			break;
+		case 3:
+			fixPriority(2);
+			setup(1553, 5, 1);
+			setPosition(Common::Point(178, 44));
+			break;
+		default:
+			fixPriority(1);
+			setPosition(Common::Point(160, 17));
+			break;
 		}
 
-		if (R2_INVENTORY.getObjectScene(R2_BATTERY) != 0) {
-			_arrActor[6].postInit();
-			_arrActor[6].setup(1580, 2, 7);
-			_arrActor[6].setPosition(Common::Point(108, 80));
+		if (frameNumber == 1)
+			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+		else
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+		break;
+	case 4:
+		if (frameNumber == 2) {
+			fixPriority(250);
+			if (scene->_wallType == 2)
+				setup(1553, 1, 1);
+			else
+				setup(1556, 1, 1);
+		} else {
+			fixPriority(2);
 		}
 
-		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) != 0) {
-			_arrActor[7].postInit();
-			_arrActor[7].setup(1580, 2, 8);
-			_arrActor[7].setPosition(Common::Point(111, 92));
-		}
+		if (frameNumber != 1)
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
 
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
-		R2_GLOBALS._player._canWalk = false;
+		setPosition(Common::Point(160, 168));
 		break;
-	case 20:
-		R2_GLOBALS._sceneManager.changeScene(1550);
+	case 5:
+		fixPriority(1);
+		setPosition(Common::Point(287, 17));
+
+		switch (frameNumber) {
+		case 2:
+			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		case 3:
+			setDetails(1550, 6, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		default:
+			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
+			break;
+		}
 		break;
-	case 31:
-		R2_GLOBALS._sceneManager.changeScene(1530);
+	case 6:
+		fixPriority(1);
+		setPosition(Common::Point(291, 116));
+
+		if (frameNumber == 2)
+			setDetails(1550, 3, -1, -1, 2, (SceneItem *) NULL);
+		else
+			setDetails(1550, 72, -1, -1, 2, (SceneItem *) NULL);
 		break;
 	default:
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
-		R2_GLOBALS._player._canWalk = false;
 		break;
 	}
-}
-
-/*--------------------------------------------------------------------------
- * Scene 1625 - Miranda being questioned
- *
- *--------------------------------------------------------------------------*/
-
-bool Scene1625::Wire::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
-	R2_GLOBALS._player.disableControl();
-
-	scene->_sceneMode = 1631;
-	scene->_mirandaMouth.postInit();
-	scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL);
-	return true;
-}
-
-Scene1625::Scene1625() {
-}
 
-void Scene1625::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
 }
 
-void Scene1625::postInit(SceneObjectList *OwnerList) {
-	loadScene(1625);
-	R2_GLOBALS._player._characterIndex = R2_MIRANDA;
-	SceneExt::postInit();
-
-	_stripManager.addSpeaker(&_mirandaSpeaker);
-	_stripManager.addSpeaker(&_tealSpeaker);
-	_stripManager.addSpeaker(&_soldierSpeaker);
-
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.hide();
-
-	_wire.postInit();
-	_wire.setup(1626, 2, 1);
-	_wire.setPosition(Common::Point(206, 133));
-	_wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL);
-
-	_wristRestraints.postInit();
-	_wristRestraints.setup(1625, 8, 1);
-	_wristRestraints.setPosition(Common::Point(190, 131));
-	_wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
+void Scene1550::enterArea() {
+	_walkRegionsId = 0;
+	_dishMode = 0;
 
-	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) {
-		if (!R2_GLOBALS.getFlag(83)) {
-			_glass.postInit();
-			_glass.setup(1626, 4, 1);
-			_glass.setPosition(Common::Point(96, 166));
-			_glass.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL);
-		}
-		R2_GLOBALS._player.enableControl();
-		R2_GLOBALS._player._canWalk = false;
-	} else {
-		_teal.postInit();
-		_teal.fixPriority(10);
+	_wallCorner1.remove();
+	_westWall.remove();
+	_northWall.remove();
+	_southWall.remove();
+	_wallCorner2.remove();
+	_eastWall.remove();
 
-		_tealRightArm.postInit();
+	for (int i = 0; i < 8; ++i)
+		_junk[i].remove();
 
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 1625;
-		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
-	}
+	_wreckage.remove();
 
-	R2_GLOBALS._sound1.play(245);
-	_background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
-	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625;
-	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625;
-}
+	for (int i = 0; i < 8; ++i)
+		_shipComponents[i].remove();
 
-void Scene1625::remove() {
-	R2_GLOBALS._sound1.fadeOut2(NULL);
-	SceneExt::remove();
-}
+	_airbag.remove();
+	_joystick.remove();
+	_gyroscope.remove();
+	_wreckage4.remove();
+	_diagnosticsDisplay.remove();
 
-void Scene1625::signal() {
-	switch (_sceneMode) {
-	case 10:
-		R2_GLOBALS._player.disableControl();
-		_glass.postInit();
-		_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
-		_sceneMode = 1626;
-		setAction(&_sequenceManager, this, 1626, &_tealHead, &_glass, NULL);
-		break;
-	case 12:
-		MessageDialog::show(DONE_MSG, OK_BTN_STRING);
+	if ((_sceneMode != 1577) && (_sceneMode != 1578))
+		_wreckage2.remove();
+
+	_wreckage3.remove();
+	_companion.remove();
+	_dish.remove();
+	_dishTowerShadow.remove();
+	_dishTower.remove();
+	_walkway.remove();
+
+	// Set up of special walk regions for certain areas
+	switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y) {
+	case 0:
+		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
+		case 3:
+			R2_GLOBALS._walkRegions.load(1554);
+			_walkRegionsId = 1554;
+			break;
+		case 4:
+			R2_GLOBALS._walkRegions.load(1553);
+			_walkRegionsId = 1553;
+			break;
+		default:
+			break;
+		}
 		break;
-	case 14:
-		_tealHead.postInit();
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(831, this);
+	case 3:
+	// No break on purpose
+	case 4:
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 23) || (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x)) {
+			if (!R2_GLOBALS.getFlag(16)) {
+				R2_GLOBALS._walkRegions.load(1559);
+				_walkRegionsId = 1559;
+			}
+		}
 		break;
-	case 99:
-		R2_GLOBALS._player.disableControl();
-		switch (_stripManager._exitMode) {
-		case 1:
-			_sceneMode = 1627;
-			setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL);
-			break;
-		case 2:
-			_sceneMode = 1629;
-			setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL);
+	case 7:
+		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
+		case 10:
+			R2_GLOBALS._walkRegions.load(1555);
+			_walkRegionsId = 1555;
 			break;
-		case 4:
-			R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
-			R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
-			R2_GLOBALS._player._characterIndex = R2_QUINN;
-			R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_QUINN]);
+		case 11:
+			R2_GLOBALS._walkRegions.load(1556);
+			_walkRegionsId = 1556;
 			break;
-		case 5:
-			_sceneMode = 1628;
-			_tealHead.remove();
-			setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL);
+		default:
 			break;
-		case 6:
-			_glass.postInit();
-			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
-			_sceneMode = 1632;
-			setAction(&_sequenceManager, this, 1632, &_glass, NULL);
+		}
+		break;
+	case 11:
+		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
+		case 24:
+			R2_GLOBALS._walkRegions.load(1558);
+			_walkRegionsId = 1558;
 			break;
-		case 7:
-			_sceneMode = 1633;
-			setAction(&_sequenceManager, this, 1633, &_glass, NULL);
+		case 25:
+			R2_GLOBALS._walkRegions.load(1557);
+			_walkRegionsId = 1557;
 			break;
-		case 8:
-			_sceneMode = 1635;
-			setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL);
+		default:
 			break;
-		case 9:
-			_glass.postInit();
-			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
-			_sceneMode = 1634;
-			setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL);
+		}
+		break;
+	case 16:
+		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x) {
+		case 2:
+			R2_GLOBALS._walkRegions.load(1552);
+			_walkRegionsId = 1552;
 			break;
 		case 3:
-		// No break on purpose
+			R2_GLOBALS._walkRegions.load(1551);
+			_walkRegionsId = 1551;
+			break;
+		case 15:
+			R2_GLOBALS._walkRegions.load(1575);
+			_walkRegionsId = 1575;
 		default:
-			_sceneMode = 1630;
-			_tealHead.remove();
-			setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL);
 			break;
 		}
-		//_field412 = _stripManager._field2E8;
-		_stripManager._currObj44Id = 0;
-		break;
-	case 1625:
-		_tealHead.postInit();
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
-		_sceneMode = 10;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(800, this);
 		break;
-	case 1626:
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
-		_tealHead.show();
-
-		_mirandaMouth.postInit();
-		_mirandaMouth.setup(1627, 3, 1);
-		_mirandaMouth.setPosition(Common::Point(196, 65));
-
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(832, this);
+	default:
 		break;
-	case 1627:
-		_mirandaMouth.setup(1627, 3, 1);
-		_mirandaMouth.setPosition(Common::Point(196, 65));
-		_mirandaMouth.show();
+	}
 
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(833, this);
-		break;
-	case 1628:
-		R2_GLOBALS.setFlag(83);
-		_tealHead.postInit();
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
+	int varA = 0;
 
-		_mirandaMouth.setup(1627, 3, 1);
-		_mirandaMouth.setPosition(Common::Point(196, 65));
-		_mirandaMouth.show();
+	// This section handles checks if the ARM spacecraft have not yet seized
+	// control of Lance of Truth.
+	if (!R2_GLOBALS.getFlag(16)) {
+		switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y - 2) {
+		case 0:
+			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 22) {
+				case 0:
+					varA = 1553;
+					_northWall.setupWall(6, 0);
+					break;
+				case 1:
+				// No break on purpose
+				case 2:
+				// No break on purpose
+				case 3:
+				// No break on purpose
+				case 4:
+					varA = 1553;
+					break;
+				case 5:
+					varA = 1553;
+					_northWall.setupWall(6, 0);
+					break;
+				default:
+					break;
+			}
+			break;
+		case 1:
+		// No break on purpose
+		case 2:
+			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
+			case 0:
+				varA = 1550;
+				_northWall.setupWall(9, 0);
+				break;
+			case 1:
+				varA = 1552;
+				_northWall.setupWall(10, 0);
+				break;
+			case 2:
+			// No break on purpose
+			case 3:
+			// No break on purpose
+			case 4:
+			// No break on purpose
+			case 5:
+				varA = 1552;
+				break;
+			case 6:
+				varA = 1552;
+				_northWall.setupWall(7, 0);
+				break;
+			case 7:
+				varA = 1550;
+				_northWall.setupWall(8, 0);
+				break;
+			default:
+				break;
+			}
+			break;
+		case 3:
+			switch (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x - 21) {
+			case 0:
+				varA = 1550;
+				_northWall.setupWall(4, 0);
+				break;
+			case 1:
+				varA = 1550;
+				_northWall.setupWall(3, 0);
+				break;
+			case 2:
+			// No break on purpose
+			case 3:
+			// No break on purpose
+			case 4:
+			// No break on purpose
+			case 5:
+				varA = 1551;
+				break;
+			case 6:
+				varA = 1550;
+				_northWall.setupWall(2, 0);
+				break;
+			case 7:
+				varA = 1550;
+				_northWall.setupWall(1, 0);
+				break;
+			default:
+				break;
+			}
+			break;
+		default:
+			break;
+		}
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 0) &&
+				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x <= 29) &&
+				((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x < 20) ||
+				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y > 7))) {
+			// In an area where the cutscene can be triggered, so start it
+			R2_GLOBALS.setFlag(16);
+			R2_GLOBALS._sceneManager.changeScene(1500);
+		}
+	}
 
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(834, this);
-		break;
-	case 1629:
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
-		_tealHead.show();
+	if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == 9) &&
+			(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 11)) {
+		if (_screenNumber != 1234) {
+			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+			loadScene(1234);
+			R2_GLOBALS._sceneManager._hasPalette = false;
+			_wallType = 0;
+		}
+	} else if (_screenNumber == 1234) {
+		R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
+		loadScene(1550);
+		R2_GLOBALS._sceneManager._hasPalette = false;
+	}
 
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(805, this);
-		break;
-	case 1630:
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
-		R2_GLOBALS._player._canWalk = true;
-		break;
-	case 1631:
-		_mirandaMouth.setup(1627, 3, 1);
-		_mirandaMouth.setPosition(Common::Point(196, 65));
-		_mirandaMouth.show();
+	if (_screenNumber == 1234)
+		_walkRegionsId = 1576;
 
-		_wire.remove();
+	if (_wallType == 0) {
+		_wallType = 1;
+	} else {
+		if (_wallType == 2) {
+			_wallType = 3;
+		} else {
+			_wallType = 2;
+		}
 
-		_teal.postInit();
-		_teal.fixPriority(10);
+		if (R2_GLOBALS._sceneManager._sceneNumber == 1550){
+#if 0
+			warning("Mouse_hideIfNeeded()");
+			warning("gfx_set_pane_p");
+			for (int i = 3; i != 168; ++i) {
+				warning("sub294D2(4, i, 312,  var14C)");
+				warning("missing for loop, to be implemented");
+				warning("gfx_draw_slice");
+			}
+			warning("gfx_flip_screen()");
+			warning("gfx_set_pane_p()");
+#endif
+			R2_GLOBALS._sceneManager._fadeMode = FADEMODE_IMMEDIATE;
 
-		_tealRightArm.postInit();
+			if (varA == 0) {
+				if (_sceneResourceId != 1550) {
+					g_globals->_scenePalette.loadPalette(1550);
+					R2_GLOBALS._sceneManager._hasPalette = true;
+				}
+			} else {
+				g_globals->_scenePalette.loadPalette(varA);
+				R2_GLOBALS._sceneManager._hasPalette = true;
+			}
 
-		R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3);
-		_sceneMode = 14;
+			if (R2_GLOBALS._sceneManager._hasPalette)
+				_sceneResourceId = varA;
 
-		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
-		break;
-	case 1632:
-		_tealHead.setup(1627, 1, 1);
-		_tealHead.setPosition(Common::Point(68, 68));
-		_tealHead.show();
+//			warning("sub_2C429()");
+		}
+	}
 
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(835, this);
-		break;
-	case 1633:
-		_glass.remove();
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(818, this);
+	// Scene setup dependent on the type of cell specified in the scene map
+	switch (scene1550AreaMap[(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y * 30) +
+		R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x]) {
+	case 0:
+		// Standard cell
+		if (_walkRegionsId == 0) {
+			R2_GLOBALS._walkRegions.load(1550);
+			_walkRegionsId = 1550;
+		}
 		break;
-	case 1634:
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(836, this);
+	case 1:
+		// North end of the spaceport
+		if (_walkRegionsId == 0) {
+			R2_GLOBALS._walkRegions.load(1560);
+			_walkRegionsId = 1560;
+		}
+		_wallCorner1.setupWall(2, 1);
+		_northWall.setupWall(1, 3);
+		_wallCorner2.setupWall(2, 5);
 		break;
-	case 1635:
-		_mirandaMouth.setup(1627, 3, 1);
-		_mirandaMouth.setPosition(Common::Point(196, 65));
-		_mirandaMouth.show();
-
-		_sceneMode = 99;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		_stripManager.start(818, this);
+	case 2:
+		R2_GLOBALS._walkRegions.load(1561);
+		_walkRegionsId = 1561;
+		_wallCorner1.setupWall(2, 1);
+		_westWall.setupWall(2, 2);
+		_northWall.setupWall(1, 3);
+		_wallCorner2.setupWall(2, 5);
 		break;
-	default:
+	case 3:
+		R2_GLOBALS._walkRegions.load(1562);
+		_walkRegionsId = 1562;
+		_wallCorner1.setupWall(2, 1);
+		_northWall.setupWall(1, 3);
+		_wallCorner2.setupWall(2, 5);
+		_eastWall.setupWall(2, 6);
+		break;
+	case 4:
+		R2_GLOBALS._walkRegions.load(1563);
+		_walkRegionsId = 1563;
+		_northWall.setupWall(2, 3);
+		break;
+	case 5:
+		R2_GLOBALS._walkRegions.load(1564);
+		_walkRegionsId = 1564;
+		_southWall.setupWall(2, 4);
+		break;
+	case 6:
+		R2_GLOBALS._walkRegions.load(1565);
+		_walkRegionsId = 1565;
+		_wallCorner1.setupWall(1, 1);
+		_westWall.setupWall(1, 2);
+		_northWall.setupWall(3, 3);
+		break;
+	case 7:
+		R2_GLOBALS._walkRegions.load(1566);
+		_walkRegionsId = 1566;
+		_wallCorner1.setupWall(1, 1);
+		_westWall.setupWall(1, 2);
+		_northWall.setupWall(2, 4);
+		break;
+	case 8:
+		R2_GLOBALS._walkRegions.load(1567);
+		_walkRegionsId = 1567;
+		_westWall.setupWall(5, 2);
+		break;
+	case 9:
+		R2_GLOBALS._walkRegions.load(1568);
+		_walkRegionsId = 1568;
+		_westWall.setupWall(4, 2);
+		break;
+	case 10:
+		R2_GLOBALS._walkRegions.load(1569);
+		_walkRegionsId = 1569;
+		_wallCorner1.setupWall(3, 1);
+		break;
+	case 11:
+		R2_GLOBALS._walkRegions.load(1570);
+		_walkRegionsId = 1570;
+		_wallCorner1.setupWall(1, 1);
+		_westWall.setupWall(1, 2);
+		break;
+	case 12:
+		R2_GLOBALS._walkRegions.load(1571);
+		_walkRegionsId = 1571;
+		_wallCorner2.setupWall(1, 5);
+		_eastWall.setupWall(1, 6);
+		break;
+	case 13:
+		R2_GLOBALS._walkRegions.load(1572);
+		_walkRegionsId = 1572;
+		_wallCorner1.setupWall(1, 1);
+		_westWall.setupWall(1, 2);
+		_southWall.setupWall(1, 4);
+		break;
+	case 14:
+		R2_GLOBALS._walkRegions.load(1573);
+		_walkRegionsId = 1573;
+		_southWall.setupWall(1, 4);
+		_wallCorner2.setupWall(1, 5);
+		_eastWall.setupWall(1, 6);
+		break;
+	case 15:
+		// South wall
+		R2_GLOBALS._walkRegions.load(1574);
+		_walkRegionsId = 1574;
+		_southWall.setupWall(1, 4);
+		break;
+	case 16:
+		R2_GLOBALS._walkRegions.load(1570);
+		_walkRegionsId = 1570;
+		_wallCorner1.setupWall(2, 1);
+		_westWall.setupWall(2, 2);
+		break;
+	case 17:
+		R2_GLOBALS._walkRegions.load(1570);
+		_walkRegionsId = 1570;
+		_wallCorner1.setupWall(2, 1);
+		_westWall.setupWall(3, 2);
+		break;
+	case 18:
+		R2_GLOBALS._walkRegions.load(1571);
+		_walkRegionsId = 1571;
+		_wallCorner2.setupWall(2, 5);
+		_eastWall.setupWall(2, 6);
+		break;
+	case 19:
+		R2_GLOBALS._walkRegions.load(1571);
+		_walkRegionsId = 1571;
+		_wallCorner2.setupWall(2, 5);
+		_eastWall.setupWall(3, 6);
+		break;
+	default:
 		break;
 	}
-}
-
-void Scene1625::process(Event &event) {
-	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE))
-		event.handled = true;
-	else
-		Scene::process(event);
-}
-
-/*--------------------------------------------------------------------------
- * Scene 1700 - Rim
- *
- *--------------------------------------------------------------------------*/
-
-Scene1700::Scene1700() {
-	_walkFlag = 0;
-}
-
-void Scene1700::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
-
-	s.syncAsSint16LE(_walkFlag);
-}
-
-bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
-
-	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	scene->_sceneMode = 4;
-
-	Common::Point pt(271, 90);
-	PlayerMover *mover = new PlayerMover();
-	R2_GLOBALS._player.addMover(mover, &pt, scene);
-
-	return true;
-}
-
-bool Scene1700::Companion::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_TALK)
-		return SceneActor::startAction(action, event);
-
-	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
-	scene->_sceneMode = 30;
-	scene->signal();
-
-	return true;
-}
-
-void Scene1700::NorthExit::changeScene() {
-	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	_moving = false;
-	scene->_sceneMode = 1;
-
-	Common::Point pt(R2_GLOBALS._player._position.x, 0);
-	NpcMover *mover = new NpcMover();
-	R2_GLOBALS._player.addMover(mover, &pt, scene);
-}
-
-void Scene1700::SouthExit::changeScene() {
-	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	_moving = false;
-	scene->_sceneMode = 2;
-
-	Common::Point pt(R2_GLOBALS._player._position.x, 170);
-	NpcMover *mover = new NpcMover();
-	R2_GLOBALS._player.addMover(mover, &pt, scene);
-}
-
-void Scene1700::WestExit::changeScene() {
-	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	_moving = false;
-	scene->_sceneMode = 6;
-
-	Common::Point pt(0, R2_GLOBALS._player._position.y);
-	NpcMover *mover = new NpcMover();
-	R2_GLOBALS._player.addMover(mover, &pt, scene);
-}
-
-void Scene1700::enterArea() {
-	Rect tmpRect;
-	R2_GLOBALS._walkRegions.load(1700);
-
-	_slabWest.remove();
-	_slabEast.remove();
-	_slabShadowWest.remove();
-	_slabShadowEast.remove();
-	_westPlatform.remove();
-	_rimTransportDoor.remove();
-	_rimTransport.remove();
-
-	if (_sceneMode != 40) {
-		_ledgeHopper.remove();
-		_hatch.remove();
-	}
-
-	// The original had manual code here to redraw the background manually when
-	// changing areas within the scene. Which seems to be totally redundant.
-
-	if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) {
-		// Crashed ledge hopper
-		_ledgeHopper.postInit();
-		_ledgeHopper.setup(1701, 1, 1);
-		_ledgeHopper.setPosition(Common::Point(220, 137));
-		_ledgeHopper.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL);
-		R2_GLOBALS._walkRegions.disableRegion(2);
-		R2_GLOBALS._walkRegions.disableRegion(12);
-	}
-
-	if ((R2_GLOBALS._rimLocation + 2) % 4 == 0) {
-		// The slabs forming the bottom of the regular rings the rim transport travels through
-		_slabWest.postInit();
-		_slabWest.setup(1700, 1, 1);
-		_slabWest.setPosition(Common::Point(222, 82));
-		_slabWest.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
-
-		_slabShadowWest.postInit();
-		_slabShadowWest.setup(1700, 2, 1);
-		_slabShadowWest.setPosition(Common::Point(177, 82));
-		_slabShadowWest.fixPriority(0);
-
-		_slabShadowEast.postInit();
-		_slabShadowEast.setup(1700, 2, 2);
-		_slabShadowEast.setPosition(Common::Point(332, 96));
-		_slabShadowEast.fixPriority(0);
-
-		_slabEast.postInit();
-		_slabEast.setup(1700, 1, 2);
-		_slabEast.setPosition(Common::Point(424, 84));
 
-		R2_GLOBALS._walkRegions.disableRegion(11);
-	}
+	int di = 0;
+	int tmpIdx = 0;
+	for (int i = 0; i < 127 * 4; i += 4) {
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == R2_GLOBALS._scene1550JunkLocations[i]) &&
+				(R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == R2_GLOBALS._scene1550JunkLocations[i + 1]) &&
+				(R2_GLOBALS._scene1550JunkLocations[i + 2] != 0)) {
+			tmpIdx = R2_GLOBALS._scene1550JunkLocations[i + 3];
+			_junk[di].postInit();
+			_junk[di]._effect = EFFECT_SHADED2;
+			_junk[di]._shade = 0;
+			//_junk[di]._junkState = tmpIdx;
+			_junk[di]._junkNumber = i;
+			_junk[di].setDetails(1550, 62, -1, 63, 2, (SceneItem *) NULL);
+			if (R2_GLOBALS._scene1550JunkLocations[i + 2] == 41) {
+				_junk[di].changeZoom(-1);
+				_junk[di].setPosition(Common::Point(150, 70));
+				_junk[di].setup(1562, 1, 1);
 
-	if ((R2_GLOBALS._rimLocation + 399) % 800 == 0) {
-		// Enable west exit to lift
-		_westPlatform.postInit();
-		_westPlatform.setup(1700, 3, 2);
-		_westPlatform.setPosition(Common::Point(51, 141));
-		_westPlatform.fixPriority(0);
-		_westPlatform.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
+				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[2]);
+				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[3]);
+				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[6]);
+				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[7]);
 
-		_westExit._enabled = true;
-	} else {
-		R2_GLOBALS._walkRegions.disableRegion(1);
-		_westExit._enabled = false;
+				if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1550) {
+					_joystick.postInit();
+					_joystick.setup(1562, 3, 1);
+					_joystick.setPosition(Common::Point(150, 70));
+					_joystick.fixPriority(10);
+					_joystick.setDetails(1550, 41, -1, 42, 2, (SceneItem *) NULL);
+				}
+			} else {
+				if (R2_GLOBALS._scene1550JunkLocations[i + 2] > 40) {
+					_junk[di].changeZoom(100);
+					_junk[di].setup(1561, 1, R2_GLOBALS._scene1550JunkLocations[i + 2] - 40);
+				} else {
+					_junk[di].changeZoom(-1);
+					_junk[di].setup(1552, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) / 5) + 1, ((R2_GLOBALS._scene1550JunkLocations[i + 2] - 1) % 5) + 1);
+				}
+				_junk[di].setPosition(Common::Point(scene1550JunkX[tmpIdx], scene1550JunkY[tmpIdx]));
+				if (scene1550JunkRegions[tmpIdx] != 0)
+					R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[tmpIdx]);
+				di++;
+			}
+		}
 	}
 
-	if (  ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._rimLocation == 25) || (R2_GLOBALS._rimLocation == -3)))
-		 || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._rimLocation == R2_GLOBALS._rimTransportLocation))
-		 ) {
-		// Rim transport vechile located
-		R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
-		if (!R2_GLOBALS.getFlag(15))
-			_walkFlag = true;
-
-		_rimTransport.postInit();
-		_rimTransport.setup(1700, 3, 1);
-		_rimTransport.setPosition(Common::Point(338, 150));
-		_rimTransport.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL);
-		_rimTransport.fixPriority(15);
-
-		_rimTransportDoor.postInit();
-		_rimTransportDoor.setup(1700, 4, 1);
-		_rimTransportDoor.setPosition(Common::Point(312, 106));
-		_rimTransportDoor.fixPriority(130);
-	}
-}
+	// Loop for detecting and setting up certain special areas within the map
+	for (int i = 0; i < 15 * 3; i += 3) {
+		if ((R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].x == scene1550SpecialAreas[i])
+				&& (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == scene1550SpecialAreas[i + 1])) {
+			int areaType = scene1550SpecialAreas[i + 2];
+			switch (areaType) {
+			case 1:
+				if (!R2_GLOBALS.getFlag(16)) {
+					_wreckage2.postInit();
+					if (R2_GLOBALS._s1550PlayerArea[R2_GLOBALS._player._characterIndex].y == 3)
+						_wreckage2.setup(1555, 2, 1);
+					else
+						_wreckage2.setup(1555, 1, 1);
+					_wreckage2.setPosition(Common::Point(150, 100));
+					_wreckage2.fixPriority(92);
+					_wreckage2.setDetails(1550, 73, -1, -1, 2, (SceneItem *) NULL);
+				}
+				break;
+			case 2:
+				_dish.postInit();
+				if (R2_GLOBALS.getFlag(19))
+					_dish.setup(1556, 3, 5);
+				else
+					_dish.setup(1556, 3, 1);
+				_dish.changeZoom(95);
+				_dish.setPosition(Common::Point(165, 83));
+				_dish.fixPriority(168);
+				_dish.setDetails(1550, 17, -1, 19, 2, (SceneItem *) NULL);
 
-void Scene1700::postInit(SceneObjectList *OwnerList) {
-	loadScene(1700);
-	SceneExt::postInit();
-	if (R2_GLOBALS._sceneManager._previousScene == -1)
-		R2_GLOBALS._sceneManager._previousScene = 1530;
+				_dishTower.postInit();
+				_dishTower.setup(1556, 4, 1);
+				_dishTower.setPosition(Common::Point(191, 123));
+				_dishTower.changeZoom(95);
+				_dishTower.setDetails(1550, 65, -1, 66, 2, (SceneItem *) NULL);
 
-	scalePalette(65, 65, 65);
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
+				_dishTowerShadow.postInit();
+				_dishTowerShadow._numFrames = 5;
+				if (R2_GLOBALS.getFlag(19))
+					_dishTowerShadow.setup(1556, 8, 5);
+				else
+					_dishTowerShadow.setup(1556, 8, 1);
 
-	_northExit.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700);
-	_southExit.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700);
-	_westExit.setDetails(Rect(0, 0, 12, 138), EXITCURSOR_W, 1800);
+				_dishTowerShadow.setPosition(Common::Point(156, 151));
+				_dishTowerShadow.fixPriority(10);
 
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.setPosition(Common::Point(0, 0));
-	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		R2_GLOBALS._player.setVisage(1501);
-		R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
-	} else {
-		R2_GLOBALS._player.setVisage(1506);
-		R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
-	}
+				_walkway.postInit();
+				if (R2_GLOBALS.getFlag(20))
+					_walkway.setup(1558, 3, 10);
+				else
+					_walkway.setup(1558, 3, 1);
 
-	_companion.postInit();
-	_companion.animate(ANIM_MODE_1, NULL);
-	_companion.setObjectWrapper(new SceneObjectWrapper());
+				_walkway.setPosition(Common::Point(172, 48));
+				_walkway.fixPriority(169);
+				R2_GLOBALS._walkRegions.disableRegion(scene1550JunkRegions[15]);
+				break;
+			case 3:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 1, 1);
+				_wreckage.setPosition(Common::Point(259, 55));
+				_wreckage.fixPriority(133);
+				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
 
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		_companion.setVisage(1506);
-		_companion._moveDiff = Common::Point(3, 1);
-		_companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
-	} else {
-		_companion.setVisage(1501);
-		_companion._moveDiff = Common::Point(2, 1);
-		_companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
-	}
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 1, 2);
+				_wreckage2.setPosition(Common::Point(259, 133));
+				_wreckage2.fixPriority(105);
+				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+				if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 1550) {
+					_gyroscope.postInit();
+					_gyroscope.setup(1550, 7, 2);
+					_gyroscope.setPosition(Common::Point(227, 30));
+					_gyroscope.fixPriority(130);
+					_gyroscope.setDetails(1550, 29, -1, 63, 2, (SceneItem *) NULL);
+				}
+				break;
+			case 4:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 1, 4);
+				_wreckage.setPosition(Common::Point(76, 131));
+				_wreckage.fixPriority(10);
+				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
 
-	R2_GLOBALS._sound1.play(134);
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 1, 3);
+				_wreckage2.setPosition(Common::Point(76, 64));
+				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+				if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1550) {
+					_diagnosticsDisplay.postInit();
+					_diagnosticsDisplay.setup(1504, 4, 1);
+					_diagnosticsDisplay.setPosition(Common::Point(49, 35));
+					_diagnosticsDisplay.animate(ANIM_MODE_2, NULL);
+					_diagnosticsDisplay._numFrames = 4;
+					_diagnosticsDisplay.fixPriority(65);
+					_diagnosticsDisplay.setDetails(1550, 14, 15, 63, 2, (SceneItem *) NULL);
+				}
+				if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1550) {
+					_airbag.postInit();
+					_airbag.setup(1550, 7, 1);
+					_airbag.setPosition(Common::Point(45, 44));
+					_airbag.fixPriority(150);
+					_airbag.setDetails(1550, 44, -1, 63, 2, (SceneItem *) NULL);
+				}
+				break;
+			case 5:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 2, 4);
+				_wreckage.setPosition(Common::Point(243, 131));
+				_wreckage.fixPriority(10);
+				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
 
-	_playerShadow.postInit();
-	_playerShadow.fixPriority(10);
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 2, 3);
+				_wreckage2.setPosition(Common::Point(243, 64));
+				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+				break;
+			case 6:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 2, 1);
+				_wreckage.setPosition(Common::Point(60, 55));
+				_wreckage.fixPriority(133);
+				_wreckage.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
 
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		_playerShadow.setVisage(1112);
-	else
-		_playerShadow.setVisage(1111);
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 2, 2);
+				_wreckage2.setPosition(Common::Point(60, 133));
+				_wreckage2.fixPriority(106);
+				_wreckage2.setDetails(1550, 9, -1, -1, 2, (SceneItem *) NULL);
+				break;
+			case 7:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 3, 1);
+				_wreckage.setPosition(Common::Point(281, 132));
+				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+				break;
+			case 8:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 3, 2);
+				_wreckage.setPosition(Common::Point(57, 96));
+				_wreckage.fixPriority(70);
+				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-	_playerShadow._effect = EFFECT_SHADOW_MAP;
-	_playerShadow._shadowMap = _shadowPaletteMap;
-	R2_GLOBALS._player._linkedActor = &_playerShadow;
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 3, 3);
+				_wreckage2.setPosition(Common::Point(145, 88));
+				_wreckage2.fixPriority(55);
+				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-	_companionShadow.postInit();
-	_companionShadow.fixPriority(10);
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		_companionShadow.setVisage(1111);
-	else
-		_companionShadow.setVisage(1112);
+				_wreckage3.postInit();
+				_wreckage3.setup(1550, 3, 4);
+				_wreckage3.setPosition(Common::Point(64, 137));
+				_wreckage3.fixPriority(115);
+				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-	_companionShadow._effect = EFFECT_SHADOW_MAP;
-	_companionShadow._shadowMap = _shadowPaletteMap;
-	_companion._linkedActor = &_companionShadow;
+				_wreckage4.postInit();
+				_wreckage4.setup(1550, 5, 1);
+				_wreckage4.setPosition(Common::Point(60, 90));
+				_wreckage4.fixPriority(45);
+				break;
+			case 9:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 4, 2);
+				_wreckage.setPosition(Common::Point(262, 96));
+				_wreckage.fixPriority(70);
+				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-	R2_GLOBALS._sound1.play(134);
+				_wreckage2.postInit();
+				_wreckage2.setup(1550, 4, 3);
+				_wreckage2.setPosition(Common::Point(174, 88));
+				_wreckage2.fixPriority(55);
+				_wreckage2.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-	switch (R2_GLOBALS._sceneManager._previousScene) {
-	case 1530:
-		R2_GLOBALS._player._characterIndex = R2_QUINN;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._player.hide();
-		_companion.hide();
+				_wreckage3.postInit();
+				_wreckage3.setup(1550, 4, 4);
+				_wreckage3.setPosition(Common::Point(255, 137));
+				_wreckage3.fixPriority(115);
+				_wreckage3.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
 
-		_hatch.postInit();
-		_hatch.hide();
+				_wreckage4.postInit();
+				_wreckage4.setup(1550, 6, 1);
+				_wreckage4.setPosition(Common::Point(259, 90));
+				_wreckage4.fixPriority(45);
+				break;
+			case 10:
+				_wreckage.postInit();
+				_wreckage.setup(1550, 4, 1);
+				_wreckage.setPosition(Common::Point(38, 132));
+				_wreckage.setDetails(1550, 56, -1, -1, 2, (SceneItem *) NULL);
+				break;
+			case 12:
+				// Intact ship
+				_shipComponents[7].setupShipComponent(8);
+				_shipComponents[0].setupShipComponent(1);
+				_shipComponents[1].setupShipComponent(2);
+				_shipComponents[2].setupShipComponent(3);
+				_shipComponents[3].setupShipComponent(4);
+				_shipComponents[4].setupShipComponent(5);
+				_shipComponents[5].setupShipComponent(6);
+				_shipComponents[6].setupShipComponent(7);
+				break;
+			default:
+				break;
+			}
+		}
+	}
 
-		_ledgeHopper.postInit();
-		_ledgeHopper.setup(1701, 1, 1);
-		_ledgeHopper.setPosition(Common::Point(220, 137));
-		_ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL);
+	if (R2_GLOBALS._s1550PlayerArea[R2_QUINN] == R2_GLOBALS._s1550PlayerArea[R2_SEEKER]) {
+		_companion.postInit();
+		_companion._effect = EFFECT_SHADED2;
+		_companion.changeZoom(-1);
 
-		_playerShadow.hide();
-		_companionShadow.hide();
-		R2_GLOBALS._events.setCursor(CURSOR_WALK);
-		_stripManager.start(539, this);
-		_sceneMode = 40;
-		break;
-	case 1750: {
-		R2_GLOBALS._player.setPosition(Common::Point(282, 121));
-		_companion.setPosition(Common::Point(282, 139));
-		_sceneMode = 8;
-		Common::Point pt(262, 101);
-		NpcMover *mover = new NpcMover();
-		R2_GLOBALS._player.addMover(mover, &pt, this);
-		Common::Point pt2(262, 119);
-		NpcMover *mover2 = new NpcMover();
-		_companion.addMover(mover2, &pt2, this);
-		}
-		break;
-	case 1800: {
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._player.setPosition(Common::Point(0, 86));
-		_companion.setPosition(Common::Point(0, 64));
-		_sceneMode = 7;
-		R2_GLOBALS._player.setObjectWrapper(NULL);
-		R2_GLOBALS._player._strip = 1;
-		Common::Point pt(64, 86);
-		NpcMover *mover = new NpcMover();
-		R2_GLOBALS._player.addMover(mover, &pt, this);
-		_companion.setObjectWrapper(NULL);
-		_companion._strip = 1;
-		Common::Point pt2(77, 64);
-		NpcMover *mover2 = new NpcMover();
-		_companion.addMover(mover2, &pt2, NULL);
-		}
-		break;
-	default:
+		assert((_walkRegionsId >= 1550) && (_walkRegionsId <= 2008));
+		R2_GLOBALS._walkRegions.disableRegion(k5A750[_walkRegionsId - 1550]);
+		_companion.setPosition(Common::Point(scene1550JunkX[k5A76D[_walkRegionsId - 1550]], scene1550JunkY[k5A76D[_walkRegionsId - 1550]] + 8));
 		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_GLOBALS._player.setPosition(Common::Point(109, 160));
-			_companion.setPosition(Common::Point(156, 160));
-			R2_GLOBALS._walkRegions.disableRegion(15);
+			if (R2_GLOBALS._player._characterScene[R2_SEEKER] == 1580) {
+				_companion.setup(1516, 3, 17);
+				_companion.setPosition(Common::Point(272, 94));
+				_companion.fixPriority(91);
+				_companion.changeZoom(100);
+				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
+			} else {
+				_companion.setup(1505, 6, 1);
+				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+			}
 		} else {
-			R2_GLOBALS._player.setPosition(Common::Point(156, 160));
-			_companion.setPosition(Common::Point(109, 160));
-			R2_GLOBALS._walkRegions.disableRegion(17);
+			if (R2_GLOBALS._player._characterScene[R2_QUINN] == 1580) {
+				_companion.setup(1516, 2, 14);
+				_companion.setPosition(Common::Point(276, 97));
+				_companion.fixPriority(91);
+				_companion.changeZoom(100);
+				_companion.setDetails(1550, -1, -1, -1, 5, &_shipComponents[7]);
+			} else {
+				_companion.setup(1500, 6, 1);
+				_companion.setDetails(1550, -1, -1, -1, 2, (SceneItem *) NULL);
+			}
 		}
-		_sceneMode = 50;
-		setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
-		break;
 	}
-	R2_GLOBALS._player._characterScene[R2_QUINN] = 1700;
-	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1700;
-	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1700;
-	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1700;
+	R2_GLOBALS._uiElements.updateInventory();
+}
 
-	enterArea();
+/*--------------------------------------------------------------------------
+ * Scene 1575 - Spaceport - unused ship scene
+ *
+ *--------------------------------------------------------------------------*/
 
-	_surface.setDetails(1, 1700, 3, -1, -1);
-	_background.setDetails(Rect(0, 0, 480, 200), 1700, 0, -1, -1, 1, NULL);
+Scene1575::Button::Button() {
+	_buttonId = 0;
+	_pressed = false;
 }
 
-void Scene1700::remove() {
-	R2_GLOBALS._sound1.fadeOut2(NULL);
-	SceneExt::remove();
+void Scene1575::Button::synchronize(Serializer &s) {
+	NamedHotspot::synchronize(s);
+
+	s.syncAsSint16LE(_buttonId);
+	s.syncAsSint16LE(_pressed);
 }
 
-void Scene1700::signal() {
-	switch (_sceneMode) {
-	case 1: {
-		_sceneMode = 3;
-		if (R2_GLOBALS._rimLocation < 2400)
-			++R2_GLOBALS._rimLocation;
-		enterArea();
-		R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 103) * 167) / 100), 170));
-		Common::Point pt(R2_GLOBALS._player._position.x, 160);
-		NpcMover *mover = new NpcMover();
-		R2_GLOBALS._player.addMover(mover, &pt, this);
+void Scene1575::Button::process(Event &event) {
+	Scene1575 *scene = (Scene1575 *)R2_GLOBALS._sceneManager._scene;
+	bool isInBounds = _bounds.contains(event.mousePos);
+	CursorType cursor = R2_GLOBALS._events.getCursor();
 
-		if (R2_GLOBALS._player._position.x < 132) {
-			_companion.setPosition(Common::Point(156, 170));
-			Common::Point pt2(156, 160);
-			NpcMover *mover2 = new NpcMover();
-			_companion.addMover(mover2, &pt2, NULL);
-			R2_GLOBALS._walkRegions.disableRegion(15);
-		} else {
-			_companion.setPosition(Common::Point(109, 170));
-			Common::Point pt3(109, 160);
-			NpcMover *mover3 = new NpcMover();
-			_companion.addMover(mover3, &pt3, NULL);
-			R2_GLOBALS._walkRegions.disableRegion(17);
-		}
-		}
-		break;
-	case 2: {
-		_sceneMode = 3;
-		if (R2_GLOBALS._rimLocation > -2400)
-			--R2_GLOBALS._rimLocation;
-		enterArea();
-		R2_GLOBALS._player.setPosition(Common::Point(235 - (((((235 - R2_GLOBALS._player._position.x) * 100) / 167) * 103) / 100), 0));
-		Common::Point pt(R2_GLOBALS._player._position.x, 10);
-		NpcMover *mover = new NpcMover();
-		R2_GLOBALS._player.addMover(mover, &pt, this);
+	if ((event.eventType == EVENT_BUTTON_DOWN && cursor == CURSOR_USE && isInBounds) ||
+		(_pressed && _buttonId != 1 && event.eventType == EVENT_BUTTON_UP && isInBounds)) {
+		// Button pressed
+		_pressed = true;
+		Common::Point pos = scene->_actor1._position;
+		event.handled = true;
 
-		if (R2_GLOBALS._player._position.x >= 171) {
-			_companion.setPosition(Common::Point(155, 0));
-			Common::Point pt2(155, 10);
-			NpcMover *mover2 = new NpcMover();
-			_companion.addMover(mover2, &pt2, NULL);
-			R2_GLOBALS._walkRegions.disableRegion(15);
-		} else {
-			_companion.setPosition(Common::Point(188, 0));
-			Common::Point pt3(188, 10);
-			NpcMover *mover3 = new NpcMover();
-			_companion.addMover(mover3, &pt3, NULL);
-			R2_GLOBALS._walkRegions.disableRegion(17);
-		}
-		}
-		break;
-	case 3:
-		if (!_walkFlag) {
-			R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		} else {
-			R2_GLOBALS.setFlag(15);
-			_walkFlag = false;
-			_sceneMode = 31;
-			R2_GLOBALS._events.setCursor(CURSOR_WALK);
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-				_stripManager.start(542, this);
-			else
-				_stripManager.start(543, this);
-		}
-		break;
-	case 4: {
-		_sceneMode = 5;
-		Common::Point pt(271, 90);
-		PlayerMover *mover = new PlayerMover();
-		_companion.addMover(mover, &pt, NULL);
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			setAction(&_sequenceManager, this, 1700, &R2_GLOBALS._player, &_rimTransportDoor, NULL);
-		else
-			setAction(&_sequenceManager, this, 1701, &R2_GLOBALS._player, &_rimTransportDoor, NULL);
-		}
-		break;
-	case 5:
-		R2_GLOBALS._sceneManager.changeScene(1750);
-		break;
-	case 6:
-		R2_GLOBALS._sceneManager.changeScene(1800);
-		break;
-	case 7:
-		R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
-		R2_GLOBALS._player._strip = 1;
-		_companion.setObjectWrapper(new SceneObjectWrapper());
-		_companion._strip = 1;
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		R2_GLOBALS._walkRegions.disableRegion(14);
-		break;
-	case 8:
-		R2_GLOBALS._player._strip = 2;
-		_companion._strip = 1;
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		R2_GLOBALS._walkRegions.disableRegion(12);
-		break;
-	case 30:
-		_sceneMode = 31;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			_stripManager.start(540, this);
-		else
-			_stripManager.start(541, this);
-		break;
-	case 31:
-		R2_GLOBALS._player.enableControl(CURSOR_TALK);
-		break;
-	case 40:
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 1704;
-		setAction(&_sequenceManager, this, 1704, &R2_GLOBALS._player, &_companion,
-			&_hatch, &_ledgeHopper, &_playerShadow, &_companionShadow, NULL);
-		break;
-	case 50:
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			R2_GLOBALS._walkRegions.disableRegion(15);
-		else
-			R2_GLOBALS._walkRegions.disableRegion(17);
+		if (!R2_GLOBALS.getFlag(18) || _buttonId <= 1 || _buttonId >= 6) {
+			switch (_buttonId) {
+			case 1:
+				if (R2_GLOBALS.getFlag(18)) {
+					scene->_actor14.hide();
+					scene->_actor15.hide();
+					R2_GLOBALS.clearFlag(18);
+				} else if ((scene->_actor12._position.x == 85) && (scene->_actor12._position.y == 123)) {
+					scene->_actor14.show();
+					scene->_actor15.show();
+					R2_GLOBALS.setFlag(18);
+				} else {
+					SceneItem::display("That's probably not a good thing, ya know!");
+				}
+				break;
+			case 2:
+				if (scene->_field41A < 780) {
+					if (pos.x > 54)
+						pos.x -= 65;
+					pos.x += 2;
+					scene->_field41A += 2;
 
-		R2_GLOBALS._player.enableControl();
-		break;
-	case 1704:
-		R2_GLOBALS._sound1.play(134);
-		R2_GLOBALS._walkRegions.disableRegion(15);
-		R2_GLOBALS._walkRegions.disableRegion(2);
-		R2_GLOBALS._walkRegions.disableRegion(12);
-		R2_GLOBALS._player.fixPriority(-1);
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		break;
-	default:
-		R2_GLOBALS._player.enableControl();
-		break;
-	}
-}
+					for (int i = 0; i < 17; i++)
+						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x + 2, scene->_arrActor[i]._position.y));
 
-/*--------------------------------------------------------------------------
- * Scene 1750 - Maintaiance Vechile
- *
- *--------------------------------------------------------------------------*/
+					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x + 2, scene->_actor13._position.y));
+					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x + 2, scene->_actor12._position.y));
+					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+				}
+				break;
+			case 3:
+				if (scene->_field41A > 0) {
+					if (pos.x < -8)
+						pos.x += 65;
+
+					pos.x -= 2;
+					scene->_field41A -= 2;
+					for (int i = 0; i < 17; i++)
+						scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x - 2, scene->_arrActor[i]._position.y));
+
+					scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x - 2, scene->_actor13._position.y));
+					scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x - 2, scene->_actor12._position.y));
+					scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+					scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+					scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+				}
+				break;
+			case 4: {
+					if (pos.y < 176) {
+						++pos.y;
+						for (int i = 0; i < 17; ++i)
+							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y + 1));
+
+						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y + 1));
+						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y + 1));
+						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+					}
+				}
+				break;
+			case 5: {
+					if (pos.y > 145) {
+						--pos.y;
+						for (int i = 0; i < 17; ++i)
+							scene->_arrActor[i].setPosition(Common::Point(scene->_arrActor[i]._position.x, scene->_arrActor[i]._position.y - 1));
+
+						scene->_actor13.setPosition(Common::Point(scene->_actor13._position.x, scene->_actor13._position.y - 1));
+						scene->_actor12.setPosition(Common::Point(scene->_actor12._position.x, scene->_actor12._position.y - 1));
+						scene->_actor1.setPosition(Common::Point(pos.x, pos.y));
+						scene->_actor2.setPosition(Common::Point(pos.x + 65, pos.y));
+						scene->_actor3.setPosition(Common::Point(pos.x + 130, pos.y));
+					}
+				}
+				break;
+			case 6:
+				R2_GLOBALS._sceneManager.changeScene(1550);
+				break;
+			default:
+				break;
+			}
 
-Scene1750::Button::Button() {
-	_buttonId = 0;
-}
+			int j = 0;
+			for (int i = 0; i < 17; i++) {
+				if (scene->_arrActor[i]._bounds.contains(85, 116))
+					j = i;
+			}
 
-void Scene1750::Button::synchronize(Serializer &s) {
-	SceneActor::synchronize(s);
+			if (scene->_actor13._bounds.contains(85, 116))
+				j = 18;
 
-	s.syncAsSint16LE(_buttonId);
+			if (scene->_actor12._bounds.contains(85, 116))
+				j = 19;
+
+			if (j)
+				scene->_actor11.show();
+			else
+				scene->_actor11.hide();
+		} else {
+			SceneItem::display("Better not move the laser while it's firing!");
+		}
+	} else {
+		_pressed = false;
+	}
 }
 
-bool Scene1750::Button::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
+bool Scene1575::Button::startAction(CursorType action, Event &event) {
+	if (action == CURSOR_USE)
+		return false;
+	return SceneHotspot::startAction(action, event);
+}
 
-	Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
+void Scene1575::Button::initButton(int buttonId) {
+	_buttonId = buttonId;
+	_pressed = false;
+	EventHandler::postInit();
 
 	switch (_buttonId) {
 	case 1:
-		// Forward button
-		show();
-		scene->_backwardButton.hide();
-		if (scene->_speed < 0)
-			scene->_speed = -scene->_speed;
-		scene->_direction = 1;
+		setDetails(Rect(53, 165, 117, 190), -1, -1, -1, 2, 1, NULL);
 		break;
 	case 2:
-		// Backwards button
-		show();
-		scene->_forwardButton.hide();
-		if (scene->_speed > 0)
-			scene->_speed = -scene->_speed;
-		scene->_direction = -1;
+		setDetails(Rect(151, 142, 189, 161), -1, -1, -1, 2, 1, NULL);
 		break;
 	case 3:
-		// Exit button
-		if (scene->_rotation->_idxChange == 0) {
-			show();
-			R2_GLOBALS._sceneManager.changeScene(1700);
-		} else {
-			scene->_speed = 0;
-			scene->_speedSlider._moveRate = 20;
-			scene->_forwardButton._moveDiff.y = 1;
-			Common::Point pt(286, 143);
-			NpcMover *mover = new NpcMover();
-			scene->_speedSlider.addMover(mover, &pt, NULL);
-		}
+		setDetails(Rect(225, 142, 263, 161), -1, -1, -1, 2, 1, NULL);
+		break;
+	case 4:
+		setDetails(Rect(188, 122, 226, 140), -1, -1, -1, 2, 1, NULL);
+		break;
+	case 5:
+		setDetails(Rect(188, 162, 226, 180), -1, -1, -1, 2, 1, NULL);
+		break;
+	case 6:
+		setDetails(Rect(269, 169, 301, 185), -1, -1, -1, 2, 1, NULL);
+		break;
 	default:
 		break;
 	}
-
-	return true;
-}
-
-/*------------------------------------------------------------------------*/
-
-Scene1750::SpeedSlider::SpeedSlider() {
-	_incrAmount = 0;
-	_xp = 0;
-	_ys = 0;
-	_height = 0;
-	_thumbHeight = 0;
-	_mouseDown = false;
 }
 
-void Scene1750::SpeedSlider::synchronize(Serializer &s) {
-	SceneActor::synchronize(s);
+/*--------------------------------------------------------------------------*/
 
-	s.syncAsSint16LE(_incrAmount);
-	s.syncAsSint16LE(_xp);
-	s.syncAsSint16LE(_ys);
-	s.syncAsSint16LE(_height);
-	s.syncAsSint16LE(_thumbHeight);
-	s.syncAsSint16LE(_mouseDown);
+Scene1575::Scene1575() {
+	_field412 = 0;
+	_field414 = 390;
+	_field416 = 0;
+	_field418 = 0;
+	_field41A = 0;
 }
 
-void Scene1750::SpeedSlider::setupSlider(int incrAmount, int xp, int ys, int height, int thumbHeight) {
-	_mouseDown = false;
-	_incrAmount = incrAmount;
-	_xp = xp;
-	_ys = ys;
-	_height = height;
-	_thumbHeight = thumbHeight;
+void Scene1575::synchronize(Serializer &s) {
+	SceneExt::synchronize(s);
 
-	postInit();
-	setup(1750, 1, 1);
-	fixPriority(255);
-	setPosition(Common::Point(_xp, _ys + ((_height * (incrAmount - 1)) / (_thumbHeight - 1))));
+	s.syncAsSint16LE(_field412);
+	s.syncAsSint16LE(_field414);
+	s.syncAsSint16LE(_field416);
+	s.syncAsSint16LE(_field418);
+	s.syncAsSint16LE(_field41A);
 }
 
-void Scene1750::SpeedSlider::calculateSlider() {
-	Scene1750 *scene = (Scene1750 *)R2_GLOBALS._sceneManager._scene;
-
-	int tmpVar = (_height / (_thumbHeight - 1)) / 2;
-	int tmpVar2 = ((_position.y - _ys + tmpVar) * _thumbHeight) / (_height + 2 * tmpVar);
-
-	setPosition(Common::Point(_xp, _ys + ((_height * tmpVar2) / (_thumbHeight - 1))));
-	scene->_speed = scene->_direction * tmpVar2;
+double hypotenuse(double v1, double v2) {
+	return sqrt(v1 * v1 + v2 * v2);
 }
 
-void Scene1750::SpeedSlider::process(Event &event) {
-	if ((event.eventType == EVENT_BUTTON_DOWN) && (R2_GLOBALS._events.getCursor() == CURSOR_USE) &&
-			(_bounds.contains(event.mousePos))) {
-		_mouseDown = true;
-		event.eventType = EVENT_NONE;
-	}
-
-	if ((event.eventType == EVENT_BUTTON_UP) && _mouseDown) {
-		_mouseDown = false;
-		event.handled = true;
-		addMover(NULL);
-		calculateSlider();
-	}
-
-	if (_mouseDown) {
-		event.handled = true;
-		if (event.mousePos.y >= _ys) {
-			if (_ys + _height >= event.mousePos.y)
-				setPosition(Common::Point(_xp, event.mousePos.y));
-			else
-				setPosition(Common::Point(_xp, _ys + _height));
-		} else {
-			setPosition(Common::Point(_xp, _ys));
-		}
-	}
-}
+void Scene1575::postInit(SceneObjectList *OwnerList) {
+	loadScene(1575);
+	R2_GLOBALS._uiElements._active = false;
+	SceneExt::postInit();
+	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
 
-bool Scene1750::SpeedSlider::startAction(CursorType action, Event &event) {
-	if (action == CURSOR_USE)
-		return SceneActor::startAction(action, event);
+	_actor1.postInit();
+	_actor1.setup(1575, 1, 1);
+	_actor1.setPosition(Common::Point(54, 161));
+	_actor1.fixPriority(5);
 
-	return false;
-}
+	_actor2.postInit();
+	_actor2.setup(1575, 1, 1);
+	_actor2.setPosition(Common::Point(119, 161));
+	_actor2.fixPriority(5);
 
-/*------------------------------------------------------------------------*/
+	_actor3.postInit();
+	_actor3.setup(1575, 1, 1);
+	_actor3.setPosition(Common::Point(184, 161));
+	_actor3.fixPriority(5);
 
-Scene1750::Scene1750() {
-	_direction = 0;
-	_speedCurrent = 0;
-	_speed = 0;
-	_speedDelta = 0;
-	_rotationSegment = 0;
-	_rotationSegCurrent = 0;
-	_newRotation = 0;
+	for (int i = 0; i < 17; i++) {
+		_arrActor[i].postInit();
+		_arrActor[i].setup(1575, 2, k5A7F6[3 * i + 2]);
 
-	_rotation = nullptr;
-}
+		double v1 = hypotenuse(2.0, 3 - k5A7F6[3 * i]);
+		v1 += hypotenuse(2.0, 3 - k5A7F6[3 * i + 1]);
+		int yp = (int)(sqrt(v1) * 75.0 / 17.0 - 161.0);
 
-void Scene1750::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
-	SYNC_POINTER(_rotation);
+		int angle = R2_GLOBALS._gfxManagerInstance.getAngle(
+			Common::Point(3, 16), Common::Point(k5A7F6[3 * i], k5A7F6[3 * i + 1]));
+		int xp = angle * 78 / 9 - 319;
 
-	s.syncAsSint16LE(_direction);
-	s.syncAsSint16LE(_speedCurrent);
-	s.syncAsSint16LE(_speed);
-	s.syncAsSint16LE(_speedDelta);
-	s.syncAsSint16LE(_rotationSegment);
-	s.syncAsSint16LE(_rotationSegCurrent);
-	s.syncAsSint16LE(_newRotation);
-}
+		_arrActor[i].setPosition(Common::Point(xp, yp));
+		_arrActor[i].fixPriority(6);
+	}
 
-void Scene1750::postInit(SceneObjectList *OwnerList) {
-	loadScene(1750);
-	R2_GLOBALS._sound1.play(115);
-	R2_GLOBALS._uiElements._active = false;
+	_actor4.postInit();
+	_actor4.setup(1575, 3, 1);
+	_actor4.setPosition(Common::Point(48, 81));
 
-	SceneExt::postInit();
-	R2_GLOBALS._interfaceY = SCREEN_HEIGHT;
+	_actor5.postInit();
+	_actor5.setup(1575, 3,1);
+	_actor5.setPosition(Common::Point(121, 81));
 
-	R2_GLOBALS._player._characterScene[R2_QUINN] = 1750;
-	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1750;
-	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1750;
-	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1750;
+	_actor6.postInit();
+	_actor6.setup(1575, 3, 2);
+	_actor6.setPosition(Common::Point(203, 80));
 
-	_rotation = R2_GLOBALS._scenePalette.addRotation(224, 254, 1);
-	_rotation->setDelay(0);
-	_rotation->_idxChange = 0;
-	_rotation->_countdown = 2;
+	_actor7.postInit();
+	_actor7.setup(1575, 3, 2);
+	_actor7.setPosition(Common::Point(217, 80));
 
-	switch ((R2_GLOBALS._rimLocation + 2) % 4) {
-	case 0:
-		_rotation->_currIndex = 247;
-		break;
-	case 1:
-		_rotation->_currIndex = 235;
-		break;
-	case 2:
-		_rotation->_currIndex = 239;
-		break;
-	case 3:
-		_rotation->_currIndex = 243;
-		break;
-	default:
-		break;
-	}
+	_actor8.postInit();
+	_actor8.setup(1575, 3, 2);
+	_actor8.setPosition(Common::Point(231, 80));
 
-	byte tmpPal[768];
+	_actor9.postInit();
+	_actor9.setup(1575, 3, 2);
+	_actor9.setPosition(Common::Point(273, 91));
 
-	for (int i = 224; i < 255; i++) {
-		int tmpIndex = _rotation->_currIndex - 224;
-		if (tmpIndex > 254)
-			tmpIndex -= 31;
-		tmpPal[3 * i] = R2_GLOBALS._scenePalette._palette[3 * tmpIndex];
-		tmpPal[(3 * i) + 1] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 1];
-		tmpPal[(3 * i) + 2] = R2_GLOBALS._scenePalette._palette[(3 * tmpIndex) + 2];
-	}
+	_actor10.postInit();
+	_actor10.setup(1575, 3, 2);
+	_actor10.setPosition(Common::Point(287, 91));
 
-	for (int i = 224; i < 255; i++) {
-		R2_GLOBALS._scenePalette._palette[3 * i] = tmpPal[3 * i];
-		R2_GLOBALS._scenePalette._palette[(3 * i) + 1] = tmpPal[(3 * i) + 1];
-		R2_GLOBALS._scenePalette._palette[(3 * i) + 2] = tmpPal[(3 * i) + 2];
-	}
+	// Initialize buttons
+	_button1.initButton(1);
+	_button2.initButton(2);
+	_button3.initButton(3);
+	_button4.initButton(4);
+	_button5.initButton(5);
+	_button6.initButton(6);
+
+	_actor11.postInit();
+	_actor11.setup(1575, 4, 2);
+	_actor11.setPosition(Common::Point(84, 116));
+	_actor11.hide();
 
 	R2_GLOBALS._player.postInit();
 	R2_GLOBALS._player.hide();
 	R2_GLOBALS._player.enableControl();
 
-	_radarSweep.postInit();
-	_radarSweep.setup(1750, 3, 1);
-	_radarSweep.setPosition(Common::Point(49, 185));
-	_radarSweep.fixPriority(7);
-	_radarSweep.setDetails(1750, 30, -1, -1, 1, (SceneItem *) NULL);
-
-	_scannerIcon.postInit();
-	_scannerIcon.setup(1750, 2, 1);
-	_scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) + ((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
-	_scannerIcon.fixPriority(8);
+	do {
+		_field412 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
+		_field414 = R2_GLOBALS._randomSource.getRandomNumber(20) - 10;
+	} while ((_field412) && (_field414));
 
-	_redLights.postInit();
-	_redLights.setup(1750, 1, 4);
+	if (_field412 < 0)
+		_actor4.hide();
 
-	int tmpVar = ABS(_scannerIcon._position.y - 158) / 100;
+	if (_field414 < 0)
+		_actor5.hide();
 
-	if (tmpVar >= 8)
-		_redLights.hide();
-	else if (_scannerIcon._position.y <= 158)
-		_redLights.setPosition(Common::Point(137, (tmpVar * 7) + 122));
-	else
-		_redLights.setPosition(Common::Point(148, (tmpVar * 7) + 122));
+	_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+	_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
 
-	_speedSlider.setupSlider(1, 286, 143, 41, 15);
-	_speedSlider.setDetails(1750, 24, 1, -1, 1, (SceneItem *) NULL);
+	_actor13.postInit();
+	_actor13.setup(1575, 2, 4);
 
-	_forwardButton.postInit();
-	_forwardButton._buttonId = 1;
-	_forwardButton.setup(1750, 1, 2);
-	_forwardButton.setPosition(Common::Point(192, 140));
-	_forwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
+	// TODO
+	warning("TODO: another immense pile of floating operations");
 
-	_backwardButton.postInit();
-	_backwardButton._buttonId = 2;
-	_backwardButton.setup(1750, 1, 3);
-	_backwardButton.setPosition(Common::Point(192, 163));
-	_backwardButton.setDetails(1750, 18, 1, -1, 1, (SceneItem *) NULL);
-	_backwardButton.hide();
+	_actor12.postInit();
+	_actor12.fixPriority(12);
 
-	_exitButton.postInit();
-	_exitButton._buttonId = 3;
-	_exitButton.setup(1750, 1, 5);
-	_exitButton.setPosition(Common::Point(230, 183));
-	_exitButton.setDetails(1750, 27, 1, -1, 1, (SceneItem *) NULL);
+	if (R2_GLOBALS.getFlag(17)) {
+		_actor13.setPosition(Common::Point(_actor13._position.x + 5, _actor13._position.y));
+		_actor12.setPosition(Common::Point(_actor12._position.x + 5, _actor12._position.y));
+	}
 
-	_direction = 1;		// Forward by default
-	_speedDelta = 0;
-	_speedCurrent = 0;
-	_speed = 0;
-	_rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
+	_actor14.postInit();
+	_actor14.setup(1575, 5, 1);
+	_actor14.setPosition(Common::Point(85, 176));
+	_actor14.fixPriority(7);
+	_actor14.hide();
 
-	_redLightsDescr.setDetails(Rect(129, 112, 155, 175), 1750, 21, -1, -1, 1, NULL);
-	_greenLights.setDetails(Rect(93, 122, 126, 172), 1750, 15, -1, -1, 1, NULL);
-	_frontView.setDetails(Rect(3, 3, 157, 99), 1750, 9, -1, -1, 1, NULL);
-	_rearView.setDetails(Rect(162, 3, 316, 99), 1750, 12, -1, -1, 1, NULL);
-	_background.setDetails(Rect(0, 0, 320, 200), 1750, 6, 1, -1, 1, NULL);
+	_actor15.postInit();
+	_actor15.setup(1575, 5, 2);
+	_actor15.setPosition(Common::Point(85, 147));
+	_actor15.fixPriority(7);
+	_actor15.hide();
 }
 
-void Scene1750::remove() {
-	if (R2_GLOBALS._rimLocation == 2400)
-		R2_GLOBALS._rimLocation = 2399;
-
-	if (R2_GLOBALS._rimLocation == -2400)
-		R2_GLOBALS._rimLocation = -2399;
-
-	R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
-
+void Scene1575::remove() {
 	SceneExt::remove();
-	R2_GLOBALS._sound1.fadeOut2(NULL);
 	R2_GLOBALS._uiElements._active = true;
 }
 
-void Scene1750::signal() {
+void Scene1575::signal() {
 	R2_GLOBALS._player.enableControl();
 }
 
-void Scene1750::process(Event &event) {
+void Scene1575::process(Event &event) {
 	Scene::process(event);
-	if (!event.handled)
-		_speedSlider.process(event);
-}
 
-void Scene1750::dispatch() {
-	if (_rotation) {
-		if (!_speedDelta && (_speed != _speedCurrent)) {
-			if (_speedCurrent >= _speed)
-				--_speedCurrent;
-			else
-				++_speedCurrent;
+	g_globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
+}
 
-			_speedDelta = 21 - ABS(_speedCurrent);
+void Scene1575::dispatch() {
+	if (_field412 <= 0) {
+		++_field412;
+		if (_field412 == 0) {
+			_actor4.show();
+			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
 		}
-
-		if (_speedDelta == 1) {
-			if (_speedCurrent == 0) {
-				_radarSweep.show();
-				_rotation->_idxChange = 0;
-			} else {
-				if (_rotation->_idxChange == 0)
-					_radarSweep.hide();
-
-				if (_speedCurrent < -12) {
-					_rotation->setDelay(15 - ABS(_speedCurrent));
-					_rotation->_idxChange = -2;
-				} else if (_speedCurrent < 0) {
-					_rotation->setDelay(10 - ABS(_speedCurrent));
-					_rotation->_idxChange = -1;
-				} else if (_speedCurrent < 11) {
-					_rotation->setDelay(10 - _speedCurrent);
-					_rotation->_idxChange = 1;
-				} else {
-					_rotation->setDelay(15 - _speedCurrent);
-					_rotation->_idxChange = 2;
-				}
-			}
+	} else {
+		_field412--;
+		if (_field412 ==0) {
+			_actor4.hide();
+			_field412 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
 		}
+	}
 
-		if (_speedDelta)
-			--_speedDelta;
-
-		_rotationSegCurrent = _rotationSegment;
-		_rotationSegment = ((_rotation->_currIndex - 218) / 4) % 4;
-
-		if ((_rotationSegCurrent + 1) == _rotationSegment || (_rotationSegCurrent - 3)  == _rotationSegment) {
-			if (R2_GLOBALS._rimLocation < 2400) {
-				++R2_GLOBALS._rimLocation;
-			}
+	if (_field414 <= 0) {
+		++_field414;
+		if (_field414 == 0) {
+			_actor5.show();
+			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
 		}
-
-		if ((_rotationSegCurrent - 1) == _rotationSegment || (_rotationSegCurrent + 3) == _rotationSegment) {
-			if (R2_GLOBALS._rimLocation > -2400) {
-				--R2_GLOBALS._rimLocation;
-			}
+	} else {
+		_field414--;
+		if (_field414 == 0) {
+			_actor5.hide();
+			_field414 = R2_GLOBALS._randomSource.getRandomNumber(9) + 1;
 		}
+	}
 
-		if (_rotation->_currIndex != _newRotation) {
-			// Handle setting the position of the lift icon in the scanner display
-			_newRotation = _rotation->_currIndex;
-			_scannerIcon.setPosition(Common::Point(35, ((_rotation->_currIndex - 218) % 4) +
-				((R2_GLOBALS._rimLocation % 800) * 4) - 1440));
+	if (_field416 == 0) {
+		switch(R2_GLOBALS._randomSource.getRandomNumber(3)) {
+		case 0:
+			_actor6.hide();
+			_actor7.hide();
+			_actor8.hide();
+			break;
+		case 1:
+			_actor6.show();
+			_actor7.hide();
+			_actor8.hide();
+			break;
+		case 2:
+			_actor6.show();
+			_actor7.show();
+			_actor8.hide();
+			break;
+		case 3:
+			_actor6.show();
+			_actor7.show();
+			_actor8.show();
+			break;
+		default:
+			break;
 		}
+		_field416 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
+	} else {
+		--_field416;
 	}
 
-	int v = ABS(_scannerIcon._position.y - 158) / 100;
-	if (v < 8) {
-		// Show how close the user is to the lift on the second column of lights
-		_redLights.show();
-		_redLights.setPosition(Common::Point((_scannerIcon._position.y <= 158) ? 137 : 148,
-			v * 7 + 122));
+	if (_field418 == 0) {
+		switch(R2_GLOBALS._randomSource.getRandomNumber(2)) {
+		case 0:
+			_actor9.hide();
+			_actor10.hide();
+			break;
+		case 1:
+			_actor9.show();
+			_actor10.hide();
+			break;
+		case 2:
+			_actor9.show();
+			_actor10.show();
+			break;
+		default:
+			break;
+		}
+		_field418 = R2_GLOBALS._randomSource.getRandomNumber(4) + 1;
 	} else {
-		_redLights.hide();
+		_field418--;
 	}
+	Scene::dispatch();
 }
 
 /*--------------------------------------------------------------------------
- * Scene 1800 - Rim Lift Exterior
+ * Scene 1580 - Inside wreck
  *
  *--------------------------------------------------------------------------*/
 
-Scene1800::Scene1800() {
-	_locationMode = 0;
+Scene1580::Scene1580() {
 }
 
-void Scene1800::synchronize(Serializer &s) {
+void Scene1580::synchronize(Serializer &s) {
 	SceneExt::synchronize(s);
+}
 
-	s.syncAsSint16LE(_locationMode);
+bool Scene1580::JoystickPlug::startAction(CursorType action, Event &event) {
+	if (action == R2_JOYSTICK) {
+		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+
+		R2_INVENTORY.setObjectScene(R2_JOYSTICK, 1580);
+		R2_GLOBALS._sceneItems.remove(&scene->_joystickPlug);
+		scene->_joystick.postInit();
+		scene->_joystick.setup(1580, 1, 4);
+		scene->_joystick.setPosition(Common::Point(159, 163));
+		scene->_joystick.setDetails(1550, 78, -1, -1, 2, (SceneItem *) NULL);
+
+		scene->_arrActor[5].remove();
+
+		return true;
+	}
+
+	return SceneHotspot::startAction(action, event);
 }
 
-bool Scene1800::Background::startAction(CursorType action, Event &event) {
-	if ((action != R2_COM_SCANNER) && (action != R2_COM_SCANNER_2))
-		return false;
+bool Scene1580::ScreenSlot::startAction(CursorType action, Event &event) {
+	if (action == R2_DIAGNOSTICS_DISPLAY) {
+		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+		R2_INVENTORY.setObjectScene(R2_DIAGNOSTICS_DISPLAY, 1580);
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._sceneItems.remove(&scene->_screenSlot);
 
-	R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		scene->_screen.postInit();
+		scene->_screen.setup(1580, 1, 1);
+		scene->_screen.setPosition(Common::Point(124, 108));
+		scene->_screen.fixPriority(10);
 
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		if (R2_GLOBALS._rimLocation == 1201) {
-			scene->_stripManager.start(548, this);
-		} else if (R2_GLOBALS.getFlag(66)) {
-			return false;
-		} else {
-			scene->_stripManager.start(546, this);
-		}
-	} else {
-		if (R2_GLOBALS._rimLocation == 1201) {
-			scene->_stripManager.start(549, this);
-		} else if (R2_GLOBALS.getFlag(66)) {
-			return false;
-		} else {
-			scene->_stripManager.start(547, this);
-		}
+		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580)
+			scene->_screen.setDetails(1550, 14, -1, -1, 5, &scene->_joystick);
+		else
+			scene->_screen.setDetails(1550, 14, -1, -1, 2, (SceneItem *)NULL);
+
+		scene->_screenDisplay.postInit();
+		scene->_screenDisplay.setup(1580, 3, 1);
+		scene->_screenDisplay.setPosition(Common::Point(124, 109));
+		scene->_screenDisplay.fixPriority(20);
+		//scene->_field412 = 1;
+		scene->_sceneMode = 10;
+		scene->setAction(&scene->_sequenceManager, scene, 1, &R2_GLOBALS._player, NULL);
+
+		return true;
 	}
 
-	R2_GLOBALS.setFlag(66);
-	return true;
+	return SceneHotspot::startAction(action, event);
 }
 
-bool Scene1800::Lever::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneActor::startAction(action, event);
+bool Scene1580::Joystick::startAction(CursorType action, Event &event) {
+	if ( (action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580)
+		&& (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) == 0) && (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) == 0)
+		&& (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) == 0) && (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) == 0)
+		&& (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 0) && (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 0)) {
+		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
+		scene->_sceneMode = 31;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+			scene->_stripManager.start(536, scene);
+		else
+			scene->_stripManager.start(537, scene);
 
-	if (!R2_GLOBALS.getFlag(14))
-		return false;
+		return true;
+	}
 
-	if (R2_GLOBALS._player._characterIndex != R2_QUINN)
-		return SceneActor::startAction(action, event);
+	return SceneActor::startAction(action, event);
+}
 
-	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
-	R2_GLOBALS._player.disableControl();
+bool Scene1580::Screen::startAction(CursorType action, Event &event) {
+	if ((action == CURSOR_USE) && (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580)) {
+		Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	if (_frame == 1) {
-		R2_GLOBALS.setFlag(64);
-		scene->_sceneMode = 1810;
-		scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL);
-	} else {
-		R2_GLOBALS.clearFlag(64);
-		scene->_sceneMode = 1811;
-		scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_lever, &scene->_leftStaircase, &scene->_rightStaircase, NULL);
+		R2_INVENTORY.setObjectScene(R2_BROKEN_DISPLAY, R2_GLOBALS._player._characterIndex);
+		scene->_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 2, NULL);
+		scene->_screenDisplay.remove();
+		remove();
+		return true;
 	}
-	return true;
+
+	return SceneActor::startAction(action, event);
 }
 
-bool Scene1800::Doors::startAction(CursorType action, Event &event) {
+bool Scene1580::StorageCompartment::startAction(CursorType action, Event &event) {
 	if (action != CURSOR_USE)
 		return SceneActor::startAction(action, event);
 
-	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
-		// Seeker trying to force open the door
-		R2_GLOBALS._player.disableControl();
-		if (scene->_locationMode >= 2) {
-			if (R2_GLOBALS.getFlag(14)) {
-				// Allow door to close
-				scene->_sceneMode = 1809;
-				scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
-				R2_GLOBALS.clearFlag(14);
-			} else {
-				// Force open door
-				scene->_sceneMode = 1808;
-				scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL);
-				R2_GLOBALS.setFlag(14);
-			}
-		} else {
-			// Seeker failing to force open doors
-			scene->_sceneMode = 1813;
-			// Original was using 1813 in setAction too, but it somewhat broken.
-			// Seeker goes 2 pixels to high, hiding behind the door
-			scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_doors, NULL);
-		}
-	} else if (R2_GLOBALS.getFlag(14)) {
-		return SceneActor::startAction(action, event);
-	} else {
-		// Quinn trying to force open doors
-		R2_GLOBALS._player.disableControl();
-		scene->_sceneMode = 1812;
-		scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL);
-	}
+	R2_GLOBALS._player.disableControl();
+	R2_GLOBALS._sceneItems.remove(&scene->_storageCompartment);
+	scene->_sceneMode = 0;
+	animate(ANIM_MODE_5, scene);
 
 	return true;
 }
 
-bool Scene1800::PassengerDoor::startAction(CursorType action, Event &event) {
+bool Scene1580::HatchButton::startAction(CursorType action, Event &event) {
 	if (action != CURSOR_USE)
 		return SceneActor::startAction(action, event);
 
-	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	if (_position.x < 160) {
-		if (scene->_leftStaircase._frame == 1) {
-			return SceneActor::startAction(action, event);
-		} else {
-			R2_GLOBALS.setFlag(29);
-			R2_GLOBALS._player.disableControl();
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-				if (R2_GLOBALS.getFlag(14)) {
-					scene->_sceneMode = 1;
-					scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
-					R2_GLOBALS.clearFlag(14);
-				} else {
-					scene->_sceneMode = 1804;
-					scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL);
-				}
-			} else {
-				if (R2_GLOBALS.getFlag(14)) {
-					scene->_sceneMode = 1;
-					scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_doors, NULL);
-					R2_GLOBALS.clearFlag(14);
-				} else {
-					scene->_sceneMode = 1805;
-					scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_companion, &scene->_leftDoor, NULL);
-				}
-			}
-		}
-	} else if (scene->_leftStaircase._frame == 1) {
-		return SceneActor::startAction(action, event);
-	} else {
-		R2_GLOBALS.clearFlag(29);
-		R2_GLOBALS._player.disableControl();
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			if (R2_GLOBALS.getFlag(14)) {
-				scene->_sceneMode = 2;
-				scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
-				R2_GLOBALS.clearFlag(14);
-			} else {
-				scene->_sceneMode = 1806;
-				scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
-			}
-		} else {
-			if (R2_GLOBALS.getFlag(14)) {
-				scene->_sceneMode = 2;
-				scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
-				R2_GLOBALS.clearFlag(14);
-			} else {
-				scene->_sceneMode = 1807;
-				scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_companion, &scene->_rightDoor, NULL);
-			}
-		}
-	}
+	R2_GLOBALS._player.disableControl();
+	setFrame(2);
+	scene->_sceneMode = 20;
+	scene->setAction(&scene->_sequenceManager, scene, 2, &R2_GLOBALS._player, NULL);
 
 	return true;
 }
 
-void Scene1800::SouthExit::changeScene() {
-	Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene;
+bool Scene1580::ThrusterValve::startAction(CursorType action, Event &event) {
+	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	_enabled = false;
-	R2_GLOBALS._events.setCursor(CURSOR_WALK);
-	R2_GLOBALS._player.disableControl();
-	if (R2_GLOBALS.getFlag(14)) {
-		scene->_sceneMode = 3;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_companion, &scene->_doors, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_doors, NULL);
-		R2_GLOBALS.clearFlag(14);
-	} else {
-		scene->_sceneMode = 1802;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_companion, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager, scene, 1803, &R2_GLOBALS._player, &scene->_companion, NULL);
+	switch (action) {
+	case CURSOR_USE:
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+			R2_INVENTORY.setObjectScene(R2_THRUSTER_VALVE, 1);
+			remove();
+			return true;
+		}
+		break;
+	case R2_COM_SCANNER:
+		scene->_sceneMode = 30;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		scene->_stripManager.start(529, scene);
+		return true;
+		break;
+	case R2_COM_SCANNER_2:
+		scene->_sceneMode = 30;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		scene->_stripManager.start(527, scene);
+		return true;
+		break;
+	default:
+		break;
 	}
-}
-
-void Scene1800::postInit(SceneObjectList *OwnerList) {
-	loadScene(1800);
-	SceneExt::postInit();
-	R2_GLOBALS._sound1.play(116);
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
 
-	if (R2_GLOBALS._sceneManager._previousScene == -1)
-		R2_GLOBALS._rimLocation = 1201;
-
-	// Set the mode based on whether this is the "correct" lift or not
-	if (R2_GLOBALS._rimLocation == 1201)
-		_locationMode = 2;
-	else
-		_locationMode = 0;
-
-	scalePalette(65, 65, 65);
-	_southExit.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800);
-	_background.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL);
+	return SceneActor::startAction(action, event);
+}
 
-	_lever.postInit();
-	_lever.setup(1801, 4, 1);
-	_lever.setPosition(Common::Point(170, 124));
-	_lever.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL);
+bool Scene1580::Ignitor::startAction(CursorType action, Event &event) {
+	Scene1580 *scene = (Scene1580 *)R2_GLOBALS._sceneManager._scene;
 
-	_doors.postInit();
-	_doors.setup(1801, 3, 1);
-	_doors.setPosition(Common::Point(160, 139));
-	_doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
+	switch (action) {
+	case CURSOR_USE:
+		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+			R2_INVENTORY.setObjectScene(R2_IGNITOR, 1);
+			remove();
+			return true;
+		}
+		break;
+	case R2_COM_SCANNER:
+		scene->_sceneMode = 30;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		scene->_stripManager.start(529, scene);
+		return true;
+		break;
+	case R2_COM_SCANNER_2:
+		scene->_sceneMode = 30;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		scene->_stripManager.start(527, scene);
+		return true;
+		break;
+	default:
+		break;
+	}
 
-	_leftDoor.postInit();
-	_leftDoor.setup(1800, 1, 1);
-	_leftDoor.setPosition(Common::Point(110, 78));
-	_leftDoor.fixPriority(135);
-	_leftDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
+	return SceneActor::startAction(action, event);
+}
 
-	_rightDoor.postInit();
-	_rightDoor.setup(1800, 2, 1);
-	_rightDoor.setPosition(Common::Point(209, 78));
-	_rightDoor.fixPriority(135);
-	_rightDoor.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL);
+void Scene1580::postInit(SceneObjectList *OwnerList) {
+	loadScene(1580);
+	R2_GLOBALS._sceneManager._fadeMode = FADEMODE_GRADUAL;
+	SceneExt::postInit();
 
-	_leftStaircase.postInit();
-	if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64)))
-		_leftStaircase.setup(1801, 2, 1);
-	else
-		_leftStaircase.setup(1801, 2, 10);
-	_leftStaircase.setPosition(Common::Point(76, 142));
-	_leftStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
+	_stripManager.setColors(60, 255);
+	_stripManager.setFontNumber(3);
+	_stripManager.addSpeaker(&_quinnSpeaker);
+	_stripManager.addSpeaker(&_seekerSpeaker);
 
-	_rightStaircase.postInit();
-	if ((_locationMode != 1) && (_locationMode != 3) && (!R2_GLOBALS.getFlag(64)))
-		_rightStaircase.setup(1801, 1, 1);
-	else
-		_rightStaircase.setup(1801, 1, 10);
-	_rightStaircase.setPosition(Common::Point(243, 142));
-	_rightStaircase.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL);
+	_sceneMode = 0;
 
-	R2_GLOBALS._player.postInit();
-	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		// Standard Quinn setup
-		R2_GLOBALS._player.setVisage(1503);
-		R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+	R2_GLOBALS._player.disableControl();
+	if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) == 1580) {
+		_joystick.postInit();
+		_joystick.setup(1580, 1, 4);
+		_joystick.setPosition(Common::Point(159, 163));
+		_joystick.setDetails(1550, 78, -1, -1, 1, (SceneItem *) NULL);
 	} else {
-		// Seeker setup dependent on whether he's holding the doors or not
-		if (R2_GLOBALS.getFlag(14)) {
-			R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL);
-			R2_GLOBALS._player.setObjectWrapper(NULL);
-			R2_GLOBALS._player.setup(1801, 5, 12);
-			R2_GLOBALS._player.setPosition(Common::Point(160, 139));
-			R2_GLOBALS._walkRegions.disableRegion(9);
-			_doors.hide();
-		} else {
-			R2_GLOBALS._player.setVisage(1507);
-		}
-		R2_GLOBALS._player._moveDiff = Common::Point(4, 2);
+		_joystickPlug.setDetails(Rect(141, 148, 179, 167), 1550, 79, -1, -1, 1, NULL);
 	}
 
-	_companion.postInit();
-	_companion.animate(ANIM_MODE_1, NULL);
-	_companion.setObjectWrapper(new SceneObjectWrapper());
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		if (R2_GLOBALS.getFlag(14)) {
-			_companion.animate(ANIM_MODE_NONE, NULL);
-			_companion.setObjectWrapper(NULL);
-			_companion.setup(1801, 5, 12);
+	if (R2_INVENTORY.getObjectScene(R2_BROKEN_DISPLAY) == 1580) {
+		_screen.postInit();
+		_screen.setup(1580, 1, 1);
+		_screen.setPosition(Common::Point(124, 108));
+		_screen.fixPriority(10);
+		_screen.setDetails(1550, 13, -1, -1, 1, (SceneItem *) NULL);
 
-			R2_GLOBALS._walkRegions.disableRegion(9);
-			_doors.hide();
-		} else {
-			_companion.setup(1507, 1, 1);
-			_companion.setPosition(Common::Point(180, 160));
-		}
-		_companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
-		_companion._moveDiff = Common::Point(4, 2);
+		_screenDisplay.postInit();
+		_screenDisplay.setup(1580, 1, 3);
+		_screenDisplay.setPosition(Common::Point(124, 96));
+		_screenDisplay.fixPriority(20);
+	} else if (R2_INVENTORY.getObjectScene(R2_DIAGNOSTICS_DISPLAY) == 1580) {
+		_screen.postInit();
+		_screen.setup(1580, 1, 1);
+		_screen.setPosition(Common::Point(124, 108));
+		_screen.fixPriority(10);
+		_screen.setDetails(1550, 14, -1, -1, 1, (SceneItem *) NULL);
+
+		_screenDisplay.postInit();
+		_screenDisplay.setup(1580, 3, 1);
+		_screenDisplay.setPosition(Common::Point(124, 109));
+		_screenDisplay.fixPriority(20);
+
+		_sceneMode = 10;
 	} else {
-		_companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
-		_companion.setVisage(1503);
-		_companion._moveDiff = Common::Point(2, 2);
+		_screenSlot.setDetails(Rect(69, 29, 177, 108), 1550, 82, -1, -1, 1, NULL);
 	}
 
-	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			R2_GLOBALS._player.setPosition(Common::Point(114, 150));
-			R2_GLOBALS._player.setStrip(5);
-			if (R2_GLOBALS.getFlag(14)) {
-				_companion.setPosition(Common::Point(160, 139));
-				R2_GLOBALS._walkRegions.disableRegion(8);
-			} else {
-				_companion.setPosition(Common::Point(209, 150));
-				_companion.setStrip(6);
-				R2_GLOBALS._walkRegions.disableRegion(8);
-			}
-		} else {
-			if (R2_GLOBALS.getFlag(14)) {
-				R2_GLOBALS._player.setup(1801, 5, 12);
-				R2_GLOBALS._player.setPosition(Common::Point(160, 139));
-			} else {
-				R2_GLOBALS._player.setPosition(Common::Point(209, 150));
-				R2_GLOBALS._player.setStrip(6);
-			}
-			_companion.setPosition(Common::Point(114, 150));
-			_companion.setStrip(5);
-			R2_GLOBALS._walkRegions.disableRegion(10);
-			R2_GLOBALS._walkRegions.disableRegion(11);
-		}
-	} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		R2_GLOBALS._player.setPosition(Common::Point(140, 160));
-		_companion.setPosition(Common::Point(180, 160));
+	_storageCompartment.postInit();
+	if (R2_GLOBALS.getFlag(58) == 0) {
+		_storageCompartment.setup(1580, 5, 1);
+		_storageCompartment.setDetails(1550, 80, -1, -1, 1, (SceneItem *) NULL);
 	} else {
-		R2_GLOBALS._player.setPosition(Common::Point(180, 160));
-		_companion.setPosition(Common::Point(140, 160));
+		_storageCompartment.setup(1580, 5, 6);
 	}
 
-	_playerShadow.postInit();
-	_playerShadow.fixPriority(10);
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		_playerShadow.setVisage(1111);
-	else
-		_playerShadow.setVisage(1110);
-
-	_playerShadow._effect = EFFECT_SHADOW_MAP;
-	_playerShadow._shadowMap = _shadowPaletteMap;
-
-	R2_GLOBALS._player._linkedActor = &_playerShadow;
+	_storageCompartment.setPosition(Common::Point(216, 108));
+	_storageCompartment.fixPriority(100);
 
-	_companionShadow.postInit();
-	_companionShadow.fixPriority(10);
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-		_companionShadow.setVisage(1110);
-	else
-		_companionShadow.setVisage(1111);
+	_hatchButton.postInit();
+	_hatchButton.setup(1580, 4, 1);
+	_hatchButton.setPosition(Common::Point(291, 147));
+	_hatchButton.fixPriority(100);
+	_hatchButton.setDetails(1550, 81, -1, -1, 1, (SceneItem *) NULL);
 
-	_companionShadow._effect = EFFECT_SHADOW_MAP;
-	_companionShadow._shadowMap = _shadowPaletteMap;
+	if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) == 1580) {
+		_thrusterValve.postInit();
+		_thrusterValve.setup(1580, 6, 2);
+		_thrusterValve.setPosition(Common::Point(222, 108));
+		_thrusterValve.fixPriority(50);
+		_thrusterValve.setDetails(1550, 32, -1, 34, 1, (SceneItem *) NULL);
+	}
 
-	_companion._linkedActor = &_companionShadow;
+	if (R2_INVENTORY.getObjectScene(R2_IGNITOR) == 1580) {
+		_ignitor.postInit();
+		_ignitor.setup(1580, 6, 1);
+		_ignitor.setPosition(Common::Point(195, 108));
+		_ignitor.fixPriority(50);
+		_ignitor.setDetails(1550, 38, -1, 34, 1, (SceneItem *) NULL);
+	}
 
-	R2_GLOBALS._player._characterScene[R2_QUINN] = 1800;
-	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1800;
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player.hide();
+	setAction(&_sequenceManager, this, 1, &R2_GLOBALS._player, NULL);
+	_background.setDetails(Rect(0, 0, 320, 200), 1550, 50, -1, -1, 1, NULL);
+}
 
-	_elevatorContents.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL);
-	_elevator.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL);
+void Scene1580::signal() {
+	switch (_sceneMode++) {
+	case 10:
+		_screenDisplay.animate(ANIM_MODE_5, this);
+		break;
+	case 11:
+		_screenDisplay.setup(1580, 1, 2);
+		_screenDisplay.setPosition(Common::Point(124, 94));
 
-	// Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL);
-	// This is *wrong*. The following statement is a wild guess based on good common sense
-	_surface.setDetails(11, 1800, 23, 24, 25);
-	_secBackground.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL);
+		if (R2_INVENTORY.getObjectScene(R2_GYROSCOPE) != 0) {
+			_arrActor[0].postInit();
+			_arrActor[0].setup(1580, 2, 1);
+			_arrActor[0].setPosition(Common::Point(138, 56));
+		}
 
-	R2_GLOBALS._player.disableControl();
-	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) {
-		if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) {
-			R2_GLOBALS._player.enableControl(CURSOR_USE);
-			R2_GLOBALS._player._canWalk = false;
-		} else {
-			R2_GLOBALS._player.enableControl(CURSOR_WALK);
+		if (R2_INVENTORY.getObjectScene(R2_RADAR_MECHANISM) != 0) {
+			_arrActor[1].postInit();
+			_arrActor[1].setup(1580, 2, 2);
+			_arrActor[1].setPosition(Common::Point(140, 66));
 		}
-	} else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
-		if (R2_GLOBALS.getFlag(29)) {
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-				_sceneMode = 1814;
-				setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
-			} else {
-				_sceneMode = 1815;
-				setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
-			}
-		} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			_sceneMode = 1816;
-			setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
-		} else {
-			_sceneMode = 1817;
-			setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
+
+		if (R2_INVENTORY.getObjectScene(R2_IGNITOR) != 0) {
+			_arrActor[2].postInit();
+			_arrActor[2].setup(1580, 2, 3);
+			_arrActor[2].setPosition(Common::Point(142, 85));
 		}
-	} else if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		_sceneMode = 1800;
-		setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_companion, NULL);
-	} else {
-		_sceneMode = 1801;
-		setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_companion, NULL);
-	}
 
-	R2_GLOBALS._player._oldCharacterScene[R2_QUINN] = 1800;
-	R2_GLOBALS._player._oldCharacterScene[R2_SEEKER] = 1800;
-}
+		if (R2_INVENTORY.getObjectScene(R2_THRUSTER_VALVE) != 0) {
+			_arrActor[3].postInit();
+			_arrActor[3].setup(1580, 2, 4);
+			_arrActor[3].setPosition(Common::Point(142, 92));
+		}
 
-void Scene1800::signal() {
-	switch (_sceneMode) {
-	case 1:
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			_sceneMode = 1804;
-			setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
-		} else {
-			_sceneMode = 1805;
-			setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
+		if (R2_INVENTORY.getObjectScene(R2_GUIDANCE_MODULE) != 0) {
+			_arrActor[4].postInit();
+			_arrActor[4].setup(1580, 2, 5);
+			_arrActor[4].setPosition(Common::Point(108, 54));
 		}
-		break;
-	case 2:
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			_sceneMode = 1806;
-			setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
-		} else {
-			_sceneMode = 1807;
-			setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
+
+		if (R2_INVENTORY.getObjectScene(R2_JOYSTICK) != 1580) {
+			_arrActor[5].postInit();
+			_arrActor[5].setup(1580, 2, 6);
+			_arrActor[5].setPosition(Common::Point(110, 64));
 		}
-		break;
-	case 3:
-		_sceneMode = 1802;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN)
-			setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_companion, NULL);
-		else
-			setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_companion, NULL);
-		break;
-	case 10:
-	// No break on purpose
-	case 11:
-		R2_GLOBALS._player.enableControl(CURSOR_TALK);
-		break;
-	case 12:
-		R2_GLOBALS._player.enableControl(CURSOR_TALK);
-		R2_GLOBALS._player._canWalk = false;
-		break;
-	case 13:
-		_sceneMode = 14;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		R2_GLOBALS._player.setup(1801, 7, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
-		_stripManager.start(550, this);
-		break;
-	case 14:
-		_sceneMode = 15;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._player.setup(1801, 6, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_6, this);
-		break;
-	case 15:
-		R2_GLOBALS._player.setup(1503, 4, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
-		break;
-	// Cases 23 and 24 have been added to fix missing hardcoded logic in the original,
-	// when Seeker tries to open the door
-	case 23:
-		_sceneMode = 24;
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-		R2_GLOBALS._player.setup(1801, 5, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_8, 0, NULL);
-		_stripManager.start(550, this);
-		break;
-	case 24:
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._player.setup(1507, 4, 1);
-		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-		R2_GLOBALS._player.enableControl(CURSOR_USE);
 
-		_doors.setup(1801, 3, 1);
-		_doors.setPosition(Common::Point(160, 139));
-		_doors.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL);
-		_doors.show();
+		if (R2_INVENTORY.getObjectScene(R2_BATTERY) != 0) {
+			_arrActor[6].postInit();
+			_arrActor[6].setup(1580, 2, 7);
+			_arrActor[6].setPosition(Common::Point(108, 80));
+		}
 
-		R2_GLOBALS._player._position.y += 2;
-		R2_GLOBALS._player.show();
-		break;
-	case 1800:
-		R2_GLOBALS._walkRegions.disableRegion(8);
-		if (R2_GLOBALS.getFlag(63))
-			R2_GLOBALS._player.enableControl(CURSOR_USE);
-		else {
-			_sceneMode = 10;
-			R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
-			_stripManager.start(544, this);
+		if (R2_INVENTORY.getObjectScene(R2_FUEL_CELL) != 0) {
+			_arrActor[7].postInit();
+			_arrActor[7].setup(1580, 2, 8);
+			_arrActor[7].setPosition(Common::Point(111, 92));
 		}
+
+		R2_GLOBALS._player.enableControl(CURSOR_USE);
+		R2_GLOBALS._player._canWalk = false;
 		break;
-	case 1801:
-		R2_GLOBALS._walkRegions.disableRegion(10);
-		R2_GLOBALS._walkRegions.disableRegion(11);
-		R2_GLOBALS.setFlag(63);
-		R2_GLOBALS._player.enableControl(CURSOR_WALK);
-		break;
-	case 1802:
-		R2_GLOBALS.clearFlag(14);
-		R2_GLOBALS._sceneManager.changeScene(1700);
-		break;
-	case 1804:
-	// No break on purpose
-	case 1805:
-	// No break on purpose
-	case 1806:
-	// No break on purpose
-	case 1807:
-		R2_GLOBALS.clearFlag(14);
-		R2_GLOBALS._sceneManager.changeScene(1850);
-		break;
-	case 1808:
-		_sceneMode = 12;
-		R2_GLOBALS._events.setCursor(CURSOR_WALK);
-		_stripManager.start(553, this);
-		break;
-	case 1812:
-		_sceneMode = 13;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	// Case 1813 has been added to fix Seeker missing animation in the original game
-	case 1813:
-		_sceneMode = 23;
-		R2_GLOBALS._player.animate(ANIM_MODE_5, this);
-		break;
-	case 1814:
-	// No break on purpose
-	case 1815:
-		R2_GLOBALS._walkRegions.disableRegion(10);
-		R2_GLOBALS._walkRegions.disableRegion(11);
-		R2_GLOBALS._player.enableControl();
+	case 20:
+		R2_GLOBALS._sceneManager.changeScene(1550);
 		break;
-	case 1816:
-	// No break on purpose
-	case 1817:
-		R2_GLOBALS._walkRegions.disableRegion(8);
-		R2_GLOBALS._player.enableControl();
+	case 31:
+		R2_GLOBALS._sceneManager.changeScene(1530);
 		break;
 	default:
-		R2_GLOBALS._player.enableControl();
+		R2_GLOBALS._player.enableControl(CURSOR_USE);
+		R2_GLOBALS._player._canWalk = false;
 		break;
 	}
 }
 
-void Scene1800::saveCharacter(int characterIndex) {
-	if (R2_GLOBALS._player._characterIndex == R2_MIRANDA)
-		R2_GLOBALS._sound1.fadeOut2(NULL);
-
-	SceneExt::saveCharacter(characterIndex);
-}
-
 /*--------------------------------------------------------------------------
- * Scene 1850 - Rim Lift Interior
+ * Scene 1625 - Miranda being questioned
  *
  *--------------------------------------------------------------------------*/
 
-bool Scene1850::Button::startAction(CursorType action, Event &event) {
+bool Scene1625::Wire::startAction(CursorType action, Event &event) {
 	if (action != CURSOR_USE)
-		return SceneHotspot::startAction(action, event);
-
-	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+		return SceneActor::startAction(action, event);
 
+	Scene1625 *scene = (Scene1625 *)R2_GLOBALS._sceneManager._scene;
 	R2_GLOBALS._player.disableControl();
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		scene->_sceneMode = 1852;
-		if (R2_GLOBALS.getFlag(32))
-			scene->setAction(&scene->_sequenceManager1, scene, 1871, &R2_GLOBALS._player, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager1, scene, 1852, &R2_GLOBALS._player, NULL);
-	} else if (R2_GLOBALS.getFlag(30)) {
-		scene->_seqNumber = 1;
-		scene->_sceneMode = 1860;
 
-		if (R2_GLOBALS.getFlag(32))
-			scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL);
+	scene->_sceneMode = 1631;
+	scene->_mirandaMouth.postInit();
+	scene->setAction(&scene->_sequenceManager, scene, 1631, &scene->_mirandaMouth, &scene->_wire, NULL);
+	return true;
+}
+
+Scene1625::Scene1625() {
+}
+
+void Scene1625::synchronize(Serializer &s) {
+	SceneExt::synchronize(s);
+}
+
+void Scene1625::postInit(SceneObjectList *OwnerList) {
+	loadScene(1625);
+	R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+	SceneExt::postInit();
+
+	_stripManager.addSpeaker(&_mirandaSpeaker);
+	_stripManager.addSpeaker(&_tealSpeaker);
+	_stripManager.addSpeaker(&_soldierSpeaker);
 
-		R2_GLOBALS.clearFlag(30);
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player.hide();
+
+	_wire.postInit();
+	_wire.setup(1626, 2, 1);
+	_wire.setPosition(Common::Point(206, 133));
+	_wire.setDetails(1625, 0, -1, -1, 1, (SceneItem *) NULL);
+
+	_wristRestraints.postInit();
+	_wristRestraints.setup(1625, 8, 1);
+	_wristRestraints.setPosition(Common::Point(190, 131));
+	_wristRestraints.setDetails(1625, 6, -1, 2, 1, (SceneItem *) NULL);
+
+	if (R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] == 1625) {
+		if (!R2_GLOBALS.getFlag(83)) {
+			_glass.postInit();
+			_glass.setup(1626, 4, 1);
+			_glass.setPosition(Common::Point(96, 166));
+			_glass.setDetails(1625, -1, -1, -1, 1, (SceneItem *) NULL);
+		}
+		R2_GLOBALS._player.enableControl();
+		R2_GLOBALS._player._canWalk = false;
 	} else {
-		scene->_sceneMode = 1853;
+		_teal.postInit();
+		_teal.fixPriority(10);
 
-		if (R2_GLOBALS.getFlag(32))
-			scene->setAction(&scene->_sequenceManager1, scene, 1872, &R2_GLOBALS._player, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager1, scene, 1853, &R2_GLOBALS._player, NULL);
+		_tealRightArm.postInit();
+
+		R2_GLOBALS._player.disableControl();
+		_sceneMode = 1625;
+		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
 	}
 
-	return true;
+	R2_GLOBALS._sound1.play(245);
+	_background.setDetails(Rect(0, 0, 320, 200), 1625, 12, -1, -1, 1, NULL);
+	R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 1625;
+	R2_GLOBALS._player._characterScene[R2_MIRANDA] = 1625;
 }
 
-bool Scene1850::Robot::startAction(CursorType action, Event &event) {
-	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (action) {
-	case CURSOR_USE:
-		if ((R2_GLOBALS._player._characterIndex != R2_SEEKER) || R2_GLOBALS.getFlag(33) || R2_GLOBALS.getFlag(30))
-			return SceneActor::startAction(action, event);
+void Scene1625::remove() {
+	R2_GLOBALS._sound1.fadeOut2(NULL);
+	SceneExt::remove();
+}
 
+void Scene1625::signal() {
+	switch (_sceneMode) {
+	case 10:
 		R2_GLOBALS._player.disableControl();
-		scene->_sceneMode = 1857;
+		_glass.postInit();
+		_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+		_sceneMode = 1626;
+		setAction(&_sequenceManager, this, 1626, &_tealHead, &_glass, NULL);
+		break;
+	case 12:
+		MessageDialog::show(DONE_MSG, OK_BTN_STRING);
+		break;
+	case 14:
+		_tealHead.postInit();
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(831, this);
+		break;
+	case 99:
+		R2_GLOBALS._player.disableControl();
+		switch (_stripManager._exitMode) {
+		case 1:
+			_sceneMode = 1627;
+			setAction(&_sequenceManager, this, 1627, &_mirandaMouth, &_glass, NULL);
+			break;
+		case 2:
+			_sceneMode = 1629;
+			setAction(&_sequenceManager, this, 1629, &_tealHead, &_wristRestraints, NULL);
+			break;
+		case 4:
+			R2_GLOBALS._player._oldCharacterScene[R2_MIRANDA] = 3150;
+			R2_GLOBALS._player._characterScene[R2_MIRANDA] = 3150;
+			R2_GLOBALS._player._characterIndex = R2_QUINN;
+			R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_QUINN]);
+			break;
+		case 5:
+			_sceneMode = 1628;
+			_tealHead.remove();
+			setAction(&_sequenceManager, this, 1628, &_mirandaMouth, &_glass, NULL);
+			break;
+		case 6:
+			_glass.postInit();
+			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+			_sceneMode = 1632;
+			setAction(&_sequenceManager, this, 1632, &_glass, NULL);
+			break;
+		case 7:
+			_sceneMode = 1633;
+			setAction(&_sequenceManager, this, 1633, &_glass, NULL);
+			break;
+		case 8:
+			_sceneMode = 1635;
+			setAction(&_sequenceManager, this, 1635, &_mirandaMouth, &_wristRestraints, NULL);
+			break;
+		case 9:
+			_glass.postInit();
+			_glass.setDetails(1625, -1, -1, -1, 2, (SceneItem *) NULL);
+			_sceneMode = 1634;
+			setAction(&_sequenceManager, this, 1634, &_mirandaMouth, &_wristRestraints, NULL);
+			break;
+		case 3:
+		// No break on purpose
+		default:
+			_sceneMode = 1630;
+			_tealHead.remove();
+			setAction(&_sequenceManager, this, 1630, &_teal, &_tealRightArm, NULL);
+			break;
+		}
+		//_field412 = _stripManager._field2E8;
+		_stripManager._currObj44Id = 0;
+		break;
+	case 1625:
+		_tealHead.postInit();
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
+		_sceneMode = 10;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(800, this);
+		break;
+	case 1626:
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
+		_tealHead.show();
 
-		if (R2_GLOBALS.getFlag(32))
-			scene->setAction(&scene->_sequenceManager1, scene, 1858, &R2_GLOBALS._player, &scene->_robot, NULL);
-		else
-			scene->setAction(&scene->_sequenceManager1, scene, 1857, &R2_GLOBALS._player, &scene->_robot, NULL);
+		_mirandaMouth.postInit();
+		_mirandaMouth.setup(1627, 3, 1);
+		_mirandaMouth.setPosition(Common::Point(196, 65));
 
-		R2_GLOBALS.setFlag(30);
-		return true;
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(832, this);
 		break;
-	case CURSOR_LOOK:
-		if (R2_GLOBALS.getFlag(34))
-			SceneItem::display(1850, 2, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		else
-			SceneItem::display(1850, 1, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
+	case 1627:
+		_mirandaMouth.setup(1627, 3, 1);
+		_mirandaMouth.setPosition(Common::Point(196, 65));
+		_mirandaMouth.show();
 
-		return true;
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(833, this);
 		break;
-	case R2_AIRBAG:
-		if (R2_GLOBALS._player._characterIndex == R2_SEEKER) {
-			if (R2_GLOBALS.getFlag(70)) {
-				R2_GLOBALS._player.disableControl();
-				scene->_sceneMode = 30;
+	case 1628:
+		R2_GLOBALS.setFlag(83);
+		_tealHead.postInit();
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
 
-				R2_GLOBALS._events.setCursor(CURSOR_WALK);
-				scene->_stripManager.start(558, scene);
+		_mirandaMouth.setup(1627, 3, 1);
+		_mirandaMouth.setPosition(Common::Point(196, 65));
+		_mirandaMouth.show();
 
-				return true;
-			} else {
-				return SceneActor::startAction(action, event);
-			}
-		} else if (R2_GLOBALS.getFlag(30)) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 1875;
-			scene->_airbag.postInit();
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(834, this);
+		break;
+	case 1629:
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
+		_tealHead.show();
 
-			if (R2_GLOBALS.getFlag(32))
-				scene->setAction(&scene->_sequenceManager1, scene, 1876,
-					&R2_GLOBALS._player, &scene->_airbag, NULL);
-			else
-				scene->setAction(&scene->_sequenceManager1, scene, 1875,
-					&R2_GLOBALS._player, &scene->_airbag, NULL);
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(805, this);
+		break;
+	case 1630:
+		R2_GLOBALS._player.enableControl(CURSOR_USE);
+		R2_GLOBALS._player._canWalk = true;
+		break;
+	case 1631:
+		_mirandaMouth.setup(1627, 3, 1);
+		_mirandaMouth.setPosition(Common::Point(196, 65));
+		_mirandaMouth.show();
 
-			return true;
-		} else if (R2_GLOBALS.getFlag(70)) {
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 20;
-			R2_GLOBALS._events.setCursor(CURSOR_WALK);
-			scene->_stripManager.start(557, scene);
-			R2_GLOBALS.setFlag(69);
+		_wire.remove();
 
-			return true;
-		} else {
-			return SceneActor::startAction(action, event);
-		}
+		_teal.postInit();
+		_teal.fixPriority(10);
+
+		_tealRightArm.postInit();
+
+		R2_INVENTORY.setObjectScene(R2_SUPERCONDUCTOR_WIRE, 3);
+		_sceneMode = 14;
+
+		setAction(&_sequenceManager, this, 1625, &_teal, &_tealRightArm, NULL);
+		break;
+	case 1632:
+		_tealHead.setup(1627, 1, 1);
+		_tealHead.setPosition(Common::Point(68, 68));
+		_tealHead.show();
+
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(835, this);
+		break;
+	case 1633:
+		_glass.remove();
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(818, this);
+		break;
+	case 1634:
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(836, this);
 		break;
-	case R2_REBREATHER_TANK:
-		if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
-			if (R2_GLOBALS.getFlag(30))
-				return SceneActor::startAction(action, event);
-
-			R2_GLOBALS._player.disableControl();
-			scene->_sceneMode = 1878;
-			scene->setAction(&scene->_sequenceManager1, scene, 1878, &R2_GLOBALS._player,
-				&scene->_robot, &scene->_airbag, NULL);
-		}
+	case 1635:
+		_mirandaMouth.setup(1627, 3, 1);
+		_mirandaMouth.setPosition(Common::Point(196, 65));
+		_mirandaMouth.show();
 
-		return true;
+		_sceneMode = 99;
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+		_stripManager.start(818, this);
 		break;
 	default:
-		return SceneActor::startAction(action, event);
 		break;
 	}
 }
 
-bool Scene1850::Door::startAction(CursorType action, Event &event) {
-	if (action != CURSOR_USE)
-		return SceneHotspot::startAction(action, event);
-
-	if (R2_GLOBALS.getFlag(32)) {
-		SceneItem::display(3240, 4, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, LIST_END);
-		return true;
-	}
-
-	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
-
-	R2_GLOBALS._player.disableControl();
-	if (scene->_sceneMode == 1851)
-		R2_GLOBALS._player._effect = EFFECT_SHADED;
-
-	if (_position.x >= 160)
-		R2_GLOBALS.setFlag(29);
+void Scene1625::process(Event &event) {
+	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_ESCAPE))
+		event.handled = true;
 	else
-		R2_GLOBALS.clearFlag(29);
+		Scene::process(event);
+}
 
-	if ((R2_GLOBALS._player._characterIndex == R2_SEEKER) && (R2_GLOBALS.getFlag(30))) {
-		if (_position.x >= 160)
-			scene->_seqNumber = 3;
-		else
-			scene->_seqNumber = 2;
+/*--------------------------------------------------------------------------
+ * Scene 1700 - Rim
+ *
+ *--------------------------------------------------------------------------*/
 
-		scene->_sceneMode = 1860;
+Scene1700::Scene1700() {
+	_walkFlag = 0;
+}
 
-		if (R2_GLOBALS.getFlag(32)) {
-			scene->setAction(&scene->_sequenceManager1, scene, 1860, &R2_GLOBALS._player, &scene->_robot, NULL);
-		} else {
-			scene->setAction(&scene->_sequenceManager1, scene, 1859, &R2_GLOBALS._player, &scene->_robot, NULL);
-		}
-	} else {
-		scene->_sceneMode = 11;
-		if (_position.x >= 160) {
-			scene->setAction(&scene->_sequenceManager1, scene, 1866, &R2_GLOBALS._player, &scene->_rightDoor, NULL);
-		} else {
-			scene->setAction(&scene->_sequenceManager1, scene, 1865, &R2_GLOBALS._player, &scene->_leftDoor, NULL);
-		}
-	}
+void Scene1700::synchronize(Serializer &s) {
+	SceneExt::synchronize(s);
 
-	return true;
+	s.syncAsSint16LE(_walkFlag);
 }
 
-bool Scene1850::DisplayScreen::startAction(CursorType action, Event &event) {
-	if ((action != CURSOR_USE) || (_position.y != 120))
-		return SceneHotspot::startAction(action, event);
+bool Scene1700::RimTransport::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_USE)
+		return SceneActor::startAction(action, event);
 
-	Scene1850 *scene = (Scene1850 *)R2_GLOBALS._sceneManager._scene;
+	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
 
 	R2_GLOBALS._player.disableControl();
-	scene->_sceneMode = 1881;
+	scene->_sceneMode = 4;
 
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		scene->setAction(&scene->_sequenceManager1, scene, 1881, &R2_GLOBALS._player, NULL);
-	} else {
-		scene->setAction(&scene->_sequenceManager1, scene, 1880, &R2_GLOBALS._player, NULL);
-	}
+	Common::Point pt(271, 90);
+	PlayerMover *mover = new PlayerMover();
+	R2_GLOBALS._player.addMover(mover, &pt, scene);
 
 	return true;
 }
 
-/*------------------------------------------------------------------------*/
-
-Scene1850::Scene1850() {
-	_sceneMode = 0;
-	_shadeCountdown = 0;
-	_shadeDirection = 0;
-	_shadeChanging = false;
-	_seqNumber = 0;
-}
+bool Scene1700::Companion::startAction(CursorType action, Event &event) {
+	if (action != CURSOR_TALK)
+		return SceneActor::startAction(action, event);
 
-void Scene1850::synchronize(Serializer &s) {
-	SceneExt::synchronize(s);
+	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
+	scene->_sceneMode = 30;
+	scene->signal();
 
-	s.syncAsSint16LE(_sceneMode);
-	s.syncAsSint16LE(_shadeCountdown);
-	s.syncAsSint16LE(_shadeDirection);
-	s.syncAsSint16LE(_shadeChanging);
-	s.syncAsSint16LE(_seqNumber);
-	s.syncAsSint16LE(_playerDest.x);
-	s.syncAsSint16LE(_playerDest.y);
+	return true;
 }
 
-void Scene1850::postInit(SceneObjectList *OwnerList) {
-	loadScene(1850);
-
-	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850)
-		R2_GLOBALS.clearFlag(31);
-
-	_palette1.loadPalette(0);
-
-	if (R2_GLOBALS.getFlag(31)) {
-		_sceneMode = 1850;
-		g_globals->_scenePalette.loadPalette(1850);
-	} else {
-		_sceneMode = 1851;
-		g_globals->_scenePalette.loadPalette(1851);
-	}
+void Scene1700::NorthExit::changeScene() {
+	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
 
-	SceneExt::postInit();
+	R2_GLOBALS._player.disableControl();
+	_moving = false;
+	scene->_sceneMode = 1;
 
-	if (R2_GLOBALS._sceneManager._previousScene == 3150)
-		R2_GLOBALS._sound1.play(116);
+	Common::Point pt(R2_GLOBALS._player._position.x, 0);
+	NpcMover *mover = new NpcMover();
+	R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
 
-	_stripManager.addSpeaker(&_quinnSpeaker);
-	_stripManager.addSpeaker(&_seekerSpeaker);
+void Scene1700::SouthExit::changeScene() {
+	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
 
-	_shadeChanging = false;
-	_seqNumber = 0;
-	_playerDest = Common::Point(0, 0);
+	R2_GLOBALS._player.disableControl();
+	_moving = false;
+	scene->_sceneMode = 2;
 
-	R2_GLOBALS._player._characterScene[R2_QUINN] = 1850;
-	R2_GLOBALS._player._characterScene[R2_SEEKER] = 1850;
+	Common::Point pt(R2_GLOBALS._player._position.x, 170);
+	NpcMover *mover = new NpcMover();
+	R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
 
-	_button.setDetails(Rect(101, 56, 111, 63), 1850, 19, -1, -1, 1, NULL);
+void Scene1700::WestExit::changeScene() {
+	Scene1700 *scene = (Scene1700 *)R2_GLOBALS._sceneManager._scene;
 
-	_leftDoor.postInit();
-	_leftDoor.setup(1850, 3, 1);
-	_leftDoor.setPosition(Common::Point(66, 102));
-	_leftDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
+	R2_GLOBALS._player.disableControl();
+	_moving = false;
+	scene->_sceneMode = 6;
 
-	_rightDoor.postInit();
-	_rightDoor.setup(1850, 2, 1);
-	_rightDoor.setPosition(Common::Point(253, 102));
-	_rightDoor.setDetails(1850, 22, -1, -1, 1, (SceneItem *) NULL);
+	Common::Point pt(0, R2_GLOBALS._player._position.y);
+	NpcMover *mover = new NpcMover();
+	R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
 
-	R2_GLOBALS._walkRegions.disableRegion(1);
+void Scene1700::enterArea() {
+	Rect tmpRect;
+	R2_GLOBALS._walkRegions.load(1700);
 
-	_robot.postInit();
+	_slabWest.remove();
+	_slabEast.remove();
+	_slabShadowWest.remove();
+	_slabShadowEast.remove();
+	_westPlatform.remove();
+	_rimTransportDoor.remove();
+	_rimTransport.remove();
 
-	if (R2_GLOBALS.getFlag(34)) {
-		R2_GLOBALS._walkRegions.disableRegion(2);
-		_robot.setup(1851, 4, 3);
-	} else if (R2_GLOBALS.getFlag(30)) {
-		_robot.setup(1851, 2, 2);
-	} else {
-		R2_GLOBALS._walkRegions.disableRegion(5);
-		if (R2_GLOBALS.getFlag(33)) {
-			R2_GLOBALS._walkRegions.disableRegion(2);
-			_robot.setup(1851, 1, 3);
-		} else {
-			_robot.setup(1851, 2, 1);
-		}
+	if (_sceneMode != 40) {
+		_ledgeHopper.remove();
+		_hatch.remove();
 	}
 
-	_robot.setPosition(Common::Point(219, 130));
-	_robot.fixPriority(114);
-	_robot.setDetails(1850, -1, -1, -1, 1, (SceneItem *) NULL);
-
-	R2_GLOBALS._player.postInit();
+	// The original had manual code here to redraw the background manually when
+	// changing areas within the scene. Which seems to be totally redundant.
 
-	_companion.postInit();
-	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		_companion.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL);
-	} else {
-		_companion.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL);
+	if (_sceneMode != 40 && R2_GLOBALS._rimLocation == 0) {
+		// Crashed ledge hopper
+		_ledgeHopper.postInit();
+		_ledgeHopper.setup(1701, 1, 1);
+		_ledgeHopper.setPosition(Common::Point(220, 137));
+		_ledgeHopper.setDetails(1700, 6, -1, -1, 2, (SceneItem *) NULL);
+		R2_GLOBALS._walkRegions.disableRegion(2);
+		R2_GLOBALS._walkRegions.disableRegion(12);
 	}
 
-	if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) {
-		R2_GLOBALS._player._effect = EFFECT_SHADED2;
-		_companion._effect = EFFECT_SHADED2;
-		if (R2_GLOBALS.getFlag(31)) {
-			R2_GLOBALS._player._shade = 0;
-			_companion._shade = 0;
-		} else {
-			R2_GLOBALS._player._shade = 6;
-			_companion._shade = 6;
-		}
-
-		if (R2_INVENTORY.getObjectScene(R2_AIRBAG) == 1850) {
-			_airbag.postInit();
-			if (R2_GLOBALS.getFlag(34)) {
-				_airbag.setup(1851, 4, 2);
-				_airbag.fixPriority(114);
-			} else {
-				_airbag.setup(1851, 4, 1);
-			}
-
-			_airbag.setPosition(Common::Point(179, 113));
-
-			if ((_robot._strip == 1) && (_robot._frame == 3)){
-				_airbag.hide();
-			}
-
-			_airbag.setDetails(1850, 6, -1, -1, 1, (SceneItem *) NULL);
-		}
-
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			if (R2_GLOBALS.getFlag(32)) {
-				R2_GLOBALS._player.setVisage(1511);
-				_companion.setVisage(1508);
+	if ((R2_GLOBALS._rimLocation + 2) % 4 == 0) {
+		// The slabs forming the bottom of the regular rings the rim transport travels through
+		_slabWest.postInit();
+		_slabWest.setup(1700, 1, 1);
+		_slabWest.setPosition(Common::Point(222, 82));
+		_slabWest.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
 
-				_screen.postInit();
-				_screen.setup(1853, 3, 1);
-				_screen.setPosition(Common::Point(122, 113));
-				_screen.fixPriority(114);
-				_screen._effect = EFFECT_SHADED2;
-				_screen.setDetails(1850, 28, -1, -1, 2, (SceneItem *) NULL);
+		_slabShadowWest.postInit();
+		_slabShadowWest.setup(1700, 2, 1);
+		_slabShadowWest.setPosition(Common::Point(177, 82));
+		_slabShadowWest.fixPriority(0);
 
-				_helmet.postInit();
-				_helmet.setup(1853, 3, 2);
-				_helmet.setPosition(Common::Point(139, 111));
-				_helmet.fixPriority(114);
-				_helmet._effect = EFFECT_SHADED2;
-				_helmet.setDetails(1850, 29, -1, -1, 2, (SceneItem *) NULL);
+		_slabShadowEast.postInit();
+		_slabShadowEast.setup(1700, 2, 2);
+		_slabShadowEast.setPosition(Common::Point(332, 96));
+		_slabShadowEast.fixPriority(0);
 
-				if (R2_GLOBALS.getFlag(31)) {
-					_screen._shade = 0;
-					_helmet._shade = 0;
-				} else {
-					_screen._shade = 6;
-					_helmet._shade = 6;
-				}
-			} else {
-				R2_GLOBALS._player.setVisage(1500);
-				_companion.setVisage(1505);
-			}
-		} else if (R2_GLOBALS.getFlag(32)) {
-			// Not Quinn, flag 32
-			R2_GLOBALS._player.setVisage(1508);
-			_companion.setVisage(1511);
+		_slabEast.postInit();
+		_slabEast.setup(1700, 1, 2);
+		_slabEast.setPosition(Common::Point(424, 84));
 
-			_screen.postInit();
-			_screen.setup(1853, 3, 1);
-			_screen.setPosition(Common::Point(122, 113));
-			_screen.fixPriority(114);
-			_screen._effect = EFFECT_SHADED2;
-			_screen.setDetails(1850, 30, -1, -1, 2, (SceneItem *) NULL);
+		R2_GLOBALS._walkRegions.disableRegion(11);
+	}
 
-			_helmet.postInit();
-			_helmet.setup(1853, 3, 2);
-			_helmet.setPosition(Common::Point(139, 111));
-			_helmet.fixPriority(114);
-			_helmet._effect = EFFECT_SHADED2;
-			_helmet.setDetails(1850, 28, -1, -1, 1, (SceneItem *) NULL);
+	if ((R2_GLOBALS._rimLocation + 399) % 800 == 0) {
+		// Enable west exit to lift
+		_westPlatform.postInit();
+		_westPlatform.setup(1700, 3, 2);
+		_westPlatform.setPosition(Common::Point(51, 141));
+		_westPlatform.fixPriority(0);
+		_westPlatform.setDetails(100, -1, -1, -1, 2, (SceneItem *) NULL);
 
-			if (R2_GLOBALS.getFlag(31)) {
-				_screen._shade = 0;
-				_helmet._shade = 0;
-			} else {
-				_screen._shade = 6;
-				_helmet._shade = 6;
-			}
-		} else {
-			// Not Quinn, nor flag 32
-			R2_GLOBALS._player.setVisage(1505);
-			_companion.setVisage(1500);
-		}
+		_westExit._enabled = true;
+	} else {
+		R2_GLOBALS._walkRegions.disableRegion(1);
+		_westExit._enabled = false;
+	}
 
-		R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
-		R2_GLOBALS._player.setStrip(3);
-		R2_GLOBALS._player.setPosition(Common::Point(80, 114));
+	if (  ((!R2_GLOBALS.getFlag(15)) && ((R2_GLOBALS._rimLocation == 25) || (R2_GLOBALS._rimLocation == -3)))
+		 || ((R2_GLOBALS.getFlag(15)) && (R2_GLOBALS._rimLocation == R2_GLOBALS._rimTransportLocation))
+		 ) {
+		// Rim transport vechile located
+		R2_GLOBALS._rimTransportLocation = R2_GLOBALS._rimLocation;
+		if (!R2_GLOBALS.getFlag(15))
+			_walkFlag = true;
 
-		_companion.animate(ANIM_MODE_1, NULL);
-		_companion.setObjectWrapper(new SceneObjectWrapper());
-		_companion.setStrip(3);
-		_companion.setPosition(Common::Point(180, 96));
+		_rimTransport.postInit();
+		_rimTransport.setup(1700, 3, 1);
+		_rimTransport.setPosition(Common::Point(338, 150));
+		_rimTransport.setDetails(1700, 9, -1, -1, 2, (SceneItem *) NULL);
+		_rimTransport.fixPriority(15);
 
-		if (R2_GLOBALS.getFlag(30)) {
-			if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-				_companion.animate(ANIM_MODE_NONE, NULL);
-				_companion.setObjectWrapper(NULL);
-				if (R2_GLOBALS.getFlag(32)) {
-					_companion.setup(1854, 1, 3);
-				} else {
-					_companion.setup(1854, 2, 3);
-				}
+		_rimTransportDoor.postInit();
+		_rimTransportDoor.setup(1700, 4, 1);
+		_rimTransportDoor.setPosition(Common::Point(312, 106));
+		_rimTransportDoor.fixPriority(130);
+	}
+}
 
-				_companion.setPosition(Common::Point(164, 106));
-			} else {
-				_companion.animate(ANIM_MODE_NONE, NULL);
-				_companion.setObjectWrapper(NULL);
-				if (R2_GLOBALS.getFlag(32)) {
-					R2_GLOBALS._player.setup(1854, 1, 3);
-				} else {
-					R2_GLOBALS._player.setup(1854, 2, 3);
-				}
+void Scene1700::postInit(SceneObjectList *OwnerList) {
+	loadScene(1700);
+	SceneExt::postInit();
+	if (R2_GLOBALS._sceneManager._previousScene == -1)
+		R2_GLOBALS._sceneManager._previousScene = 1530;
 
-				R2_GLOBALS._player.setPosition(Common::Point(164, 106));
-			}
-		}
+	scalePalette(65, 65, 65);
+	_stripManager.addSpeaker(&_quinnSpeaker);
+	_stripManager.addSpeaker(&_seekerSpeaker);
 
-		R2_GLOBALS._player.enableControl();
-	} else { // R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 1850
-		R2_GLOBALS._player._effect = EFFECT_SHADED;
-		_companion._effect = EFFECT_SHADED;
-		R2_GLOBALS._player.disableControl();
-		_sceneMode = 10;
-		if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-			if (R2_GLOBALS.getFlag(29)) {
-				setAction(&_sequenceManager1, this, 1863, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
-			} else {
-				setAction(&_sequenceManager1, this, 1861, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
-			}
-		} else {
-			if (R2_GLOBALS.getFlag(29)) {
-				setAction(&_sequenceManager1, this, 1864, &R2_GLOBALS._player, &_companion, &_rightDoor, NULL);
-			} else {
-				setAction(&_sequenceManager1, this, 1862, &R2_GLOBALS._player, &_companion, &_leftDoor, NULL);
-			}
-		}
-	}
+	_northExit.setDetails(Rect(94, 0, 319, 12), EXITCURSOR_N, 1700);
+	_southExit.setDetails(Rect(0, 161, 319, 168), EXITCURSOR_S, 1700);
+	_westExit.setDetails(Rect(0, 0, 12, 138), EXITCURSOR_W, 1800);
 
+	R2_GLOBALS._player.postInit();
+	R2_GLOBALS._player.setPosition(Common::Point(0, 0));
+	R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
 	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
-		R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
-		_companion._moveDiff = Common::Point(5, 3);
+		R2_GLOBALS._player.setVisage(1501);
+		R2_GLOBALS._player._moveDiff = Common::Point(2, 1);
 	} else {
-		R2_GLOBALS._player._moveDiff = Common::Point(5, 3);
-		_companion._moveDiff = Common::Point(3, 2);
+		R2_GLOBALS._player.setVisage(1506);
+		R2_GLOBALS._player._moveDiff = Common::Point(3, 1);
 	}
 
-	_displayScreen.postInit();
-	_displayScreen.setup(1850, 1, 1);
+	_companion.postInit();
+	_companion.animate(ANIM_MODE_1, NULL);
+	_companion.setObjectWrapper(new SceneObjectWrapper());
 
-	if (R2_GLOBALS.getFlag(62)) {
-		_displayScreen.setPosition(Common::Point(159, 120));
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN) {
+		_companion.setVisage(1506);
+		_companion._moveDiff = Common::Point(3, 1);
+		_companion.setDetails(9002, 1, -1, -1, 1, (SceneItem *) NULL);
 	} else {
-		_displayScreen.setPosition(Common::Point(159, 184));
+		_companion.setVisage(1501);
+		_companion._moveDiff = Common::Point(2, 1);
+		_companion.setDetails(9001, 1, -1, -1, 1, (SceneItem *) NULL);
 	}
 
-	_displayScreen.fixPriority(113);
+	R2_GLOBALS._sound1.play(134);
 
-	if (R2_GLOBALS.getFlag(34)) {
-		_displayScreen.setDetails(1850, 25, -1, -1, 4, &_robot);
-	} else {
-		_displayScreen.setDetails(1850, 25, -1, -1, 2, (SceneItem *) NULL);
-	}
+	_playerShadow.postInit();
+	_playerShadow.fixPriority(10);
 
-	if (!R2_GLOBALS.getFlag(62)) {
-		_displayScreen.hide();
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		_playerShadow.setVisage(1112);
+	else
+		_playerShadow.setVisage(1111);
+
+	_playerShadow._effect = EFFECT_SHADOW_MAP;
+	_playerShadow._shadowMap = _shadowPaletteMap;
+	R2_GLOBALS._player._linkedActor = &_playerShadow;
+
+	_companionShadow.postInit();
+	_companionShadow.fixPriority(10);
+	if (R2_GLOBALS._player._characterIndex == R2_QUINN)
+		_companionShadow.setVisage(1111);
+	else
+		_companionShadow.setVisage(1112);
+
+	_companionShadow._effect = EFFECT_SHADOW_MAP;
+	_companionShadow._shadowMap = _shadowPaletteMap;
+	_companion._linkedActor = &_companionShadow;
+
+	R2_GLOBALS._sound1.play(134);
+
+	switch (R2_GLOBALS._sceneManager._previousScene) {
+	case 1530:
+		R2_GLOBALS._player._characterIndex = R2_QUINN;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._player.hide();
+		_companion.hide();
+
+		_hatch.postInit();
+		_hatch.hide();
+
+		_ledgeHopper.postInit();
+		_ledgeHopper.setup(1701, 1, 1);
+		_ledgeHopper.setPosition(Common::Point(220, 137));
+		_ledgeHopper.setDetails(1700, 6, -1, -1, 1, (SceneItem *) NULL);
+
+		_playerShadow.hide();
+		_companionShadow.hide();
+		R2_GLOBALS._events.setCursor(CURSOR_WALK);
+		_stripManager.start(539, this);
+		_sceneMode = 40;
+		break;
+	case 1750: {
+		R2_GLOBALS._player.setPosition(Common::Point(282, 121));
+		_companion.setPosition(Common::Point(282, 139));
+		_sceneMode = 8;
+		Common::Point pt(262, 101);
+		NpcMover *mover = new NpcMover();
+		R2_GLOBALS._player.addMover(mover, &pt, this);
+		Common::Point pt2(262, 119);
+		NpcMover *mover2 = new NpcMover();
+		_companion.addMover(mover2, &pt2, this);
+		}
+		break;
+	case 1800: {
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._player.setPosition(Common::Point(0, 86));
+		_companion.setPosition(Common::Point(0, 64));
+		_sceneMode = 7;
+		R2_GLOBALS._player.setObjectWrapper(NULL);
+		R2_GLOBALS._player._strip = 1;
+		Common::Point pt(64, 86);
+		NpcMover *mover = new NpcMover();
+		R2_GLOBALS._player.addMover(mover, &pt, this);
+		_companion.setObjectWrapper(NULL);
+		_companion._strip = 1;
+		Common::Point pt2(77, 64);
+		NpcMover *mover2 = new NpcMover();
+		_companion.addMover(mover2, &pt2, NULL);
+		}
+		break;
+	default:






More information about the Scummvm-git-logs mailing list