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

dreammaster dreammaster at scummvm.org
Sat Aug 13 11:53:58 CEST 2011


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:
e9c8232da8 TSAGE: Split up the hard-coded logic files for Ringworld and Blue Force into separate sub-folderes


Commit: e9c8232da864891fafcceb217b291a50096738ce
    https://github.com/scummvm/scummvm/commit/e9c8232da864891fafcceb217b291a50096738ce
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-08-13T02:49:54-07:00

Commit Message:
TSAGE: Split up the hard-coded logic files for Ringworld and Blue Force into separate sub-folderes

Changed paths:
  A engines/tsage/blue_force/blueforce_logic.cpp
  A engines/tsage/blue_force/blueforce_logic.h
  A engines/tsage/blue_force/blueforce_scenes0.cpp
  A engines/tsage/blue_force/blueforce_scenes0.h
  A engines/tsage/blue_force/blueforce_scenes1.cpp
  A engines/tsage/blue_force/blueforce_scenes1.h
  A engines/tsage/ringworld/ringworld_demo.cpp
  A engines/tsage/ringworld/ringworld_demo.h
  A engines/tsage/ringworld/ringworld_logic.cpp
  A engines/tsage/ringworld/ringworld_logic.h
  A engines/tsage/ringworld/ringworld_scenes1.cpp
  A engines/tsage/ringworld/ringworld_scenes1.h
  A engines/tsage/ringworld/ringworld_scenes10.cpp
  A engines/tsage/ringworld/ringworld_scenes10.h
  A engines/tsage/ringworld/ringworld_scenes2.cpp
  A engines/tsage/ringworld/ringworld_scenes2.h
  A engines/tsage/ringworld/ringworld_scenes3.cpp
  A engines/tsage/ringworld/ringworld_scenes3.h
  A engines/tsage/ringworld/ringworld_scenes4.cpp
  A engines/tsage/ringworld/ringworld_scenes4.h
  A engines/tsage/ringworld/ringworld_scenes5.cpp
  A engines/tsage/ringworld/ringworld_scenes5.h
  A engines/tsage/ringworld/ringworld_scenes6.cpp
  A engines/tsage/ringworld/ringworld_scenes6.h
  A engines/tsage/ringworld/ringworld_scenes8.cpp
  A engines/tsage/ringworld/ringworld_scenes8.h
  R engines/tsage/blueforce_logic.cpp
  R engines/tsage/blueforce_logic.h
  R engines/tsage/blueforce_scenes0.cpp
  R engines/tsage/blueforce_scenes0.h
  R engines/tsage/blueforce_scenes1.cpp
  R engines/tsage/blueforce_scenes1.h
  R engines/tsage/ringworld_demo.cpp
  R engines/tsage/ringworld_demo.h
  R engines/tsage/ringworld_logic.cpp
  R engines/tsage/ringworld_logic.h
  R engines/tsage/ringworld_scenes1.cpp
  R engines/tsage/ringworld_scenes1.h
  R engines/tsage/ringworld_scenes10.cpp
  R engines/tsage/ringworld_scenes10.h
  R engines/tsage/ringworld_scenes2.cpp
  R engines/tsage/ringworld_scenes2.h
  R engines/tsage/ringworld_scenes3.cpp
  R engines/tsage/ringworld_scenes3.h
  R engines/tsage/ringworld_scenes4.cpp
  R engines/tsage/ringworld_scenes4.h
  R engines/tsage/ringworld_scenes5.cpp
  R engines/tsage/ringworld_scenes5.h
  R engines/tsage/ringworld_scenes6.cpp
  R engines/tsage/ringworld_scenes6.h
  R engines/tsage/ringworld_scenes8.cpp
  R engines/tsage/ringworld_scenes8.h
    engines/tsage/debugger.cpp
    engines/tsage/dialogs.cpp
    engines/tsage/globals.cpp
    engines/tsage/module.mk
    engines/tsage/scenes.cpp



diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
new file mode 100644
index 0000000..87e1597
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -0,0 +1,128 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_scenes0.h"
+#include "tsage/blue_force/blueforce_scenes1.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+void BlueForceGame::start() {
+	// Start the game
+	_globals->_sceneManager.changeScene(20);
+
+	_globals->_events.setCursor(CURSOR_WALK);
+}
+
+Scene *BlueForceGame::createScene(int sceneNumber) {
+	switch (sceneNumber) {
+	/* Scene Group #0 */
+	case 20:
+		// Tsunami Title Screen
+		return new BF_Scene20();
+	case 50:
+	case 60:
+		error("Scene group 0 not implemented");
+	/* Scene Group #1 */
+	case 100:
+		// Tsnunami Title Screen #2
+		return new BF_Scene100();
+	case 109:
+	case 110:
+	case 114:
+	case 115:
+	case 125:
+	case 140:
+	case 150:
+	case 160:
+	case 180:
+	case 190:
+		error("Scene group 1 not implemented");
+	case 200:
+	case 210:
+	case 220:
+	case 225:
+	case 265:
+	case 270:
+	case 271:
+	case 280:
+		error("Scene group 2 not implemented");
+	case 300:
+	case 315:
+	case 325:
+	case 330:
+	case 340:
+	case 342:
+	case 350:
+	case 355:
+	case 360:
+	case 370:
+	case 380:
+	case 385:
+	case 390:
+		error("Scene group 3 not implemented");
+	case 410:
+	case 415:
+	case 440:
+	case 450:
+		error("Scene group 4 not implemented");
+	case 550:
+	case 551:
+	case 560:
+	case 570:
+	case 580:
+	case 590:
+		error("Scene group 5 not implemented");
+	case 600:
+	case 620:
+	case 666:
+	case 690:
+		error("Scene group 6 not implemented");
+	case 710:
+		error("Scene group 7 not implemented");
+	case 800:
+	case 810:
+	case 820:
+	case 830:
+	case 840:
+	case 850:
+	case 860:
+	case 870:
+	case 880:
+		error("Scene group 8 not implemented");
+	case 900:
+	case 910:
+	case 920:
+	case 930:
+	case 935:
+	case 940:
+		error("Scene group 9 not implemented");
+	default:
+		error("Unknown scene number - %d", sceneNumber);
+		break;
+	}
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
new file mode 100644
index 0000000..9237e50
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -0,0 +1,42 @@
+/* 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_BLUEFORCE_LOGIC_H
+#define TSAGE_BLUEFORCE_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class BlueForceGame: public Game {
+public:
+	virtual void start();
+	virtual Scene *createScene(int sceneNumber);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp
new file mode 100644
index 0000000..3eaa2bf
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes0.cpp
@@ -0,0 +1,196 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "tsage/blue_force/blueforce_scenes0.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 20 - Tsunami Title Screen
+ *
+ *--------------------------------------------------------------------------*/
+
+void BF_Scene20::Action1::signal() {
+	BF_Scene20 *scene = (BF_Scene20 *)_globals->_sceneManager._scene;
+	static byte black[3] = { 0, 0, 0 };
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(2);
+		break;
+	case 1:
+		_sound.play(1);
+		_globals->_scenePalette.addRotation(64, 127, -1, 1, this);
+		break;
+	case 2:
+		scene->_object1.setVisage(22);
+		scene->_object1._strip = 1;
+		scene->_object1._frame = 1;
+		scene->_object1.changeZoom(100);
+
+		scene->_object2.setVisage(22);
+		scene->_object2._strip = 2;
+		scene->_object2._frame = 1;
+		scene->_object2.changeZoom(100);
+
+		scene->_object3.setVisage(22);
+		scene->_object3._strip = 3;
+		scene->_object3._frame = 1;
+		scene->_object3.changeZoom(100);
+
+		scene->_object4.setVisage(22);
+		scene->_object4._strip = 4;
+		scene->_object4._frame = 1;
+		scene->_object4.changeZoom(100);
+
+		scene->_object5.setVisage(22);
+		scene->_object5._strip = 5;
+		scene->_object5._frame = 1;
+		scene->_object5.changeZoom(100);
+
+		scene->_object6.setVisage(22);
+		scene->_object6._strip = 6;
+		scene->_object6._frame = 1;
+		scene->_object6.changeZoom(100);
+
+		scene->_object7.setVisage(22);
+		scene->_object7._strip = 7;
+		scene->_object7._frame = 1;
+		scene->_object7.changeZoom(100);
+
+		scene->_object8.setVisage(22);
+		scene->_object8._strip = 8;
+		scene->_object8._frame = 1;
+		scene->_object8.changeZoom(100);
+
+		setDelay(1);
+		break;
+	case 3:
+		_globals->_scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this);
+		break;
+	case 4:
+		setDelay(60);
+		break;
+	case 5:
+		scene->_object2.animate(ANIM_MODE_5, NULL);
+		scene->_object3.animate(ANIM_MODE_5, NULL);
+		scene->_object4.animate(ANIM_MODE_5, NULL);
+		scene->_object5.animate(ANIM_MODE_5, NULL);
+		scene->_object6.animate(ANIM_MODE_5, NULL);
+		scene->_object7.animate(ANIM_MODE_5, this);
+		break;
+	case 6:
+		setDelay(120);
+		break;
+	case 7:
+		_globals->_scenePalette.addFader(black, 1, 5, this);
+		break;
+	case 8:
+		_globals->_sceneManager.changeScene(100);
+		remove();
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void BF_Scene20::postInit(SceneObjectList *OwnerList) {
+	loadScene(20);
+	Scene::postInit();
+	setZoomPercents(60, 85, 200, 100);
+
+	preloadVisage(21);
+	preloadVisage(22);
+	_scenePalette.loadPalette(1);
+	_scenePalette.loadPalette(22);
+
+	_object1.postInit();
+	_object1.setVisage(21);
+	_object1._strip = 1;
+	_object1._frame = 1;
+	_object1.animate(ANIM_MODE_NONE, NULL);
+	_object1.setPosition(Common::Point(62, 85));
+	_object1.changeZoom(100);
+
+	_object2.postInit();
+	_object2.setVisage(21);
+	_object2._strip = 2;
+	_object2._frame = 1;
+	_object2.animate(ANIM_MODE_NONE, NULL);
+	_object2.setPosition(Common::Point(27, 94));
+	_object2.changeZoom(100);
+
+	_object3.postInit();
+	_object3.setVisage(21);
+	_object3._strip = 2;
+	_object3._frame = 2;
+	_object3.animate(ANIM_MODE_NONE, NULL);
+	_object3.setPosition(Common::Point(68, 94));
+	_object3.changeZoom(100);
+
+	_object4.postInit();
+	_object4.setVisage(21);
+	_object4._strip = 2;
+	_object4._frame = 3;
+	_object4.animate(ANIM_MODE_NONE, NULL);
+	_object4.setPosition(Common::Point(110, 94));
+	_object4.changeZoom(100);
+
+	_object5.postInit();
+	_object5.setVisage(21);
+	_object5._strip = 2;
+	_object5._frame = 4;
+	_object5.animate(ANIM_MODE_NONE, NULL);
+	_object5.setPosition(Common::Point(154, 94));
+	_object5.changeZoom(100);
+
+	_object6.postInit();
+	_object6.setVisage(21);
+	_object6._strip = 2;
+	_object6._frame = 5;
+	_object6.animate(ANIM_MODE_NONE, NULL);
+	_object6.setPosition(Common::Point(199, 94));
+	_object6.changeZoom(100);
+
+	_object7.postInit();
+	_object7.setVisage(21);
+	_object7._strip = 2;
+	_object7._frame = 6;
+	_object7.animate(ANIM_MODE_NONE, NULL);
+	_object7.setPosition(Common::Point(244, 94));
+	_object7.changeZoom(100);
+
+	_object8.postInit();
+	_object8.setVisage(21);
+	_object8._strip = 2;
+	_object8._frame = 7;
+	_object8.animate(ANIM_MODE_NONE, NULL);
+	_object8.setPosition(Common::Point(286, 94));
+	_object8.changeZoom(100);
+
+	setAction(&_action1);
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h
new file mode 100644
index 0000000..c176a17
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes0.h
@@ -0,0 +1,56 @@
+/* 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_BLUEFORCE_SCENES0_H
+#define TSAGE_BLUEFORCE_SCENES0_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.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"
+
+namespace tSage {
+
+class BF_Scene20 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	private:
+		ASoundExt _sound;
+	public:
+		virtual void signal();
+	};
+public:
+	Action1 _action1;
+	ScenePalette _scenePalette;
+	SceneObject _object1, _object2, _object3, _object4;
+	SceneObject _object5, _object6, _object7, _object8;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
new file mode 100644
index 0000000..0f0ab6c
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -0,0 +1,195 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "tsage/blue_force/blueforce_scenes1.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 100 - Tsunami Title Screen #2
+ *
+ *--------------------------------------------------------------------------*/
+
+void BF_Scene100::Action1::signal() {
+	static byte black[3] = { 0, 0, 0 };
+
+	switch (_actionIndex++) {
+	case 0:
+		_state = 0;
+		setDelay(6);
+		break;
+	case 1: {
+		Common::String msg1 = _resourceManager->getMessage(100, _state++);
+		if (!msg1.compareTo("LASTCREDIT")) {
+			Common::String msg2 = _resourceManager->getMessage(100, _state++);
+			setTextStrings(msg1, msg2, this);
+		} else {
+			setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this);
+			
+			Common::Point pt(_sceneText1._position.x, 80);
+			NpcMover *mover = new NpcMover();
+			_sceneText1.addMover(mover, &pt, this);
+		}
+		break;
+	}
+	case 2:
+		setDelay(600);
+		break;
+	case 3:
+		BF_GLOBALS._sound1.fade(0, 10, 10, 1, this);
+		GLOBALS._scenePalette.addFader(black, 1, 2, NULL);
+		break;
+	case 4:
+		error("??exit");
+		break;
+	}
+}
+
+void BF_Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) {
+	// Set data for first text control
+	_sceneText1._fontNumber = 10;
+	_sceneText1._width = 160;
+	_sceneText1._textMode = ALIGN_RIGHT;
+	_sceneText1._color1 = _globals->_fontColors.background;
+	_sceneText1._color2 = _globals->_fontColors.foreground;
+	_sceneText1._color3 = _globals->_fontColors.background;
+	_sceneText1.setup(msg1);
+	_sceneText1.setFrame2(-1);
+	_sceneText1.setPosition(Common::Point(
+		(SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202));
+	_sceneText1._moveRate = 30;
+	_sceneText1._moveDiff.y = 1;
+
+	// Set data for second text control
+	_sceneText2._fontNumber = 10;
+	_sceneText2._width = _sceneText1._width;
+	_sceneText2._textMode = _sceneText1._textMode;
+	_sceneText2._color1 = _globals->_fontColors.background;
+	_sceneText2._color2 = _globals->_fontColors.foreground;
+	_sceneText2._color3 = _globals->_fontColors.background;
+	_sceneText2.setup(msg1);
+	_sceneText2.setFrame2(-1);
+	GfxSurface textSurface = _sceneText2.getFrame();
+	_sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202));
+	_sceneText2._moveRate = 30;
+	_sceneText2._moveDiff.y = 1;
+	
+	_textHeight = textSurface.getBounds().height();
+	int yp = -(_textHeight * 2);
+
+	Common::Point pt(_sceneText1._position.x, yp); 
+	NpcMover *mover = new NpcMover();
+	_sceneText1.addMover(mover, &pt, action); 
+}
+
+void BF_Scene100::Action2::signal() {
+	BF_Scene100 *scene = (BF_Scene100 *)_globals->_sceneManager._scene;
+	static byte black[3] = {0, 0, 0};
+
+	switch (_actionIndex++) {
+	case 0:
+		BF_GLOBALS._scenePalette.addFader(black, 1, -2, this);
+		break;
+	case 1:
+		setDelay(180);
+		break;
+	case 2: {
+		const char *SEEN_INTRO = "seen_intro";
+		if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
+			// First time being played, so will need to show the intro
+			ConfMan.setBool(SEEN_INTRO, true);
+			ConfMan.flushToDisk();
+		} else {
+			// Prompt user for whether to start play or watch introduction
+			_globals->_player.enableControl();
+
+			if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
+				// Signal to start the game
+				scene->_index = 190;
+				remove();
+				return;
+			}
+		}
+
+		// At this point the introduction needs to start
+		_globals->_scenePalette.addFader(black, 1, 2, this);
+		break;
+	}
+	case 3:
+		remove();
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+BF_Scene100::BF_Scene100(): Scene() {
+	_index = 0;
+}
+
+void BF_Scene100::postInit(SceneObjectList *OwnerList) {
+	BF_GLOBALS._scenePalette.loadPalette(2);
+	BF_GLOBALS._v51C44 = 1;
+	Scene::postInit();
+	BF_GLOBALS._v51C24 = 200;
+
+	_globals->_player.enableControl();
+	_globals->_player.hide();
+	_globals->_player.disableControl();
+	_index = 109;
+
+	if (BF_GLOBALS._v4CEA2 < 6) {
+		// Title
+		loadScene(100);
+		BF_GLOBALS._sound1.play(2);
+		setAction(&_action2, this);
+	} else {
+		// Credits
+		loadScene(101);
+		BF_GLOBALS._sound1.play(118);
+		setAction(&_action1, this);
+	}
+
+	loadScene(20);
+	setZoomPercents(60, 85, 200, 100);
+}
+
+void BF_Scene100::signal() {
+	++_sceneMode;
+	if (BF_GLOBALS._v4CEA2 < 6) {
+		BF_GLOBALS._scenePalette.clearListeners();
+		BF_GLOBALS._scenePalette.loadPalette(100);
+		BF_GLOBALS._sceneManager.changeScene(_index);
+	} else {
+		if (_sceneMode > 1)
+			BF_GLOBALS._events.setCursor(CURSOR_ARROW);
+
+		setAction(this, &_action1, this);
+	}
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h
new file mode 100644
index 0000000..16d327f
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_scenes1.h
@@ -0,0 +1,73 @@
+/* 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_BLUEFORCE_SCENES1_H
+#define TSAGE_BLUEFORCE_SCENES1_H
+
+#include "common/scummsys.h"
+#include "tsage/blue_force/blueforce_logic.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"
+
+namespace tSage {
+
+class BF_Scene100: public Scene {
+	/* Actions */
+	class Action1: public ActionExt {
+	private:
+		void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action);
+	public:
+		SceneText _sceneText1, _sceneText2;
+		int _textHeight;
+
+		virtual Common::String getClassName() { return "BF100Action1"; }
+		virtual void synchronize(Serializer &s) {
+			ActionExt::synchronize(s);
+			s.syncAsSint16LE(_textHeight);
+		}
+		virtual void signal();
+	};
+	class Action2: public ActionExt {
+	public:
+		virtual Common::String getClassName() { return "BF100Action2"; }
+		virtual void signal();
+	};
+public:
+	SequenceManager _sequenceManager;
+	Action1 _action1;
+	Action2 _action2;
+	ScenePalette _scenePalette;
+	SceneObjectExt2 _object1, _object2, _object3, _object4, _object5;
+	int _index;
+
+	BF_Scene100();
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp
deleted file mode 100644
index cad7609..0000000
--- a/engines/tsage/blueforce_logic.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "tsage/blueforce_logic.h"
-#include "tsage/blueforce_scenes0.h"
-#include "tsage/blueforce_scenes1.h"
-#include "tsage/scenes.h"
-#include "tsage/tsage.h"
-#include "tsage/staticres.h"
-
-namespace tSage {
-
-void BlueForceGame::start() {
-	// Start the game
-	_globals->_sceneManager.changeScene(20);
-
-	_globals->_events.setCursor(CURSOR_WALK);
-}
-
-Scene *BlueForceGame::createScene(int sceneNumber) {
-	switch (sceneNumber) {
-	/* Scene Group #0 */
-	case 20:
-		// Tsunami Title Screen
-		return new BF_Scene20();
-	case 50:
-	case 60:
-		error("Scene group 0 not implemented");
-	/* Scene Group #1 */
-	case 100:
-		// Tsnunami Title Screen #2
-		return new BF_Scene100();
-	case 109:
-	case 110:
-	case 114:
-	case 115:
-	case 125:
-	case 140:
-	case 150:
-	case 160:
-	case 180:
-	case 190:
-		error("Scene group 1 not implemented");
-	case 200:
-	case 210:
-	case 220:
-	case 225:
-	case 265:
-	case 270:
-	case 271:
-	case 280:
-		error("Scene group 2 not implemented");
-	case 300:
-	case 315:
-	case 325:
-	case 330:
-	case 340:
-	case 342:
-	case 350:
-	case 355:
-	case 360:
-	case 370:
-	case 380:
-	case 385:
-	case 390:
-		error("Scene group 3 not implemented");
-	case 410:
-	case 415:
-	case 440:
-	case 450:
-		error("Scene group 4 not implemented");
-	case 550:
-	case 551:
-	case 560:
-	case 570:
-	case 580:
-	case 590:
-		error("Scene group 5 not implemented");
-	case 600:
-	case 620:
-	case 666:
-	case 690:
-		error("Scene group 6 not implemented");
-	case 710:
-		error("Scene group 7 not implemented");
-	case 800:
-	case 810:
-	case 820:
-	case 830:
-	case 840:
-	case 850:
-	case 860:
-	case 870:
-	case 880:
-		error("Scene group 8 not implemented");
-	case 900:
-	case 910:
-	case 920:
-	case 930:
-	case 935:
-	case 940:
-		error("Scene group 9 not implemented");
-	default:
-		error("Unknown scene number - %d", sceneNumber);
-		break;
-	}
-}
-
-} // End of namespace tSage
diff --git a/engines/tsage/blueforce_logic.h b/engines/tsage/blueforce_logic.h
deleted file mode 100644
index 9237e50..0000000
--- a/engines/tsage/blueforce_logic.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* 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_BLUEFORCE_LOGIC_H
-#define TSAGE_BLUEFORCE_LOGIC_H
-
-#include "common/scummsys.h"
-#include "tsage/events.h"
-#include "tsage/core.h"
-#include "tsage/scenes.h"
-#include "tsage/globals.h"
-
-namespace tSage {
-
-class BlueForceGame: public Game {
-public:
-	virtual void start();
-	virtual Scene *createScene(int sceneNumber);
-};
-
-} // End of namespace tSage
-
-#endif
diff --git a/engines/tsage/blueforce_scenes0.cpp b/engines/tsage/blueforce_scenes0.cpp
deleted file mode 100644
index 4a0259c..0000000
--- a/engines/tsage/blueforce_scenes0.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "tsage/blueforce_scenes0.h"
-#include "tsage/scenes.h"
-#include "tsage/tsage.h"
-#include "tsage/staticres.h"
-
-namespace tSage {
-
-/*--------------------------------------------------------------------------
- * Scene 20 - Tsunami Title Screen
- *
- *--------------------------------------------------------------------------*/
-
-void BF_Scene20::Action1::signal() {
-	BF_Scene20 *scene = (BF_Scene20 *)_globals->_sceneManager._scene;
-	static byte black[3] = { 0, 0, 0 };
-
-	switch (_actionIndex++) {
-	case 0:
-		setDelay(2);
-		break;
-	case 1:
-		_sound.play(1);
-		_globals->_scenePalette.addRotation(64, 127, -1, 1, this);
-		break;
-	case 2:
-		scene->_object1.setVisage(22);
-		scene->_object1._strip = 1;
-		scene->_object1._frame = 1;
-		scene->_object1.changeZoom(100);
-
-		scene->_object2.setVisage(22);
-		scene->_object2._strip = 2;
-		scene->_object2._frame = 1;
-		scene->_object2.changeZoom(100);
-
-		scene->_object3.setVisage(22);
-		scene->_object3._strip = 3;
-		scene->_object3._frame = 1;
-		scene->_object3.changeZoom(100);
-
-		scene->_object4.setVisage(22);
-		scene->_object4._strip = 4;
-		scene->_object4._frame = 1;
-		scene->_object4.changeZoom(100);
-
-		scene->_object5.setVisage(22);
-		scene->_object5._strip = 5;
-		scene->_object5._frame = 1;
-		scene->_object5.changeZoom(100);
-
-		scene->_object6.setVisage(22);
-		scene->_object6._strip = 6;
-		scene->_object6._frame = 1;
-		scene->_object6.changeZoom(100);
-
-		scene->_object7.setVisage(22);
-		scene->_object7._strip = 7;
-		scene->_object7._frame = 1;
-		scene->_object7.changeZoom(100);
-
-		scene->_object8.setVisage(22);
-		scene->_object8._strip = 8;
-		scene->_object8._frame = 1;
-		scene->_object8.changeZoom(100);
-
-		setDelay(1);
-		break;
-	case 3:
-		_globals->_scenePalette.addFader(scene->_scenePalette._palette, 256, 8, this);
-		break;
-	case 4:
-		setDelay(60);
-		break;
-	case 5:
-		scene->_object2.animate(ANIM_MODE_5, NULL);
-		scene->_object3.animate(ANIM_MODE_5, NULL);
-		scene->_object4.animate(ANIM_MODE_5, NULL);
-		scene->_object5.animate(ANIM_MODE_5, NULL);
-		scene->_object6.animate(ANIM_MODE_5, NULL);
-		scene->_object7.animate(ANIM_MODE_5, this);
-		break;
-	case 6:
-		setDelay(120);
-		break;
-	case 7:
-		_globals->_scenePalette.addFader(black, 1, 5, this);
-		break;
-	case 8:
-		_globals->_sceneManager.changeScene(100);
-		remove();
-		break;
-	}
-}
-
-/*--------------------------------------------------------------------------*/
-
-void BF_Scene20::postInit(SceneObjectList *OwnerList) {
-	loadScene(20);
-	Scene::postInit();
-	setZoomPercents(60, 85, 200, 100);
-
-	preloadVisage(21);
-	preloadVisage(22);
-	_scenePalette.loadPalette(1);
-	_scenePalette.loadPalette(22);
-
-	_object1.postInit();
-	_object1.setVisage(21);
-	_object1._strip = 1;
-	_object1._frame = 1;
-	_object1.animate(ANIM_MODE_NONE, NULL);
-	_object1.setPosition(Common::Point(62, 85));
-	_object1.changeZoom(100);
-
-	_object2.postInit();
-	_object2.setVisage(21);
-	_object2._strip = 2;
-	_object2._frame = 1;
-	_object2.animate(ANIM_MODE_NONE, NULL);
-	_object2.setPosition(Common::Point(27, 94));
-	_object2.changeZoom(100);
-
-	_object3.postInit();
-	_object3.setVisage(21);
-	_object3._strip = 2;
-	_object3._frame = 2;
-	_object3.animate(ANIM_MODE_NONE, NULL);
-	_object3.setPosition(Common::Point(68, 94));
-	_object3.changeZoom(100);
-
-	_object4.postInit();
-	_object4.setVisage(21);
-	_object4._strip = 2;
-	_object4._frame = 3;
-	_object4.animate(ANIM_MODE_NONE, NULL);
-	_object4.setPosition(Common::Point(110, 94));
-	_object4.changeZoom(100);
-
-	_object5.postInit();
-	_object5.setVisage(21);
-	_object5._strip = 2;
-	_object5._frame = 4;
-	_object5.animate(ANIM_MODE_NONE, NULL);
-	_object5.setPosition(Common::Point(154, 94));
-	_object5.changeZoom(100);
-
-	_object6.postInit();
-	_object6.setVisage(21);
-	_object6._strip = 2;
-	_object6._frame = 5;
-	_object6.animate(ANIM_MODE_NONE, NULL);
-	_object6.setPosition(Common::Point(199, 94));
-	_object6.changeZoom(100);
-
-	_object7.postInit();
-	_object7.setVisage(21);
-	_object7._strip = 2;
-	_object7._frame = 6;
-	_object7.animate(ANIM_MODE_NONE, NULL);
-	_object7.setPosition(Common::Point(244, 94));
-	_object7.changeZoom(100);
-
-	_object8.postInit();
-	_object8.setVisage(21);
-	_object8._strip = 2;
-	_object8._frame = 7;
-	_object8.animate(ANIM_MODE_NONE, NULL);
-	_object8.setPosition(Common::Point(286, 94));
-	_object8.changeZoom(100);
-
-	setAction(&_action1);
-}
-
-} // End of namespace tSage
diff --git a/engines/tsage/blueforce_scenes0.h b/engines/tsage/blueforce_scenes0.h
deleted file mode 100644
index 06f7912..0000000
--- a/engines/tsage/blueforce_scenes0.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* 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_BLUEFORCE_SCENES0_H
-#define TSAGE_BLUEFORCE_SCENES0_H
-
-#include "common/scummsys.h"
-#include "tsage/blueforce_logic.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"
-
-namespace tSage {
-
-class BF_Scene20 : public Scene {
-	/* Actions */
-	class Action1 : public Action {
-	private:
-		ASoundExt _sound;
-	public:
-		virtual void signal();
-	};
-public:
-	Action1 _action1;
-	ScenePalette _scenePalette;
-	SceneObject _object1, _object2, _object3, _object4;
-	SceneObject _object5, _object6, _object7, _object8;
-
-	virtual void postInit(SceneObjectList *OwnerList = NULL);
-};
-
-} // End of namespace tSage
-
-#endif
diff --git a/engines/tsage/blueforce_scenes1.cpp b/engines/tsage/blueforce_scenes1.cpp
deleted file mode 100644
index 81f7d0a..0000000
--- a/engines/tsage/blueforce_scenes1.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/config-manager.h"
-#include "tsage/blueforce_scenes1.h"
-#include "tsage/scenes.h"
-#include "tsage/tsage.h"
-#include "tsage/staticres.h"
-#include "tsage/globals.h"
-
-namespace tSage {
-
-/*--------------------------------------------------------------------------
- * Scene 100 - Tsunami Title Screen #2
- *
- *--------------------------------------------------------------------------*/
-
-void BF_Scene100::Action1::signal() {
-	static byte black[3] = { 0, 0, 0 };
-
-	switch (_actionIndex++) {
-	case 0:
-		_state = 0;
-		setDelay(6);
-		break;
-	case 1: {
-		Common::String msg1 = _resourceManager->getMessage(100, _state++);
-		if (!msg1.compareTo("LASTCREDIT")) {
-			Common::String msg2 = _resourceManager->getMessage(100, _state++);
-			setTextStrings(msg1, msg2, this);
-		} else {
-			setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this);
-			
-			Common::Point pt(_sceneText1._position.x, 80);
-			NpcMover *mover = new NpcMover();
-			_sceneText1.addMover(mover, &pt, this);
-		}
-		break;
-	}
-	case 2:
-		setDelay(600);
-		break;
-	case 3:
-		BF_GLOBALS._sound1.fade(0, 10, 10, 1, this);
-		GLOBALS._scenePalette.addFader(black, 1, 2, NULL);
-		break;
-	case 4:
-		error("??exit");
-		break;
-	}
-}
-
-void BF_Scene100::Action1::setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action) {
-	// Set data for first text control
-	_sceneText1._fontNumber = 10;
-	_sceneText1._width = 160;
-	_sceneText1._textMode = ALIGN_RIGHT;
-	_sceneText1._color1 = _globals->_fontColors.background;
-	_sceneText1._color2 = _globals->_fontColors.foreground;
-	_sceneText1._color3 = _globals->_fontColors.background;
-	_sceneText1.setup(msg1);
-	_sceneText1.setFrame2(-1);
-	_sceneText1.setPosition(Common::Point(
-		(SCREEN_WIDTH - _sceneText1.getFrame().getBounds().width()) / 2, 202));
-	_sceneText1._moveRate = 30;
-	_sceneText1._moveDiff.y = 1;
-
-	// Set data for second text control
-	_sceneText2._fontNumber = 10;
-	_sceneText2._width = _sceneText1._width;
-	_sceneText2._textMode = _sceneText1._textMode;
-	_sceneText2._color1 = _globals->_fontColors.background;
-	_sceneText2._color2 = _globals->_fontColors.foreground;
-	_sceneText2._color3 = _globals->_fontColors.background;
-	_sceneText2.setup(msg1);
-	_sceneText2.setFrame2(-1);
-	GfxSurface textSurface = _sceneText2.getFrame();
-	_sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202));
-	_sceneText2._moveRate = 30;
-	_sceneText2._moveDiff.y = 1;
-	
-	_textHeight = textSurface.getBounds().height();
-	int yp = -(_textHeight * 2);
-
-	Common::Point pt(_sceneText1._position.x, yp); 
-	NpcMover *mover = new NpcMover();
-	_sceneText1.addMover(mover, &pt, action); 
-}
-
-void BF_Scene100::Action2::signal() {
-	BF_Scene100 *scene = (BF_Scene100 *)_globals->_sceneManager._scene;
-	static byte black[3] = {0, 0, 0};
-
-	switch (_actionIndex++) {
-	case 0:
-		BF_GLOBALS._scenePalette.addFader(black, 1, -2, this);
-		break;
-	case 1:
-		setDelay(180);
-		break;
-	case 2: {
-		const char *SEEN_INTRO = "seen_intro";
-		if (!ConfMan.hasKey(SEEN_INTRO) || !ConfMan.getBool(SEEN_INTRO)) {
-			// First time being played, so will need to show the intro
-			ConfMan.setBool(SEEN_INTRO, true);
-			ConfMan.flushToDisk();
-		} else {
-			// Prompt user for whether to start play or watch introduction
-			_globals->_player.enableControl();
-
-			if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) {
-				// Signal to start the game
-				scene->_index = 190;
-				remove();
-				return;
-			}
-		}
-
-		// At this point the introduction needs to start
-		_globals->_scenePalette.addFader(black, 1, 2, this);
-		break;
-	}
-	case 3:
-		remove();
-		break;
-	}
-}
-
-/*--------------------------------------------------------------------------*/
-
-BF_Scene100::BF_Scene100(): Scene() {
-	_index = 0;
-}
-
-void BF_Scene100::postInit(SceneObjectList *OwnerList) {
-	BF_GLOBALS._scenePalette.loadPalette(2);
-	BF_GLOBALS._v51C44 = 1;
-	Scene::postInit();
-	BF_GLOBALS._v51C24 = 200;
-
-	_globals->_player.enableControl();
-	_globals->_player.hide();
-	_globals->_player.disableControl();
-	_index = 109;
-
-	if (BF_GLOBALS._v4CEA2 < 6) {
-		// Title
-		loadScene(100);
-		BF_GLOBALS._sound1.play(2);
-		setAction(&_action2, this);
-	} else {
-		// Credits
-		loadScene(101);
-		BF_GLOBALS._sound1.play(118);
-		setAction(&_action1, this);
-	}
-
-	loadScene(20);
-	setZoomPercents(60, 85, 200, 100);
-}
-
-void BF_Scene100::signal() {
-	++_sceneMode;
-	if (BF_GLOBALS._v4CEA2 < 6) {
-		BF_GLOBALS._scenePalette.clearListeners();
-		BF_GLOBALS._scenePalette.loadPalette(100);
-		BF_GLOBALS._sceneManager.changeScene(_index);
-	} else {
-		if (_sceneMode > 1)
-			BF_GLOBALS._events.setCursor(CURSOR_ARROW);
-
-		setAction(this, &_action1, this);
-	}
-}
-
-} // End of namespace tSage
diff --git a/engines/tsage/blueforce_scenes1.h b/engines/tsage/blueforce_scenes1.h
deleted file mode 100644
index d9fcc48..0000000
--- a/engines/tsage/blueforce_scenes1.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* 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_BLUEFORCE_SCENES1_H
-#define TSAGE_BLUEFORCE_SCENES1_H
-
-#include "common/scummsys.h"
-#include "tsage/blueforce_logic.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"
-
-namespace tSage {
-
-class BF_Scene100: public Scene {
-	/* Actions */
-	class Action1: public ActionExt {
-	private:
-		void setTextStrings(const Common::String &msg1, const Common::String &msg2, Action *action);
-	public:
-		SceneText _sceneText1, _sceneText2;
-		int _textHeight;
-
-		virtual Common::String getClassName() { return "BF100Action1"; }
-		virtual void synchronize(Serializer &s) {
-			ActionExt::synchronize(s);
-			s.syncAsSint16LE(_textHeight);
-		}
-		virtual void signal();
-	};
-	class Action2: public ActionExt {
-	public:
-		virtual Common::String getClassName() { return "BF100Action2"; }
-		virtual void signal();
-	};
-public:
-	SequenceManager _sequenceManager;
-	Action1 _action1;
-	Action2 _action2;
-	ScenePalette _scenePalette;
-	SceneObjectExt2 _object1, _object2, _object3, _object4, _object5;
-	int _index;
-
-	BF_Scene100();
-	virtual void postInit(SceneObjectList *OwnerList = NULL);
-	virtual void signal();
-};
-
-} // End of namespace tSage
-
-#endif
diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp
index 00cd61a..cae9639 100644
--- a/engines/tsage/debugger.cpp
+++ b/engines/tsage/debugger.cpp
@@ -23,7 +23,7 @@
 #include "tsage/debugger.h"
 #include "tsage/globals.h"
 #include "tsage/graphics.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
 
 namespace tSage {
 
diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp
index d315ce0..8a1b7c6 100644
--- a/engines/tsage/dialogs.cpp
+++ b/engines/tsage/dialogs.cpp
@@ -30,7 +30,7 @@
 #include "tsage/dialogs.h"
 #include "tsage/staticres.h"
 #include "tsage/globals.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_logic.h"
 
 namespace tSage {
 
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index e5572d9..39850cd 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -22,9 +22,9 @@
 
 #include "tsage/globals.h"
 #include "tsage/tsage.h"
-#include "tsage/blueforce_logic.h"
-#include "tsage/ringworld_demo.h"
-#include "tsage/ringworld_logic.h"
+#include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_logic.h"
 
 namespace tSage {
 
diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk
index 7ac1795..41078cd 100644
--- a/engines/tsage/module.mk
+++ b/engines/tsage/module.mk
@@ -1,9 +1,9 @@
 MODULE := engines/tsage
 
 MODULE_OBJS := \
-	blueforce_logic.o \
-	blueforce_scenes0.o \
-	blueforce_scenes1.o \
+	blue_force\blueforce_logic.o \
+	blue_force\blueforce_scenes0.o \
+	blue_force\blueforce_scenes1.o \
 	converse.o \
 	core.o \
 	debugger.o \
@@ -13,16 +13,16 @@ MODULE_OBJS := \
 	globals.o \
 	graphics.o \
 	resources.o \
-	ringworld_demo.o \
-	ringworld_logic.o \
-	ringworld_scenes1.o \
-	ringworld_scenes2.o \
-	ringworld_scenes3.o \
-	ringworld_scenes4.o \
-	ringworld_scenes5.o \
-	ringworld_scenes6.o \
-	ringworld_scenes8.o \
-	ringworld_scenes10.o \
+	ringworld\ringworld_demo.o \
+	ringworld\ringworld_logic.o \
+	ringworld\ringworld_scenes1.o \
+	ringworld\ringworld_scenes2.o \
+	ringworld\ringworld_scenes3.o \
+	ringworld\ringworld_scenes4.o \
+	ringworld\ringworld_scenes5.o \
+	ringworld\ringworld_scenes6.o \
+	ringworld\ringworld_scenes8.o \
+	ringworld\ringworld_scenes10.o \
 	saveload.o \
 	scenes.o \
 	sound.o \
diff --git a/engines/tsage/ringworld/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp
new file mode 100644
index 0000000..ce06df8
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_demo.cpp
@@ -0,0 +1,120 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+void RingworldDemoGame::start() {
+	// Start the demo's single scene
+	_globals->_sceneManager.changeScene(1);
+
+	_globals->_events.setCursor(CURSOR_NONE);
+}
+
+Scene *RingworldDemoGame::createScene(int sceneNumber) {
+	// The demo only has a single scene, so ignore the scene number and always return it
+	return new RingworldDemoScene();
+}
+
+void RingworldDemoGame::quitGame() {
+	if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0)
+		_vm->quitGame();
+}
+
+void RingworldDemoGame::pauseGame() {
+	_globals->_events.setCursor(CURSOR_ARROW);
+	MessageDialog *dlg = new MessageDialog(DEMO_PAUSED_MSG, EXIT_BTN_STRING, DEMO_RESUME_BTN_STRING);
+	dlg->draw();
+
+	GfxButton *selectedButton = dlg->execute(&dlg->_btn2);
+	bool exitFlag  =  selectedButton != &dlg->_btn2;
+
+	delete dlg;
+	_globals->_events.hideCursor();
+
+	if (exitFlag)
+		_vm->quitGame();
+}
+
+void RingworldDemoGame::processEvent(Event &event) {
+	if (event.eventType == EVENT_KEYPRESS) {
+		switch (event.kbd.keycode) {
+		case Common::KEYCODE_F1:
+			// F1 - Help
+			MessageDialog::show(DEMO_HELP_MSG, OK_BTN_STRING);
+			break;
+
+		case Common::KEYCODE_F2: {
+			// F2 - Sound Options
+			ConfigDialog *dlg = new ConfigDialog();
+			dlg->runModal();
+			delete dlg;
+			_globals->_soundManager.syncSounds();
+			_globals->_events.setCursorFromFlag();
+			break;
+		}
+
+		case Common::KEYCODE_F3:
+			// F3 - Quit
+			quitGame();
+			event.handled = false;
+			break;
+
+		default:
+			break;
+		}
+	} else if (event.eventType == EVENT_BUTTON_DOWN) {
+		pauseGame();
+		event.handled = true;
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Ringworld Demo scene
+ *
+ *--------------------------------------------------------------------------*/
+
+void RingworldDemoScene::postInit(SceneObjectList *OwnerList) {
+	signal();
+}
+
+void RingworldDemoScene::signal() {
+	_soundHandler.play(4);
+	_actor1.postInit();
+	_actor2.postInit();
+	_actor3.postInit();
+	_actor4.postInit();
+	_actor5.postInit();
+	_actor6.postInit();
+
+	setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL);
+}
+
+void RingworldDemoScene::process(Event &event) {
+
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h
new file mode 100644
index 0000000..3e7431e
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_demo.h
@@ -0,0 +1,59 @@
+/* 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_RINGWORLD_DEMO_H
+#define TSAGE_RINGWORLD_DEMO_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/sound.h"
+
+namespace tSage {
+
+class RingworldDemoGame: public Game {
+private:
+	void pauseGame();
+public:
+	virtual void start();
+	virtual Scene *createScene(int sceneNumber);
+	virtual void quitGame();
+	virtual void processEvent(Event &event);
+};
+
+class RingworldDemoScene: public Scene {
+public:
+	SequenceManager _sequenceManager;
+	SceneObject _actor1, _actor2, _actor3;
+	SceneObject _actor4, _actor5, _actor6;
+	ASound _soundHandler;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void process(Event &event);
+	virtual void signal();
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
new file mode 100644
index 0000000..99890c9
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -0,0 +1,1490 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "common/translation.h"
+#include "gui/saveload.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+#include "tsage/ringworld/ringworld_demo.h"
+#include "tsage/ringworld/ringworld_scenes1.h"
+#include "tsage/ringworld/ringworld_scenes2.h"
+#include "tsage/ringworld/ringworld_scenes3.h"
+#include "tsage/ringworld/ringworld_scenes4.h"
+#include "tsage/ringworld/ringworld_scenes5.h"
+#include "tsage/ringworld/ringworld_scenes6.h"
+#include "tsage/ringworld/ringworld_scenes8.h"
+#include "tsage/ringworld/ringworld_scenes10.h"
+
+namespace tSage {
+
+Scene *RingworldGame::createScene(int sceneNumber) {
+	switch (sceneNumber) {
+	/* Scene group 1 */
+	// Kziniti Palace (Introduction)
+	case 10: return new Scene10();
+	// Outer Space (Introduction)
+	case 15: return new Scene15();
+	// Cut-scenes for Ch'mee house in distance
+	case 20: return new Scene20();
+	// Outside Ch'mee residence
+	case 30: return new Scene30();
+	// Chmeee Home
+	case 40: return new Scene40();
+	// By Flycycles
+	case 50: return new Scene50();
+	// Flycycle controls
+	case 60: return new Scene60();
+	// Shipyard Entrance
+	case 90: return new Scene90();
+	// Ship Close-up
+	case 95: return new Scene95();
+	// Sunflower navigation sequence
+	case 6100: return new Scene6100();
+
+	/* Scene group 2 */
+	// Title screen
+	case 1000: return new Scene1000();
+	// Fleeing planet cutscene
+	case 1001: return new Scene1001();
+	// Unused
+	case 1250: return new Scene1250();
+	// Ringworld Wall
+	case 1400: return new Scene1400();
+	// Ringworld Space-port
+	case 1500: return new Scene1500();
+
+	/* Scene group 3 - Part #1 */
+	// Cockpit cutscenes
+	case 2000: return new Scene2000();
+	// Starcraft - Cockpit
+	case 2100: return new Scene2100();
+	// Encyclopedia
+	case 2120: return new Scene2120();
+	// Starcraft - Level 2
+	case 2150: return new Scene2150();
+	// Starcraft - AutoDoc
+	case 2200: return new Scene2200();
+	// Stasis Field Map
+	case 2222: return new Scene2222();
+	// Starcraft - Quinn's Room
+	case 2230: return new Scene2230();
+
+	/* Scene group 3 - Part #2 */
+	// Starcraft - Storage Room
+	case 2280: return new Scene2280();
+	// Starcraft - Hanger Bay
+	case 2300: return new Scene2300();
+	// Starcraft - Copy Protection Screen
+	case 2310: return new Scene2310();
+	// Starcraft - Lander Bay
+	case 2320: return new Scene2320();
+	// Scene 2400 - Descending in Lander
+	case 2400: return new Scene2400();
+
+	/* Scene group 4 */
+	// Ringworld Scan
+	case 3500: return new Scene3500();
+	// Remote Viewer
+	case 3700: return new Scene3700();
+
+	/* Scene group 5 */
+	// Village
+	case 4000: return new Scene4000();
+	// Village - Outside Lander
+	case 4010: return new Scene4010();
+	// Village - Puzzle Board
+	case 4025: return new Scene4025();
+	// Village - Temple Antechamber
+	case 4045: return new Scene4045();
+	// Village - Temple
+	case 4050: return new Scene4050();
+	// Village - Hut
+	case 4100: return new Scene4100();
+	// Village - Bedroom
+	case 4150: return new Scene4150();
+	// Village - Near Slaver Ship
+	case 4250: return new Scene4250();
+	// Village - Slaver Ship
+	case 4300: return new Scene4300();
+	// Village - Slaver Ship Keypad
+	case 4301: return new Scene4301();
+
+	/* Scene group 6 */
+	// Caverns - Entrance
+	case 5000: return new Scene5000();
+	// Caverns
+	case 5100: return new Scene5100();
+	// Caverns - Throne-room
+	case 5200: return new Scene5200();
+	// Caverns - Pit
+	case 5300: return new Scene5300();
+
+	/* Scene group 8 */
+	// Landing near beach
+	case 7000: return new Scene7000();
+	// Underwater: swimming
+	case 7100: return new Scene7100();
+	// Underwater: Entering the cave
+	case 7200: return new Scene7200();
+	// Underwater: Lord Poria
+	case 7300: return new Scene7300();
+	// Floating Buildings: Outside
+	case 7600: return new Scene7600();
+	// Floating Buildings: In the lab
+	case 7700: return new Scene7700();
+
+	/* Scene group 10 */
+	// Near beach: Slave washing clothes
+	case 9100: return new Scene9100();
+	// Castle: Outside the bulwarks
+	case 9150: return new Scene9150();
+	// Castle: Near the fountain
+	case 9200: return new Scene9200();
+	// Castle: In front of a large guarded door
+	case 9300: return new Scene9300();
+	// Castle: In a hallway
+	case 9350: return new Scene9350();
+	// Castle: In a hallway
+	case 9360: return new Scene9360();
+	// Castle: Black-Smith room
+	case 9400: return new Scene9400();
+	// Castle: Dining room
+	case 9450: return new Scene9450();
+	// Castle: Bedroom
+	case 9500: return new Scene9500();
+	// Castle: Balcony
+	case 9700: return new Scene9700();
+	// Castle: In the garden
+	case 9750: return new Scene9750();
+	// Castle: Dressing room
+	case 9850: return new Scene9850();
+	// Ending
+	case 9900: return new Scene9900();
+	// Space travel
+	case 9999: return new Scene9999();
+
+	default:
+		error("Unknown scene number - %d", sceneNumber);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayHotspot::DisplayHotspot(int regionId, ...) {
+	_sceneRegionId = regionId;
+
+	// Load up the actions
+	va_list va;
+	va_start(va, regionId);
+
+	int param = va_arg(va, int);
+	while (param != LIST_END) {
+		_actions.push_back(param);
+		param = va_arg(va, int);
+	}
+
+	va_end(va);
+}
+
+bool DisplayHotspot::performAction(int action) {
+	for (uint i = 0; i < _actions.size(); i += 3) {
+		if (_actions[i] == action) {
+			display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+			return true;
+		}
+	}
+
+	return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+DisplayObject::DisplayObject(int firstAction, ...) {
+	// Load up the actions
+	va_list va;
+	va_start(va, firstAction);
+
+	int param = firstAction;
+	while (param != LIST_END) {
+		_actions.push_back(param);
+		param = va_arg(va, int);
+	}
+
+	va_end(va);
+}
+
+bool DisplayObject::performAction(int action) {
+	for (uint i = 0; i < _actions.size(); i += 3) {
+		if (_actions[i] == action) {
+			display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+			return true;
+		}
+	}
+
+	return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SceneArea::SceneArea() {
+	_savedArea = NULL;
+	_pt.x = _pt.y = 0;
+}
+
+SceneArea::~SceneArea() {
+	delete _savedArea;
+}
+
+void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) {
+	_resNum = resNum;
+	_rlbNum = rlbNum;
+	_subNum = subNum;
+	_actionId = actionId;
+
+	_surface = surfaceFromRes(resNum, rlbNum, subNum);
+}
+
+void SceneArea::draw2() {
+	_surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::display() {
+	_bounds.left = _pt.x - (_surface.getBounds().width() / 2);
+	_bounds.top = _pt.y + 1 - _surface.getBounds().height();
+	_bounds.setWidth(_surface.getBounds().width());
+	_bounds.setHeight(_surface.getBounds().height());
+
+	_savedArea = Surface_getArea(_globals->_gfxManagerInstance.getSurface(), _bounds);
+	draw2();
+}
+
+void SceneArea::restore() {
+	assert(_savedArea);
+	_savedArea->draw(Common::Point(_bounds.left, _bounds.top));
+	delete _savedArea;
+	_savedArea = NULL;
+}
+
+void SceneArea::draw(bool flag) {
+	_surface = surfaceFromRes(_resNum, _rlbNum, flag ? _subNum + 1 : _subNum);
+	_surface.draw(Common::Point(_bounds.left, _bounds.top));
+}
+
+void SceneArea::wait() {
+	// Wait until a mouse or keypress
+	Event event;
+	while (!_vm->shouldQuit() && !_globals->_events.getEvent(event)) {
+		g_system->updateScreen();
+		g_system->delayMillis(10);
+	}
+
+	SynchronizedList<SceneItem *>::iterator ii;
+	for (ii = _globals->_sceneItems.begin(); ii != _globals->_sceneItems.end(); ++ii) {
+		SceneItem *sceneItem = *ii;
+		if (sceneItem->contains(event.mousePos)) {
+			sceneItem->doAction(_actionId);
+			break;
+		}
+	}
+
+	_globals->_events.setCursor(CURSOR_ARROW);
+}
+
+void SceneArea::synchronize(Serializer &s) {
+	if (s.getVersion() >= 2)
+		SavedObject::synchronize(s);
+
+	s.syncAsSint16LE(_pt.x);
+	s.syncAsSint16LE(_pt.y);
+	s.syncAsSint32LE(_resNum);
+	s.syncAsSint32LE(_rlbNum);
+	s.syncAsSint32LE(_subNum);
+	s.syncAsSint32LE(_actionId);
+	_bounds.synchronize(s);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGText::SpeakerGText() {
+	_speakerName = "GTEXT";
+	_textWidth = 160;
+	_textPos = Common::Point(130, 10);
+	_color1 = 42;
+	_hideObjects = false;
+}
+
+void SpeakerGText::setText(const Common::String &msg) {
+	// Set the animation properties
+	_sceneObject.postInit();
+	_sceneObject.setVisage(9405);
+	_sceneObject.setStrip2(3);
+	_sceneObject.fixPriority(255);
+	_sceneObject.changeZoom(100);
+	_sceneObject._frame = 1;
+	_sceneObject.setPosition(Common::Point(183, 71));
+	_sceneObject.animate(ANIM_MODE_7, 0, NULL);
+
+	// Set the text
+	Rect textRect;
+	_globals->gfxManager()._font.getStringBounds(msg.c_str(), textRect, _textWidth);
+	textRect.center(_sceneObject._position.x, _sceneObject._position.y);
+	_textPos.x = textRect.left;
+	Speaker::setText(msg);
+}
+
+void SpeakerGText::removeText() {
+	_sceneObject.remove();
+	Speaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPOR::SpeakerPOR() {
+	_speakerName = "POR";
+	_newSceneNumber = 7221;
+	_textPos = Common::Point(10, 30);
+	_color1 = 41;
+}
+
+void SpeakerPOR::SpeakerAction1::signal(){
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(_globals->_randomSource.getRandomNumber(60) + 60);
+		break;
+	case 1:
+		static_cast<SceneObject *>(_owner)->animate(ANIM_MODE_5, this, NULL);
+		break;
+	case 2:
+		setDelay(_globals->_randomSource.getRandomNumber(10));
+		_actionIndex = 0;
+		break;
+	default:
+		break;
+	}
+}
+
+void SpeakerPOR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(7223);
+	_object1.setStrip2(2);
+	_object1.setPosition(Common::Point(191, 166));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(7223);
+	_object2.setPosition(Common::Point(159, 86));
+	_object2.setAction(&_speakerAction, NULL);
+
+	_object3.postInit(&_objectList);
+	_object3.setVisage(7223);
+	_object3.setStrip(3);
+	_object3.setPosition(Common::Point(119, 107));
+	_object3.fixPriority(199);
+	_object3.setAction(&_action2);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerOR::SpeakerOR() {
+	_speakerName = "OR";
+	_newSceneNumber = 9430;
+	_textPos = Common::Point(8, 36);
+	_color1 = 42;
+	_textWidth = 136;
+}
+
+void SpeakerOR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(9431);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(202, 147));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(9431);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.setZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(199, 85));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerOText::SpeakerOText() : SpeakerGText() {
+	_speakerName = "OTEXT";
+	_textWidth = 240;
+	_textPos = Common::Point(130, 10);
+	_color1 = 42;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQText::SpeakerQText() : ScreenSpeaker() {
+	_speakerName = "QTEXT";
+	_textPos = Common::Point(160, 40);
+	_color1 = 35;
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSText::SpeakerSText() : ScreenSpeaker() {
+	_speakerName = "STEXT";
+	_color1 = 13;
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPOText::SpeakerPOText() : ScreenSpeaker() {
+	_speakerName = "POTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 41;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerMText::SpeakerMText() {
+	_speakerName = "MTEXT";
+	_color1 = 22;
+	_textWidth = 230;
+	_textMode = ALIGN_CENTER;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCText::SpeakerCText() {
+	_speakerName = "CTEXT";
+	_color1 = 4;
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerEText::SpeakerEText() {
+	_speakerName = "ETEXT";
+	_textPos = Common::Point(20, 20);
+	_color1 = 22;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGR::SpeakerGR() : AnimatedSpeaker() {
+	_speakerName = "GR";
+	_newSceneNumber = 9220;
+	_textWidth = 136;
+	_textPos = Common::Point(168, 36);
+	_color1 = 14;
+}
+
+void SpeakerGR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(9221);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(101, 70));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerHText::SpeakerHText() {
+	_speakerName = "HTEXT";
+	_textPos = Common::Point(160, 40);
+	_color1 = 52;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSKText::SpeakerSKText() : ScreenSpeaker() {
+	_speakerName = "SKTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 9;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPText::SpeakerPText() {
+	_speakerName = "PTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 5;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFText::SpeakerCHFText() {
+	_speakerName = "CHFTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 56;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDRText::SpeakerCDRText() {
+	_speakerName = "CDRTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 52;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerFLText::SpeakerFLText() {
+	_speakerName = "FLTEXT";
+	_textPos = Common::Point(10, 40);
+	_color1 = 17;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerBatText::SpeakerBatText() {
+	_speakerName = "BATTEXT";
+	_textWidth = 240;
+	_textMode = ALIGN_CENTER;
+	_color1 = 3;
+	_hideObjects = false;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSKL::SpeakerSKL() : AnimatedSpeaker() {
+	_speakerName = "SKL";
+	_newSceneNumber = 7011;
+	_textPos = Common::Point(10, 30);
+	_color1 = 9;
+}
+
+void SpeakerSKL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(7013);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(203, 120));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(7013);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(197, 80));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQL::SpeakerQL() : AnimatedSpeaker() {
+	_speakerName = "QL";
+	_newSceneNumber = 2610;
+	_textPos = Common::Point(160, 30);
+	_color1 = 35;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerQL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2612);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(128, 146));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2612);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(122, 84));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSR::SpeakerSR() {
+	_speakerName = "SR";
+	_newSceneNumber = 2811;
+	_textPos = Common::Point(10, 30);
+	_color1 = 13;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerSR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2813);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(224, 198));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2813);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(203, 96));
+	_object2.setAction(&_speakerAction, NULL);
+
+	_object3.postInit(&_objectList);
+	_object3.setVisage(2813);
+	_object3.setStrip(3);
+	_object3.setPosition(Common::Point(204, 91));
+	_object3.fixPriority(199);
+	_object3._numFrames = 3;
+	_object3.animate(ANIM_MODE_7, 0, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSL::SpeakerSL() {
+	_speakerName = "SL";
+	_newSceneNumber = 2810;
+	_textPos = Common::Point(140, 30);
+	_textWidth = 160;
+	_color1 = 13;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerSL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2812);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(95, 198));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2812);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(116, 96));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQR::SpeakerQR() {
+	_speakerName = "QR";
+	_newSceneNumber = 2611;
+	_textPos = Common::Point(10, 30);
+	_color1 = 35;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerQR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2613);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(191, 146));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2613);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(197, 84));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerQU::SpeakerQU() {
+	_speakerName = "QU";
+	_newSceneNumber = 7020;
+	_textPos = Common::Point(160, 30);
+	_color1 = 35;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerQU::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(7021);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(116, 120));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(7021);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(111, 84));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCR::SpeakerCR() {
+	_speakerName = "CR";
+	_newSceneNumber = 9010;
+	_textPos = Common::Point(20, 40);
+	_color1 = 4;
+}
+
+void SpeakerCR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(9011);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.setPosition(Common::Point(219, 168));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(9011);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.setPosition(Common::Point(232, 81));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerMR::SpeakerMR() {
+	_speakerName = "MR";
+	_newSceneNumber = 2711;
+	_textPos = Common::Point(10, 40);
+	_color1 = 22;
+}
+
+void SpeakerMR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2713);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(220, 143));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2713);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(215, 99));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSAL::SpeakerSAL() {
+	_speakerName = "SAL";
+	_newSceneNumber = 2851;
+	_textPos = Common::Point(10, 30);
+	_color1 = 13;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerSAL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2853);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(185, 200));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2853);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(170, 92));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerML::SpeakerML() {
+	_speakerName = "ML";
+	_newSceneNumber = 2710;
+	_textPos = Common::Point(160, 40);
+	_color1 = 22;
+}
+
+void SpeakerML::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(2712);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(99, 143));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(2712);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(105, 99));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFL::SpeakerCHFL() {
+	_speakerName = "CHFL";
+	_newSceneNumber = 4111;
+	_textPos = Common::Point(10, 40);
+	_color1 = 56;
+}
+
+void SpeakerCHFL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4113);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(205, 116));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4113);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(202, 71));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCHFR::SpeakerCHFR() {
+	_speakerName = "CHFR";
+	_newSceneNumber = 4110;
+	_textPos = Common::Point(160, 40);
+	_color1 = 56;
+}
+
+void SpeakerCHFR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4112);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(103, 116));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4112);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(106, 71));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPL::SpeakerPL() {
+	_speakerName = "PL";
+	_newSceneNumber = 4060;
+	_textPos = Common::Point(160, 40);
+	_color1 = 5;
+}
+
+void SpeakerPL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4062);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(107, 117));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4062);
+	_object2.setStrip2(1);
+	_object2.fixPriority(200);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(105, 62));
+	_object2.setAction(&_speakerAction, NULL);
+
+	_object3.postInit(&_objectList);
+	_object3.setVisage(4062);
+	_object3.setStrip2(3);
+	_object3.fixPriority(255);
+	_object3.changeZoom(100);
+	_object3._frame = 1;
+	_object3.setPosition(Common::Point(105, 59));
+	_object3.setAction(&_speakerAction2, NULL);
+
+	Speaker::setText(msg);
+}
+
+void SpeakerPL::removeText() {
+	_object3.remove();
+	AnimatedSpeaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerPR::SpeakerPR() {
+	_speakerName = "PR";
+	_newSceneNumber = 4061;
+	_textPos = Common::Point(10, 40);
+	_color1 = 5;
+}
+
+void SpeakerPR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4063);
+	_object1.setStrip2(1);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(212, 117));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4063);
+	_object2.setStrip2(2);
+	_object2.fixPriority(200);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(214, 62));
+	_object2.setAction(&_speakerAction, NULL);
+
+	_object3.postInit(&_objectList);
+	_object3.setVisage(4063);
+	_object3.setStrip2(3);
+	_object3.fixPriority(255);
+	_object3.changeZoom(100);
+	_object3._frame = 1;
+	_object3.setPosition(Common::Point(214, 59));
+	_object3.setAction(&_speakerAction2, NULL);
+
+	Speaker::setText(msg);
+}
+
+void SpeakerPR::removeText() {
+	_object3.remove();
+	AnimatedSpeaker::removeText();
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDR::SpeakerCDR() {
+	_speakerName = "CDR";
+	_newSceneNumber = 4161;
+	_textPos = Common::Point(10, 40);
+	_color1 = 52;
+}
+
+void SpeakerCDR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4163);
+	_object1.setStrip2(1);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(208, 97));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4163);
+	_object2.setStrip2(2);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(200, 57));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerCDL::SpeakerCDL() {
+	_speakerName = "CDL";
+	_newSceneNumber = 4160;
+	_textPos = Common::Point(160, 40);
+	_color1 = 52;
+}
+
+void SpeakerCDL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(4162);
+	_object1.setStrip2(1);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(112, 97));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(4162);
+	_object2.setStrip2(2);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(115, 57));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerFLL::SpeakerFLL() {
+	_speakerName = "FLL";
+	_newSceneNumber = 5221;
+	_textPos = Common::Point(10, 40);
+	_color1 = 17;
+}
+
+void SpeakerFLL::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(5223);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(216, 129));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(5223);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(210, 67));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerBatR::SpeakerBatR() {
+	_speakerName = "BATR";
+	_newSceneNumber = 5360;
+	_textPos = Common::Point(140, 40);
+	_color1 = 3;
+}
+
+void SpeakerBatR::setText(const Common::String &msg) {
+	_object1.postInit(&_objectList);
+	_object1.setVisage(5361);
+	_object1.setStrip2(2);
+	_object1.fixPriority(255);
+	_object1.changeZoom(100);
+	_object1._frame = 1;
+	_object1.setPosition(Common::Point(137, 122));
+	_object1.animate(ANIM_MODE_7, 0, NULL);
+
+	_object2.postInit(&_objectList);
+	_object2.setVisage(5361);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object2.changeZoom(100);
+	_object2._frame = 1;
+	_object2.setPosition(Common::Point(137, 104));
+	_object2.setAction(&_speakerAction, NULL);
+
+	Speaker::setText(msg);
+}
+
+/*--------------------------------------------------------------------------*/
+
+RingworldInvObjectList::RingworldInvObjectList() :
+		_stunner(2280, 1, 2, OBJECT_STUNNER, "This is your stunner."),
+		_scanner(1, 1, 3, OBJECT_SCANNER, "A combination scanner comm unit."),
+		_stasisBox(5200, 1, 4, OBJECT_STASIS_BOX, "A stasis box."),
+		_infoDisk(40, 1, 1, OBJECT_INFODISK, "The infodisk you took from the assassin."),
+		_stasisNegator(0, 2, 2, OBJECT_STASIS_NEGATOR, "The stasis field negator."),
+		_keyDevice(4250, 1, 6, OBJECT_KEY_DEVICE, "A magnetic key device."),
+		_medkit(2280, 1, 7, OBJECT_MEDKIT,  "Your medkit."),
+		_ladder(4100, 1, 8, OBJECT_LADDER, "The chief's ladder."),
+		_rope(4150, 1, 9, OBJECT_ROPE, "The chief's rope."),
+		_key(7700, 1, 11, OBJECT_KEY, "A key."),
+		_translator(7700, 1, 13, OBJECT_TRANSLATOR,  "The dolphin translator box."),
+		_ale(2150, 1, 10, OBJECT_ALE, "A bottle of ale."),
+		_paper(7700, 1, 12, OBJECT_PAPER, "A slip of paper with the numbers 2,4, and 3 written on it."),
+		_waldos(0, 1, 14, OBJECT_WALDOS, "A pair of waldos from the ruined probe."),
+		_stasisBox2(8100, 1, 4, OBJECT_STASIS_BOX2, "A stasis box."),
+		_ring(8100, 2, 5, OBJECT_RING, "This is a signet ring sent to you by Louis Wu."),
+		_cloak(9850, 2, 6, OBJECT_CLOAK, "A fine silk cloak."),
+		_tunic(9450, 2, 7, OBJECT_TUNIC, "The patriarch's soiled tunic."),
+		_candle(9500, 2, 8, OBJECT_CANDLE, "A tallow candle."),
+		_straw(9400, 2, 9, OBJECT_STRAW, "Clean, dry straw."),
+		_scimitar(9850, 1, 18, OBJECT_SCIMITAR, "A scimitar from the Patriarch's closet."),
+		_sword(9850, 1, 17, OBJECT_SWORD, "A short sword from the Patriarch's closet."),
+		_helmet(9500, 2, 4, OBJECT_HELMET, "Some type of helmet."),
+		_items(4300, 2, 10, OBJECT_ITEMS, "Two interesting items from the Tnuctipun vessel."),
+		_concentrator(4300, 2, 11, OBJECT_CONCENTRATOR, "The Tnuctipun anti-matter concentrator contained in a stasis field."),
+		_nullifier(5200, 2, 12, OBJECT_NULLIFIER, "A purported neural wave nullifier."),
+		_peg(4045, 2, 16, OBJECT_PEG, "A peg with a symbol."),
+		_vial(5100, 2, 17, OBJECT_VIAL, "A vial of the bat creatures anti-pheromone drug."),
+		_jacket(9850, 3, 1, OBJECT_JACKET, "A natty padded jacket."),
+		_tunic2(9850, 3, 2, OBJECT_TUNIC2, "A very hairy tunic."),
+		_bone(5300, 3, 5, OBJECT_BONE, "A very sharp bone."),
+		_jar(7700, 3, 4, OBJECT_JAR, "An jar filled with a green substance."),
+		_emptyJar(7700, 3, 3, OBJECT_EMPTY_JAR, "An empty jar.") {
+
+	// Add the items to the list
+	_itemList.push_back(&_stunner);
+	_itemList.push_back(&_scanner);
+	_itemList.push_back(&_stasisBox);
+	_itemList.push_back(&_infoDisk);
+	_itemList.push_back(&_stasisNegator);
+	_itemList.push_back(&_keyDevice);
+	_itemList.push_back(&_medkit);
+	_itemList.push_back(&_ladder);
+	_itemList.push_back(&_rope);
+	_itemList.push_back(&_key);
+	_itemList.push_back(&_translator);
+	_itemList.push_back(&_ale);
+	_itemList.push_back(&_paper);
+	_itemList.push_back(&_waldos);
+	_itemList.push_back(&_stasisBox2);
+	_itemList.push_back(&_ring);
+	_itemList.push_back(&_cloak);
+	_itemList.push_back(&_tunic);
+	_itemList.push_back(&_candle);
+	_itemList.push_back(&_straw);
+	_itemList.push_back(&_scimitar);
+	_itemList.push_back(&_sword);
+	_itemList.push_back(&_helmet);
+	_itemList.push_back(&_items);
+	_itemList.push_back(&_concentrator);
+	_itemList.push_back(&_nullifier);
+	_itemList.push_back(&_peg);
+	_itemList.push_back(&_vial);
+	_itemList.push_back(&_jacket);
+	_itemList.push_back(&_tunic2);
+	_itemList.push_back(&_bone);
+	_itemList.push_back(&_jar);
+	_itemList.push_back(&_emptyJar);
+
+	_selectedItem = NULL;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void RingworldGame::restartGame() {
+	if (MessageDialog::show(RESTART_MSG, CANCEL_BTN_STRING, RESTART_BTN_STRING) == 1)
+		_globals->_game->restart();
+}
+
+void RingworldGame::saveGame() {
+	if (!_vm->canSaveGameStateCurrently())
+		MessageDialog::show(SAVING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+	else {
+		// Show the save dialog
+		handleSaveLoad(true, _globals->_sceneHandler._saveGameSlot, _globals->_sceneHandler._saveName);
+	}
+}
+
+void RingworldGame::restoreGame() {
+	if (!_vm->canLoadGameStateCurrently())
+		MessageDialog::show(RESTORING_NOT_ALLOWED_MSG, OK_BTN_STRING);
+	else {
+		// Show the load dialog
+		handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
+	}
+}
+
+void RingworldGame::quitGame() {
+	if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1)
+		_vm->quitGame();
+}
+
+void RingworldGame::handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName) {
+	const EnginePlugin *plugin = 0;
+	EngineMan.findGame(_vm->getGameId(), &plugin);
+	GUI::SaveLoadChooser *dialog;
+	if (saveFlag)
+		dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"));
+	else
+		dialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
+
+	dialog->setSaveMode(saveFlag);
+
+	saveSlot = dialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
+	saveName = dialog->getResultString();
+
+	delete dialog;
+}
+
+void RingworldGame::start() {
+	// Set some default flags
+	_globals->setFlag(12);
+	_globals->setFlag(34);
+
+	// Set the screen to scroll in response to the player moving off-screen
+	_globals->_scrollFollower = &_globals->_player;
+
+	// Set the object's that will be in the player's inventory by default
+	RING_INVENTORY._stunner._sceneNumber = 1;
+	RING_INVENTORY._scanner._sceneNumber = 1;
+	RING_INVENTORY._ring._sceneNumber = 1;
+
+	int slot = -1;
+
+	if (ConfMan.hasKey("save_slot")) {
+		slot = ConfMan.getInt("save_slot");
+		Common::String file = _vm->generateSaveName(slot);
+		Common::InSaveFile *in = _vm->_system->getSavefileManager()->openForLoading(file);
+		if (in)
+			delete in;
+		else
+			slot = -1;
+	}
+
+	if (slot >= 0)
+		_globals->_sceneHandler._loadGameSlot = slot;
+	else
+		// Switch to the title screen
+		_globals->_sceneManager.setNewScene(1000);
+
+	_globals->_events.showCursor();
+}
+
+void RingworldGame::restart() {
+	_globals->_scenePalette.clearListeners();
+	_globals->_soundHandler.stop();
+
+	// Reset the flags
+	_globals->reset();
+	_globals->setFlag(34);
+
+	// Clear save/load slots
+	_globals->_sceneHandler._saveGameSlot = -1;
+	_globals->_sceneHandler._loadGameSlot = -1;
+
+	_globals->_stripNum = 0;
+	_globals->_events.setCursor(CURSOR_WALK);
+
+	// Reset item properties
+	RING_INVENTORY._stunner._sceneNumber = 1;
+	RING_INVENTORY._scanner._sceneNumber = 1;
+	RING_INVENTORY._stasisBox._sceneNumber = 5200;
+	RING_INVENTORY._infoDisk._sceneNumber = 40;
+	RING_INVENTORY._stasisNegator._sceneNumber = 0;
+	RING_INVENTORY._keyDevice._sceneNumber = 0;
+	RING_INVENTORY._medkit._sceneNumber = 2280;
+	RING_INVENTORY._ladder._sceneNumber = 4100;
+	RING_INVENTORY._rope._sceneNumber = 4150;
+	RING_INVENTORY._key._sceneNumber = 7700;
+	RING_INVENTORY._translator._sceneNumber = 2150;
+	RING_INVENTORY._paper._sceneNumber = 7700;
+	RING_INVENTORY._waldos._sceneNumber = 0;
+	RING_INVENTORY._ring._sceneNumber = 1;
+	RING_INVENTORY._stasisBox2._sceneNumber = 8100;
+	RING_INVENTORY._cloak._sceneNumber = 9850;
+	RING_INVENTORY._tunic._sceneNumber = 9450;
+	RING_INVENTORY._candle._sceneNumber = 9500;
+	RING_INVENTORY._straw._sceneNumber = 9400;
+	RING_INVENTORY._scimitar._sceneNumber = 9850;
+	RING_INVENTORY._sword._sceneNumber = 9850;
+	RING_INVENTORY._helmet._sceneNumber = 9500;
+	RING_INVENTORY._items._sceneNumber = 4300;
+	RING_INVENTORY._concentrator._sceneNumber = 4300;
+	RING_INVENTORY._nullifier._sceneNumber = 4300;
+	RING_INVENTORY._peg._sceneNumber = 4045;
+	RING_INVENTORY._vial._sceneNumber = 5100;
+	RING_INVENTORY._jacket._sceneNumber = 9850;
+	RING_INVENTORY._tunic2._sceneNumber = 9850;
+	RING_INVENTORY._bone._sceneNumber = 5300;
+	RING_INVENTORY._jar._sceneNumber = 7700;
+	RING_INVENTORY._emptyJar._sceneNumber = 7700;
+	RING_INVENTORY._selectedItem = NULL;
+
+	// Change to the first game scene
+	_globals->_sceneManager.changeScene(30);
+}
+
+void RingworldGame::endGame(int resNum, int lineNum) {
+	_globals->_events.setCursor(CURSOR_WALK);
+	Common::String msg = _resourceManager->getMessage(resNum, lineNum);
+	bool savesExist = _saver->savegamesExist();
+
+	if (!savesExist) {
+		// No savegames exist, so prompt the user to restart or quit
+		if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0)
+			_vm->quitGame();
+		else
+			restart();
+	} else {
+		// Savegames exist, so prompt for Restore/Restart
+		bool breakFlag;
+		do {
+			if (_vm->shouldQuit()) {
+				breakFlag = true;
+			} else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) {
+				restart();
+				breakFlag = true;
+			} else {
+				handleSaveLoad(false, _globals->_sceneHandler._loadGameSlot, _globals->_sceneHandler._saveName);
+				breakFlag = _globals->_sceneHandler._loadGameSlot >= 0;
+			}
+		} while (!breakFlag);
+	}
+
+	_globals->_events.setCursorFromFlag();
+}
+
+void RingworldGame::processEvent(Event &event) {
+	if (event.eventType == EVENT_KEYPRESS) {
+		switch (event.kbd.keycode) {
+		case Common::KEYCODE_F1:
+			// F1 - Help
+			MessageDialog::show(HELP_MSG, OK_BTN_STRING);
+			break;
+
+		case Common::KEYCODE_F2: {
+			// F2 - Sound Options
+			ConfigDialog *dlg = new ConfigDialog();
+			dlg->runModal();
+			delete dlg;
+			_globals->_soundManager.syncSounds();
+			_globals->_events.setCursorFromFlag();
+			break;
+		}
+
+		case Common::KEYCODE_F3:
+			// F3 - Quit
+			quitGame();
+			event.handled = false;
+			break;
+
+		case Common::KEYCODE_F4:
+			// F4 - Restart
+			restartGame();
+			_globals->_events.setCursorFromFlag();
+			break;
+
+		case Common::KEYCODE_F7:
+			// F7 - Restore
+			restoreGame();
+			_globals->_events.setCursorFromFlag();
+			break;
+
+		case Common::KEYCODE_F10:
+			// F10 - Pause
+			GfxDialog::setPalette();
+			MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING);
+			_globals->_events.setCursorFromFlag();
+			break;
+
+		default:
+			break;
+		}
+	}
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
new file mode 100644
index 0000000..19b0f10
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -0,0 +1,461 @@
+/* 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_RINGWORLD_LOGIC_H
+#define TSAGE_RINGWORLD_LOGIC_H
+
+#include "common/scummsys.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+#define ADD_PLAYER_MOVER(X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+	_globals->_player.addMover(mover, &pt, this); }
+#define ADD_PLAYER_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+	OBJ.addMover(mover, &pt, NULL); }
+#define ADD_PLAYER_MOVER_THIS(OBJ, X, Y) { Common::Point pt(X, Y); PlayerMover *mover = new PlayerMover(); \
+	OBJ.addMover(mover, &pt, this); }
+
+#define ADD_MOVER(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+	OBJ.addMover(mover, &pt, this); }
+#define ADD_MOVER_NULL(OBJ, X, Y) { Common::Point pt(X, Y); NpcMover *mover = new NpcMover(); \
+	OBJ.addMover(mover, &pt, NULL); }
+
+
+class SceneFactory {
+public:
+	static Scene *createScene(int sceneNumber);
+};
+
+class DisplayHotspot : public SceneObject {
+private:
+	Common::Array<int> _actions;
+	bool performAction(int action);
+public:
+	DisplayHotspot(int regionId, ...);
+
+	virtual void doAction(int action) {
+		if (!performAction(action))
+			SceneHotspot::doAction(action);
+	}
+};
+
+class DisplayObject : public SceneObject {
+private:
+	Common::Array<int> _actions;
+	bool performAction(int action);
+public:
+	DisplayObject(int firstAction, ...);
+
+	virtual void doAction(int action) {
+		if (!performAction(action))
+			SceneHotspot::doAction(action);
+	}
+};
+
+class SceneArea : public SavedObject {
+public:
+	GfxSurface _surface;
+	GfxSurface *_savedArea;
+	Common::Point _pt;
+	int _resNum;
+	int _rlbNum;
+	int _subNum;
+	int _actionId;
+	Rect _bounds;
+public:
+	SceneArea();
+	~SceneArea();
+
+	void setup(int resNum, int rlbNum, int subNum, int actionId);
+	void draw2();
+	void display();
+	void restore();
+
+	virtual void synchronize(Serializer &s);
+	virtual void draw(bool flag);
+	virtual void wait();
+};
+
+/*--------------------------------------------------------------------------*/
+// Ringworld specific game speakers
+
+class SpeakerGText : public Speaker {
+public:
+	SceneObject _sceneObject;
+public:
+	SpeakerGText();
+
+	virtual Common::String getClassName() { return "SpeakerGText"; }
+	virtual void setText(const Common::String &msg);
+	virtual void removeText();
+};
+
+class SpeakerPOR : public AnimatedSpeaker {
+	class SpeakerAction1 : public SpeakerAction {
+	public:
+		virtual void signal();
+	};
+
+public:
+	SceneObject _object3;
+	SpeakerAction1 _action2;
+public:
+	SpeakerPOR();
+	virtual Common::String getClassName() { return "SpeakerPOR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerOR : public AnimatedSpeaker {
+public:
+	SpeakerOR();
+	virtual Common::String getClassName() { return "SpeakerOR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerOText : public SpeakerGText {
+public:
+	SpeakerOText();
+
+	virtual Common::String getClassName() { return "SpeakerOText"; }
+};
+
+class SpeakerPOText : public ScreenSpeaker {
+public:
+	SpeakerPOText();
+
+	virtual Common::String getClassName() { return "SpeakerPOText"; }
+};
+
+class SpeakerSText : public ScreenSpeaker {
+public:
+	SpeakerSText();
+
+	virtual Common::String getClassName() { return "SpeakerSText"; }
+};
+
+class SpeakerQText : public ScreenSpeaker {
+public:
+	SpeakerQText();
+
+	virtual Common::String getClassName() { return "SpeakerQText"; }
+};
+
+class SpeakerMText : public ScreenSpeaker {
+public:
+	SpeakerMText();
+
+	virtual Common::String getClassName() { return "SpeakerMText"; }
+};
+
+class SpeakerCText : public ScreenSpeaker {
+public:
+	SpeakerCText();
+
+	virtual Common::String getClassName() { return "SpeakerCText"; }
+};
+
+class SpeakerEText : public ScreenSpeaker {
+public:
+	SpeakerEText();
+
+	virtual Common::String getClassName() { return "SpeakerEText"; }
+};
+
+class SpeakerGR : public AnimatedSpeaker {
+public:
+	SpeakerGR();
+
+	virtual Common::String getClassName() { return "SpeakerGR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerHText : public ScreenSpeaker {
+public:
+	SpeakerHText();
+
+	virtual Common::String getClassName() { return "SpeakerHText"; }
+};
+
+class SpeakerPText : public ScreenSpeaker {
+public:
+	SpeakerPText();
+
+	virtual Common::String getClassName() { return "SpeakerPText"; }
+};
+
+class SpeakerCHFText : public ScreenSpeaker {
+public:
+	SpeakerCHFText();
+
+	virtual Common::String getClassName() { return "SpeakerCHFText"; }
+};
+
+class SpeakerSKText : public ScreenSpeaker {
+public:
+	SpeakerSKText();
+
+	virtual Common::String getClassName() { return "SpeakerSKText"; }
+};
+
+class SpeakerCDRText : public ScreenSpeaker {
+public:
+	SpeakerCDRText();
+
+	virtual Common::String getClassName() { return "SpeakerCDRText"; }
+};
+
+class SpeakerFLText : public ScreenSpeaker {
+public:
+	SpeakerFLText();
+
+	virtual Common::String getClassName() { return "SpeakerFLText"; }
+};
+
+class SpeakerBatText : public ScreenSpeaker {
+public:
+	SpeakerBatText();
+
+	virtual Common::String getClassName() { return "SpeakerFLText"; }
+};
+
+class SpeakerQR : public AnimatedSpeaker {
+public:
+	SpeakerQR();
+
+	virtual Common::String getClassName() { return "SpeakerQR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerQU : public AnimatedSpeaker {
+public:
+	SpeakerQU();
+
+	virtual Common::String getClassName() { return "SpeakerQU"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSKL : public AnimatedSpeaker {
+public:
+	SpeakerSKL();
+
+	virtual Common::String getClassName() { return "SpeakerQL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerQL : public AnimatedSpeaker {
+public:
+	SpeakerQL();
+
+	virtual Common::String getClassName() { return "SpeakerQL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSR : public AnimatedSpeaker {
+public:
+	SceneObject _object3;
+public:
+	SpeakerSR();
+
+	virtual Common::String getClassName() { return "SpeakerSR"; }
+	void setText(const Common::String &msg);
+};
+
+class SpeakerSL : public AnimatedSpeaker {
+public:
+	SpeakerSL();
+
+	virtual Common::String getClassName() { return "SpeakerSL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCR : public AnimatedSpeaker {
+public:
+	SpeakerCR();
+
+	virtual Common::String getClassName() { return "SpeakerCR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerMR : public AnimatedSpeaker {
+public:
+	SpeakerMR();
+
+	virtual Common::String getClassName() { return "SpeakerMR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerSAL : public AnimatedSpeaker {
+public:
+	SpeakerSAL();
+
+	virtual Common::String getClassName() { return "SpeakerSAL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerML : public AnimatedSpeaker {
+public:
+	SpeakerML();
+
+	virtual Common::String getClassName() { return "SpeakerML"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCHFL : public AnimatedSpeaker {
+public:
+	SpeakerCHFL();
+
+	virtual Common::String getClassName() { return "SpeakerCHFL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCHFR : public AnimatedSpeaker {
+public:
+	SpeakerCHFR();
+
+	virtual Common::String getClassName() { return "SpeakerCHFR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerPL : public AnimatedSpeaker {
+public:
+	SceneObject _object3;
+	SpeakerAction _speakerAction2;
+
+	SpeakerPL();
+
+	virtual Common::String getClassName() { return "SpeakerPL"; }
+	virtual void setText(const Common::String &msg);
+	virtual void removeText();
+};
+
+class SpeakerPR : public AnimatedSpeaker {
+public:
+	SceneObject _object3;
+	SpeakerAction _speakerAction2;
+
+	SpeakerPR();
+
+	virtual Common::String getClassName() { return "SpeakerPR"; }
+	virtual void setText(const Common::String &msg);
+	virtual void removeText();
+};
+
+class SpeakerCDR : public AnimatedSpeaker {
+public:
+	SpeakerCDR();
+
+	virtual Common::String getClassName() { return "SpeakerCDR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerCDL : public AnimatedSpeaker {
+public:
+	SpeakerCDL();
+
+	virtual Common::String getClassName() { return "SpeakerCDL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerFLL : public AnimatedSpeaker {
+public:
+	SpeakerFLL();
+
+	virtual Common::String getClassName() { return "SpeakerFLL"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerBatR : public AnimatedSpeaker {
+public:
+	SpeakerBatR();
+
+	virtual Common::String getClassName() { return "SpeakerBatR"; }
+	virtual void setText(const Common::String &msg);
+};
+
+/*--------------------------------------------------------------------------*/
+
+class RingworldInvObjectList : public InvObjectList {
+public:
+	InvObject _stunner;
+	InvObject _scanner;
+	InvObject _stasisBox;
+	InvObject _infoDisk;
+	InvObject _stasisNegator;
+	InvObject _keyDevice;
+	InvObject _medkit;
+	InvObject _ladder;
+	InvObject _rope;
+	InvObject _key;
+	InvObject _translator;
+	InvObject _ale;
+	InvObject _paper;
+	InvObject _waldos;
+	InvObject _stasisBox2;
+	InvObject _ring;
+	InvObject _cloak;
+	InvObject _tunic;
+	InvObject _candle;
+	InvObject _straw;
+	InvObject _scimitar;
+	InvObject _sword;
+	InvObject _helmet;
+	InvObject _items;
+	InvObject _concentrator;
+	InvObject _nullifier;
+	InvObject _peg;
+	InvObject _vial;
+	InvObject _jacket;
+	InvObject _tunic2;
+	InvObject _bone;
+	InvObject _jar;
+	InvObject _emptyJar;
+public:
+	RingworldInvObjectList();
+
+	virtual Common::String getClassName() { return "RingworldInvObjectList"; }
+};
+
+#define RING_INVENTORY (*((RingworldInvObjectList *)_globals->_inventory))
+
+class RingworldGame: public Game {
+protected:
+	virtual void handleSaveLoad(bool saveFlag, int &saveSlot, Common::String &saveName);
+public:
+	virtual void start();
+	virtual void restart();
+	virtual void restartGame();
+	virtual void saveGame();
+	virtual void restoreGame();
+	virtual void quitGame();
+	virtual void endGame(int resNum, int lineNum);
+
+	virtual Scene *createScene(int sceneNumber);
+	virtual void processEvent(Event &event);
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp
new file mode 100644
index 0000000..880fa51
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes1.cpp
@@ -0,0 +1,3345 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "tsage/ringworld/ringworld_scenes1.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+/*--------------------------------------------------------------------------
+ * Scene 10 - Kziniti Palace (Introduction)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene10::Action1::signal() {
+	Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(6);
+		break;
+	case 1:
+		_globals->_scenePalette.addRotation(240, 254, -1);
+		scene->_stripManager.start(10, this);
+		break;
+	case 2:
+		scene->_speakerSText.setTextPos(Common::Point(20, 20));
+		scene->_speakerSText._color1 = 10;
+		scene->_speakerSText._textWidth = 160;
+		scene->_stripManager.start(11, this, scene);
+		break;
+	case 3:
+		scene->_object2.hide();
+		scene->_object3.hide();
+		scene->_object3.setAction(NULL);
+		scene->_object4.animate(ANIM_MODE_5, this);
+		break;
+	case 4:
+	case 9:
+		scene->_object1.animate(ANIM_MODE_5, this);
+		break;
+	case 5:
+		scene->_object2.setStrip(3);
+		scene->_object2.setFrame(1);
+		scene->_object2.setPosition(Common::Point(240, 51));
+		scene->_object2.show();
+
+		scene->_object3.setStrip(6);
+		scene->_object3.setFrame(1);
+		scene->_object3.setPosition(Common::Point(200, 76));
+		scene->_object3._numFrames = 20;
+		scene->_object3.show();
+
+		scene->_stripManager.start(12, this, scene);
+		break;
+	case 6:
+		scene->_object2.hide();
+		scene->_object3.hide();
+		scene->_object1.animate(ANIM_MODE_6, this);
+		break;
+	case 7:
+		scene->_object3.show();
+		scene->_object3.setStrip2(5);
+		scene->_object3._numFrames = 10;
+		scene->_object3.setPosition(Common::Point(180, 87));
+		scene->_object3.setAction(&scene->_action2);
+
+		scene->_object2.setStrip(4);
+		scene->_object2.setFrame(1);
+		scene->_object2.setPosition(Common::Point(204, 59));
+		scene->_object2.show();
+
+		scene->_stripManager.start(13, this, scene);
+		break;
+	case 8:
+		scene->_object2.hide();
+		scene->_object3.hide();
+		scene->_object4.animate(ANIM_MODE_6, this);
+		break;
+	case 10:
+		_globals->_soundHandler.fadeOut(this);
+		break;
+	case 11:
+		_globals->_scenePalette.clearListeners();
+		_globals->_sceneManager.changeScene(15);
+		break;
+	}
+}
+
+void Scene10::Action2::signal() {
+	Scene10 *scene = (Scene10 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(_globals->_randomSource.getRandomNumber(179));
+		break;
+	case 1:
+		scene->_object3.setFrame(1);
+		scene->_object3.animate(ANIM_MODE_5, this);
+		_actionIndex = 0;
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene10::postInit(SceneObjectList *OwnerList) {
+	loadScene(10);
+	setZoomPercents(0, 100, 200, 100);
+
+	_stripManager.addSpeaker(&_speakerSText);
+	_stripManager.addSpeaker(&_speakerQText);
+	_speakerSText._speakerName = "STEXT";
+	_speakerQText._speakerName = "QTEXT";
+	_speakerSText._hideObjects = false;
+	_speakerQText._hideObjects = false;
+	_speakerQText.setTextPos(Common::Point(140, 120));
+	_speakerQText._color1 = 4;
+	_speakerQText._textWidth = 160;
+	_speakerSText.setTextPos(Common::Point(20, 20));
+	_speakerSText._color1 = 7;
+	_speakerSText._textWidth = 320;
+
+	_stripManager.setCallback(this);
+
+	_object1.postInit();
+	_object1.setVisage(10);
+	_object1.setPosition(Common::Point(232, 90));
+	_object1.fixPriority(1);
+
+	_object2.postInit();
+	_object2.setVisage(10);
+	_object2.setStrip(4);
+	_object2.setFrame(1);
+	_object2.setPosition(Common::Point(204, 59));
+	_object2.fixPriority(198);
+
+	_object3.postInit();
+	_object3.setVisage(10);
+	_object3.setStrip2(5);
+	_object3.setPosition(Common::Point(180, 87));
+	_object3.fixPriority(196);
+	_object3.setAction(&_action2);
+
+	_object4.postInit();
+	_object4.setVisage(10);
+	_object4.setStrip(2);
+	_object4.setPosition(Common::Point(0, 209));
+	_object4.animate(ANIM_MODE_1, NULL);
+
+	_object5.postInit();
+	_object5.setVisage(11);
+	_object5.setPosition(Common::Point(107, 146));
+	_object5.animate(ANIM_MODE_2, NULL);
+	_object5._numFrames = 5;
+
+	_object6.postInit();
+	_object6.setVisage(11);
+	_object6.setStrip(2);
+	_object6.setPosition(Common::Point(287, 149));
+	_object6.animate(ANIM_MODE_2, NULL);
+	_object6._numFrames = 5;
+
+	_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+	_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+	setAction(&_action1);
+	_globals->_soundHandler.play(5);
+}
+
+void Scene10::stripCallback(int v) {
+	switch (v) {
+	case 1:
+		_object2.animate(ANIM_MODE_7, -1, NULL);
+		break;
+	case 2:
+		_object2.animate(ANIM_MODE_NONE);
+		break;
+	case 3:
+		_object2.animate(ANIM_MODE_7, -1, NULL);
+		_object3.animate(ANIM_MODE_5, NULL);
+		break;
+	default:
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 15 - Outer Space (Introduction)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene15::Action1::signal() {
+	Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(60);
+		break;
+	case 1:
+		SceneItem::display(15, 0, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7,
+				SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END);
+		setDelay(300);
+		break;
+	case 2: {
+		SceneItem::display(15, 1, SET_Y, 20, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 7,
+				SET_WIDTH, 320, SET_KEEP_ONSCREEN, 1, LIST_END);
+		scene->_object1.postInit();
+		scene->_object1.setVisage(15);
+		scene->_object1.setPosition(Common::Point(160, -10));
+		scene->_object1.animate(ANIM_MODE_2, NULL);
+		Common::Point pt(160, 100);
+		NpcMover *mover = new NpcMover();
+		scene->_object1.addMover(mover, &pt, this);
+		scene->_soundHandler.play(7);
+		break;
+	}
+	case 3:
+		SceneItem::display(0, 0);
+		_globals->_sceneManager.changeScene(20);
+		break;
+	}
+}
+
+void Scene15::Action1::dispatch() {
+	Scene15 *scene = (Scene15 *)_globals->_sceneManager._scene;
+
+	if (scene->_object1._position.y < 100)
+		scene->_object1.changeZoom(100 - scene->_object1._position.y);
+	Action::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene15::postInit(SceneObjectList *OwnerList) {
+	loadScene(15);
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+	_globals->_soundHandler.play(6);
+	setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 20 - Cut-scenes where House Chmeee is in the distance
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene20::Action1::signal() {
+	Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(120);
+		break;
+	case 1:
+		scene->_stripManager.start(20, this);
+		break;
+	case 2:
+		_globals->_soundHandler.fadeOut(this);
+		break;
+	case 3:
+		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+		_globals->_sceneManager.changeScene(30);	// First game scene
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene20::Action2::signal() {
+	Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+	NpcMover *npcMover;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(10);
+		break;
+	case 1:
+		SceneItem::display(20, 1, SET_WIDTH, 200, SET_Y, 20, SET_X, 160, SET_KEEP_ONSCREEN, true,
+			SET_EXT_BGCOLOR, 4, LIST_END);
+		setDelay(120);
+		break;
+	case 2: {
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(455, 77);
+		_globals->_player.addMover(mover, &pt, this);
+		ObjectMover2 *mover2 = new ObjectMover2();
+		scene->_SceneObjectExt.addMover(mover2, 5, 10, &_globals->_player);
+		ObjectMover2 *mover3 = new ObjectMover2();
+		scene->_sceneObject3.addMover(mover3, 10, 15, &_globals->_player);
+		break;
+	}
+	case 3: {
+		npcMover = new NpcMover();
+		Common::Point pt(557, 100);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 4: {
+		npcMover = new NpcMover();
+		Common::Point pt(602, 90);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 5: {
+		npcMover = new NpcMover();
+		Common::Point pt(618, 90);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 6: {
+		npcMover = new NpcMover();
+		Common::Point pt(615, 81);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 7: {
+		npcMover = new NpcMover();
+		Common::Point pt(588, 79);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 8:
+		scene->_sound.release();
+		_globals->_soundHandler.fadeOut(this);
+		break;
+	case 9:
+		SceneItem::display(0, 0, LIST_END);
+		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+		_globals->_sceneManager.changeScene(40);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene20::Action3::signal() {
+	Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+	NpcMover *npcMover;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(120);
+		break;
+	case 1: {
+		npcMover = new NpcMover();
+		Common::Point pt(615, 81);
+		_globals->_player.addMover(npcMover, &pt, this);
+		ObjectMover2 *mover1 = new ObjectMover2();
+		scene->_SceneObjectExt.addMover(mover1, 5, 10, &_globals->_player);
+		ObjectMover2 *mover2 = new ObjectMover2();
+		scene->_sceneObject3.addMover(mover2, 20, 25, &_globals->_player);
+		break;
+	}
+	case 2: {
+		npcMover = new NpcMover();
+		Common::Point pt(618, 90);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 3: {
+		_globals->_player._moveDiff = Common::Point(10, 10);
+		scene->_SceneObjectExt._moveDiff = Common::Point(10, 10);
+		scene->_sceneObject3._moveDiff = Common::Point(10, 10);
+		npcMover = new NpcMover();
+		Common::Point pt(445, 132);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 4: {
+		npcMover = new NpcMover();
+		Common::Point pt(151, 137);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 5: {
+		npcMover = new NpcMover();
+		Common::Point pt(-15, 137);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 6:
+		scene->_sound.play(60, this, 127);
+		_globals->_soundHandler.release();
+		break;
+	case 7:
+		_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL;
+		_globals->_sceneManager.changeScene(90);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene20::Action4::signal() {
+	Scene20 *scene = (Scene20 *)_globals->_sceneManager._scene;
+	NpcMover *npcMover;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(60);
+		break;
+	case 1: {
+		npcMover = new NpcMover();
+		Common::Point pt(486, 134);
+		_globals->_player.addMover(npcMover, &pt, this);
+		ObjectMover2 *mover1 = new ObjectMover2();
+		scene->_SceneObjectExt.addMover(mover1, 20, 35, &_globals->_player);
+		break;
+	}
+	case 2: {
+		_globals->_player._moveDiff = Common::Point(12, 12);
+		scene->_SceneObjectExt._moveDiff = Common::Point(12, 12);
+		NpcMover *mover1 = new NpcMover();
+		Common::Point pt(486, 134);
+		scene->_sceneObject3.addMover(mover1, &pt, this);
+		NpcMover *mover2 = new NpcMover();
+		pt = Common::Point(-15, 134);
+		_globals->_player.addMover(mover2, &pt, NULL);
+		NpcMover *mover3 = new NpcMover();
+		pt = Common::Point(-15, 134);
+		scene->_SceneObjectExt.addMover(mover3, &pt, NULL);
+		break;
+	}
+	case 3: {
+		scene->_sceneObject3._moveDiff = Common::Point(20, 20);
+		npcMover = new NpcMover();
+		Common::Point pt(320, 134);
+		scene->_sceneObject3.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 4: {
+		scene->_sound.play(28);
+		scene->_sceneObject4.postInit();
+		scene->_sceneObject4.setVisage(21);
+		scene->_sceneObject4.setStrip(3);
+		scene->_sceneObject4.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
+			scene->_sceneObject3._position.y - 1));
+		scene->_sceneObject4._moveDiff.x = 48;
+
+		ObjectMover3 *mover = new ObjectMover3();
+		scene->_sceneObject4.addMover(mover, &scene->_SceneObjectExt, 4, this);
+		break;
+	}
+	case 5: {
+		scene->_sound.play(42);
+		scene->_sceneObject4.remove();
+		scene->_SceneObjectExt.setVisage(21);
+		scene->_SceneObjectExt.setStrip(1);
+		scene->_SceneObjectExt.setFrame(1);
+		scene->_SceneObjectExt.animate(ANIM_MODE_5, NULL);
+
+		scene->_SceneObjectExt._moveDiff.x = 4;
+		NpcMover *mover1 = new NpcMover();
+		Common::Point pt(scene->_SceneObjectExt._position.x - 12, scene->_SceneObjectExt._position.y + 5);
+		scene->_SceneObjectExt.addMover(mover1, &pt, NULL);
+
+		scene->_sceneObject5.postInit();
+		scene->_sceneObject5.setVisage(21);
+		scene->_sceneObject5.setStrip(3);
+		scene->_sceneObject5.setPosition(Common::Point(scene->_sceneObject3._position.x - 36,
+			scene->_sceneObject3._position.y - 1));
+		scene->_sceneObject5._moveDiff.x = 48;
+
+		ObjectMover3 *mover = new ObjectMover3();
+		scene->_sceneObject5.addMover(mover, &_globals->_player, 4, this);
+		break;
+	}
+	case 6: {
+		scene->_sound.play(42);
+		scene->_SceneObjectExt.setStrip(2);
+		scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL);
+
+		scene->_sceneObject5.remove();
+		_globals->_player.setVisage(21);
+		_globals->_player.setStrip(1);
+		_globals->_player.setFrame(1);
+		_globals->_player.animate(ANIM_MODE_5, this);
+		_globals->_player._moveDiff.x = 4;
+
+		npcMover = new NpcMover();
+		Common::Point pt(_globals->_player._position.x - 25, _globals->_player._position.y + 5);
+		_globals->_player.addMover(npcMover, &pt, this);
+		break;
+	}
+	case 7:
+		_globals->_player.setStrip(2);
+		_globals->_player.animate(ANIM_MODE_2, NULL);
+		scene->_sound.play(77, this, 127);
+		break;
+	case 8:
+		_globals->_game->endGame(20, 0);
+		break;
+	default:
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene20::Scene20() {
+}
+
+void Scene20::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerGameText);
+	_speakerQText._npc = &_globals->_player;
+
+	if (_globals->_sceneManager._previousScene == 30) {
+		// Cut scene: Assassins are coming
+		_globals->_player.postInit();
+		_globals->_player.setVisage(20);
+		_globals->_player.setPosition(Common::Point(405, 69));
+		_globals->_player._moveDiff = Common::Point(10, 10);
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+
+		_SceneObjectExt.postInit();
+		_SceneObjectExt.setVisage(20);
+		_SceneObjectExt.setPosition(Common::Point(400, 69));
+		_SceneObjectExt.animate(ANIM_MODE_1, NULL);
+
+		_sceneObject3.postInit();
+		_sceneObject3.setVisage(20);
+		_sceneObject3.setPosition(Common::Point(395, 69));
+		_sceneObject3.animate(ANIM_MODE_1, NULL);
+
+		_SceneObjectExt._moveDiff = Common::Point(10, 10);
+		_sceneObject3._moveDiff = Common::Point(10, 10);
+		_globals->_soundHandler.play(20);
+		_sound.play(21);
+		_sound.holdAt(true);
+		setAction(&_action2);
+
+		_sceneBounds = Rect(320, 0, 640, 200);
+	} else if (_globals->_sceneManager._previousScene == 60) {
+		// Evasion
+		_sound.play(30);
+		_globals->_player.postInit();
+		_globals->_player.setVisage(20);
+		_globals->_player.setPosition(Common::Point(588, 79));
+		_globals->_player._moveDiff = Common::Point(5, 5);
+		_globals->_player.fixPriority(50);
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+
+		_SceneObjectExt.postInit();
+		_SceneObjectExt.setVisage(20);
+		_SceneObjectExt.setPosition(Common::Point(583, 79));
+		_SceneObjectExt.animate(ANIM_MODE_1, NULL);
+
+		_sceneObject3.postInit();
+		_sceneObject3.setVisage(20);
+		_sceneObject3.setStrip2(2);
+		_sceneObject3.setPosition(Common::Point(595, 79));
+		_sceneObject3.animate(ANIM_MODE_1, NULL);
+
+		if ((_globals->getFlag(120) && _globals->getFlag(116)) ||
+				(_globals->getFlag(117) && _globals->getFlag(119))) {
+			// Successful evasion
+			setAction(&_action3);
+		} else if (_globals->getFlag(104)) {
+			_sceneMode = 21;
+			setAction(&_sequenceManager, this, 21, &_globals->_player, &_SceneObjectExt, NULL);
+		} else {
+			// Failed evasion
+			_sceneObject3._moveDiff = Common::Point(8, 8);
+			setAction(&_action4);
+		}
+		_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+	} else {
+		// Intro: Quinn looking at the monaster
+		_globals->_player.postInit();
+		_globals->_player.setVisage(2640);
+		_globals->_player.animate(ANIM_MODE_NONE, NULL);
+		_globals->_player.setStrip2(1);
+		_globals->_player.setFrame2(4);
+		_globals->_player.fixPriority(200);
+		_globals->_player.setPosition(Common::Point(425, 233));
+
+		setAction(&_action1);
+		_speakerQText.setTextPos(Common::Point(350, 20));
+		_speakerQText._textWidth = 260;
+		_speakerGameText.setTextPos(Common::Point(350, 20));
+		_speakerGameText._textWidth = 260;
+
+		_globals->_soundHandler.play(8);
+		_sceneBounds = Rect(320, 0, 640, 200);
+	}
+
+	_globals->_player.disableControl();
+	loadScene(20);
+}
+
+void Scene20::signal() {
+	if (_sceneMode == 21)
+		_globals->_sceneManager.changeScene(90);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 30 - First game scene (Outside Ch'mee house)
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene30::BeamObject::doAction(int action) {
+	if (action == OBJECT_SCANNER)
+		display2(30, 14);
+	else if (action == CURSOR_LOOK)
+		display2(30, 2);
+	else if (action == CURSOR_USE) {
+		Scene30 *parent = (Scene30 *)_globals->_sceneManager._scene;
+		parent->setAction(&parent->_beamAction);
+	} else
+		SceneObject::doAction(action);
+}
+
+void Scene30::DoorObject::doAction(int action) {
+	if (action == OBJECT_SCANNER)
+		display2(30, 13);
+	else if (action == CURSOR_LOOK)
+		display2(30, 1);
+	else if (action == CURSOR_USE)
+		display2(30, 7);
+	else
+		SceneObject::doAction(action);
+}
+
+void Scene30::BeamAction::signal() {
+	Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		// Disable control and move player to the doorway beam
+		_globals->_player.disableControl();
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(114, 198);
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+
+	case 1:
+		// Perform the animation of player raising hand
+		_globals->_player.setVisage(31);
+		_globals->_player.setStrip(1);
+		_globals->_player.setFrame(1);
+		_globals->_player.animate(ANIM_MODE_5, this);
+		break;
+
+	case 2:
+		// Hide the beam and lower the player's hand
+		scene->_sound.play(10, NULL, 127);
+		_globals->_player.animate(ANIM_MODE_6, this);
+		scene->_beam.remove();
+		break;
+
+	case 3: {
+		// Bring the Kzin to the doorway
+		_globals->_player.setVisage(0);
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+		_globals->_player.setStrip(7);
+		scene->_kzin.postInit();
+		scene->_kzin.setVisage(2801);
+		scene->_kzin.animate(ANIM_MODE_1, NULL);
+		scene->_kzin.setObjectWrapper(new SceneObjectWrapper());
+		scene->_kzin.setPosition(Common::Point(334, 1));
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(158, 170);
+		scene->_kzin.addMover(mover, &pt, this);
+		_globals->_sceneItems.push_front(&scene->_kzin);
+		break;
+	}
+
+	case 4:
+		// Open the door
+		scene->_sound.play(11, NULL, 127);
+		scene->_door.animate(ANIM_MODE_5, this);
+		break;
+
+	case 5:
+		// Run the Kzin's talk sequence
+		scene->_sound.play(13, NULL, 127);
+		_globals->_soundHandler.play(12, NULL, 127);
+		scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this);
+		break;
+
+	case 6:
+		// Slight delay
+		setDelay(3);
+		break;
+
+	case 7:
+		// Re-activate player control
+		scene->_sceneMode = 31;
+		scene->_kzin.setAction(&scene->_kzinAction);
+		_globals->_player.enableControl();
+
+		// End this action
+		remove();
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene30::KzinAction::signal() {
+	Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(1200);
+		break;
+	case 1:
+		_globals->_soundHandler.fadeOut(NULL);
+		_globals->_player.disableControl();
+		setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL);
+		break;
+	case 2:
+		_globals->_player.enableControl();
+		remove();
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene30::RingAction::signal() {
+	Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		_globals->_player.disableControl();
+		scene->_kzin.setAction(NULL);
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(114, 198);
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+
+	case 1:
+		_globals->_player.checkAngle(&scene->_kzin);
+		scene->_stripManager.start(32, this);
+		break;
+
+	case 2: {
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(143, 177);
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+
+	case 3:
+		scene->_sound.play(11, NULL, 127);
+		scene->_door.animate(ANIM_MODE_6, this);
+		break;
+
+	case 4: {
+		scene->_sound.play(13, NULL, 127);
+		NpcMover *kzinMover = new NpcMover();
+		Common::Point pt(354, 5);
+		scene->_kzin.addMover(kzinMover, &pt, this);
+		NpcMover *playerMover = new NpcMover();
+		pt = Common::Point(335, 36);
+		_globals->_player.addMover(playerMover, &pt, this);
+		break;
+	}
+
+	case 5:
+		break;
+
+	case 6:
+		_globals->_sceneManager.changeScene(20);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void Scene30::TalkAction::signal() {
+	Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		_globals->_player.disableControl();
+		scene->_kzin.setAction(NULL);
+		NpcMover *mover = new NpcMover();
+		Common::Point pt(114, 198);
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 1:
+		_globals->_player.checkAngle(&scene->_kzin);
+		scene->_stripManager.start(34, this);
+		break;
+	case 2:
+		setDelay(5);
+		break;
+	case 3:
+		scene->_kzin.setAction(&scene->_kzinAction);
+		_globals->_player.enableControl();
+		remove();
+		break;
+	default:
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene30::KzinObject::doAction(int action) {
+	Scene30 *scene = (Scene30 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		display2(30, 12);
+		break;
+	case OBJECT_SCANNER:
+		display2(30, 11);
+		break;
+	case OBJECT_RING:
+		RING_INVENTORY._ring._sceneNumber = 30;
+		scene->setAction(&scene->_ringAction);
+		break;
+	case CURSOR_LOOK:
+		display2(30, 6);
+		break;
+	case CURSOR_USE:
+		display2(30, 10);
+		break;
+	case CURSOR_TALK:
+		_globals->_player.disableControl();
+		scene->setAction(&scene->_talkAction);
+		break;
+	default:
+		SceneObject::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene30::Scene30() :
+	_groundHotspot(9, OBJECT_SCANNER, 50, 17, CURSOR_LOOK, 30, 3, CURSOR_USE, 30, 8, LIST_END),
+	_wallsHotspot(8, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 30, 0, CURSOR_USE, 30, 7, LIST_END),
+	_courtyardHotspot(0, CURSOR_LOOK, 30, 4, LIST_END),
+	_treeHotspot(10, OBJECT_SCANNER, 40, 39, CURSOR_LOOK, 30, 5, CURSOR_USE, 30, 9, LIST_END) {
+}
+
+void Scene30::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	// Add the speaker classes to the strip manager
+	_stripManager.addSpeaker(&_speakerQL);
+	_stripManager.addSpeaker(&_speakerSR);
+	_stripManager.addSpeaker(&_speakerSText);
+	_stripManager.addSpeaker(&_speakerQText);
+	_speakerSText._npc = &_kzin;
+	_speakerQText._npc = &_globals->_player;
+
+
+	// Setup player
+	_globals->_player.postInit();
+	_globals->_player.setVisage(0);
+	_globals->_player.animate(ANIM_MODE_1);
+	_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+	_globals->_player.setStrip(7);
+	_globals->_player.setFrame(1);
+	_globals->_player.setPosition(Common::Point(114, 198));
+	_globals->_player.changeZoom(75);
+	_globals->_player.enableControl();
+
+	// Set up beam object
+	_beam.postInit();
+	_beam.setVisage(31);
+	_beam.setStrip(2);
+	_beam.setPosition(Common::Point(124, 178));
+	_beam.fixPriority(188);
+
+	// Set up door object
+	_door.postInit();
+	_door.setVisage(30);
+	_door.setPosition(Common::Point(150, 183));
+
+	// Final processing and add of scene items
+	_courtyardHotspot.setBounds(Rect(0, 0, 320, 200));
+
+	// Add the objects and hotspots to the scene
+	_globals->_sceneItems.addItems(&_beam, &_wallsHotspot, &_door, &_treeHotspot, &_groundHotspot,
+		&_courtyardHotspot, NULL);
+
+	// Load the scene data
+	loadScene(30);
+	_sceneMode = 0;
+}
+
+void Scene30::signal() {
+	if (_sceneMode == 31) {
+		// Re-activate beam if the Kzin goes back inside
+		_beam.postInit();
+		_beam.setVisage(31);
+		_beam.setStrip(2);
+		_beam.setPosition(Common::Point(124, 178));
+		_beam.fixPriority(188);
+		_globals->_sceneItems.push_front(&_beam);
+		_globals->_player.enableControl();
+	} else if (_sceneMode == 32) {
+		_globals->_player.disableControl();
+		_sceneMode = 31;
+		setAction(&_sequenceManager, _globals->_sceneManager._scene, 31, &_kzin, &_door, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 40 - Chmeee Home
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene40::Action1::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(120);
+		break;
+	case 1:
+		_globals->_events.setCursor(CURSOR_WALK);
+		scene->_stripManager.start(40, this);
+		break;
+	case 2:
+		scene->_doorway.postInit();
+		scene->_doorway.setVisage(46);
+		scene->_doorway.setPosition(Common::Point(305, 61));
+		scene->_doorway.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(25);
+		break;
+	case 3:
+		scene->_doorway.hide();
+		scene->_dyingKzin.setPosition(Common::Point(296, 62));
+		_globals->_player.animate(ANIM_MODE_5, NULL);
+		scene->_object1.setVisage(43);
+		scene->_object1.setStrip(3);
+		scene->_object1.animate(ANIM_MODE_5, NULL);
+		scene->_object2.hide();
+		scene->_object3.hide();
+		scene->_stripManager.start(45, this);
+		break;
+	case 4:
+		scene->_object2.remove();
+		scene->_object3.remove();
+		scene->_assassin.setVisage(42);
+		scene->_assassin.setStrip(2);
+		scene->_assassin.setFrame(1);
+		scene->_assassin.setPosition(Common::Point(13, 171));
+		scene->_assassin.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(25);
+		break;
+	case 5:
+		scene->_doorway.show();
+		scene->_doorway.setVisage(42);
+		scene->_doorway.setStrip(3);
+		scene->_doorway.setFrame(1);
+		scene->_doorway.setPosition(Common::Point(41, 144));
+		scene->_assassin.animate(ANIM_MODE_6, NULL);
+		setDelay(6);
+		break;
+	case 6:
+		scene->_doorway.setPosition(Common::Point(178, 101));
+		setDelay(6);
+		break;
+	case 7:
+		scene->_doorway.setPosition(Common::Point(271, 69));
+		setDelay(6);
+		break;
+	case 8:
+		scene->_doorway.remove();
+		scene->_dyingKzin.animate(ANIM_MODE_5, this);
+		break;
+	case 9: {
+		scene->_dyingKzin.setStrip(1);
+		//Workaround: The original uses setFrame(1) but it's completely wrong.
+		scene->_dyingKzin.setFrame(2);
+		scene->_dyingKzin._moveDiff.y = 15;
+		scene->_dyingKzin.animate(ANIM_MODE_5, NULL);
+		Common::Point pt(223, 186);
+		NpcMover *mover = new NpcMover();
+		scene->_dyingKzin.addMover(mover, &pt, this);
+		break;
+	}
+	case 10: {
+		scene->_soundHandler.play(27);
+		Common::Point pt(223, 184);
+		NpcMover *mover = new NpcMover();
+		scene->_dyingKzin.addMover(mover, &pt, this);
+		break;
+	}
+	case 11: {
+		Common::Point pt(223, 186);
+		NpcMover *mover = new NpcMover();
+		scene->_dyingKzin.addMover(mover, &pt, this);
+		break;
+	}
+	case 12: {
+		_globals->_soundHandler.play(26);
+		_globals->_player._uiEnabled = true;
+		scene->_assassin.setVisage(42);
+		scene->_assassin.setPosition(Common::Point(4, 191));
+		scene->_assassin.setStrip(1);
+		scene->_assassin.animate(ANIM_MODE_1, NULL);
+		Common::Point pt(230, 187);
+		NpcMover *mover = new NpcMover();
+		scene->_assassin.addMover(mover, &pt, this);
+		break;
+	}
+	case 13:
+		setDelay(180);
+		break;
+	case 14:
+		scene->_assassin.setVisage(45);
+		scene->_assassin.setStrip(1);
+		scene->_assassin.setFrame(1);
+		scene->_assassin.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(28);
+		break;
+	case 15:
+		_globals->_player.disableControl();
+		scene->_object1.setVisage(40);
+		scene->_object1.setStrip(4);
+		scene->_object1.setFrame(1);
+		scene->_object1.animate(ANIM_MODE_5, NULL);
+		_globals->_player.setVisage(40);
+		_globals->_player.setStrip(2);
+		_globals->_player.setFrame(1);
+		_globals->_player.animate(ANIM_MODE_5, this);
+		break;
+	case 16:
+		_globals->_soundHandler.play(77, this);
+		break;
+	case 17:
+		_globals->_game->endGame(40, 20);
+		remove();
+		break;
+	}
+}
+
+void Scene40::Action2::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		_globals->_player.disableControl();
+		if (scene->_assassin._position.x < 229)
+			_actionIndex = 0;
+		setDelay(1);
+		break;
+	case 1:
+		scene->_assassin.animate(ANIM_MODE_NONE, NULL);
+		_globals->_player.setStrip(2);
+		_globals->_player.setFrame(1);
+		_globals->_player.animate(ANIM_MODE_5, this);
+		break;
+	case 2: {
+		scene->_soundHandler.play(28);
+		scene->_doorway.postInit();
+		scene->_doorway.setVisage(16);
+		scene->_doorway.setStrip2(6);
+		scene->_doorway.fixPriority(200);
+		scene->_doorway.setPosition(Common::Point(159, 191));
+		scene->_doorway._moveDiff = Common::Point(40, 40);
+		scene->_doorway._moveRate = 60;
+		scene->_doorway.animate(ANIM_MODE_5, NULL);
+
+		Common::Point pt(271, 165);
+		NpcMover *mover = new NpcMover();
+		scene->_doorway.addMover(mover, &pt, this);
+		break;
+	}
+	case 3:
+		scene->_doorway.remove();
+		scene->_assassin.setVisage(44);
+		scene->_assassin._frame = 1;
+		scene->_assassin.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(29);
+		RING_INVENTORY._infoDisk._sceneNumber = 40;
+		break;
+	case 4:
+		_globals->_player.animate(ANIM_MODE_6, this);
+		break;
+	case 5: {
+		_globals->_player.setVisage(0);
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+		_globals->_player.setStrip(1);
+		Common::Point pt(230, 195);
+		PlayerMover *mover = new PlayerMover();
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 6: {
+		_globals->_player.setStrip(7);
+		scene->_object1.setVisage(2806);
+		scene->_object1.animate(ANIM_MODE_1, NULL);
+		SceneObjectWrapper *wrapper = new SceneObjectWrapper();
+		scene->_object1.setObjectWrapper(wrapper);
+		Common::Point pt(200, 190);
+		NpcMover *mover = new NpcMover();
+		scene->_object1.addMover(mover, &pt, this);
+		break;
+	}
+	case 7:
+		scene->_stripManager.start(44, this);
+		break;
+	case 8: {
+		Common::Point pt(170, 260);
+		NpcMover *mover = new NpcMover();
+		scene->_object1.addMover(mover, &pt, this);
+		break;
+	}
+	case 9:
+		scene->_dyingKzin.setAction(&scene->_action7);
+		scene->_object1.remove();
+		_globals->_stripNum = 88;
+		_globals->_events.setCursor(CURSOR_WALK);
+		_globals->_player.enableControl();
+		scene->_assassin.setAction(&scene->_action8);
+		break;
+	}
+}
+
+void Scene40::Action3::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		_globals->_player.setAction(NULL);
+		_globals->_stripNum = 99;
+		_globals->_player.disableControl();
+		Common::Point pt(240, 195);
+		NpcMover *mover = new NpcMover();
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 1:
+		_globals->_player.setVisage(5010);
+		_globals->_player._strip = 2;
+		_globals->_player._frame = 1;
+		_globals->_player.animate(ANIM_MODE_4, 5, 1, this);
+		break;
+	case 2:
+		scene->_assassin.setStrip(2);
+		scene->_assassin.setFrame(1);
+		RING_INVENTORY._infoDisk._sceneNumber = 1;
+		_globals->_player.animate(ANIM_MODE_6, this);
+		break;
+	case 3:
+		_globals->_player.setVisage(0);
+		_globals->_player.animate(ANIM_MODE_1, NULL);
+		_globals->_player.setStrip(7);
+		_globals->_stripNum = 88;
+		_globals->_player.enableControl();
+		remove();
+		break;
+	}
+}
+
+void Scene40::Action4::signal() {
+	switch (_actionIndex++) {
+	case 0: {
+		Common::Point pt(178, 190);
+		NpcMover *mover = new NpcMover();
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 1:
+		_globals->_stripNum = 88;
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene40::Action5::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(_globals->_randomSource.getRandomNumber(119) + 120);
+		break;
+	case 1:
+		scene->_object2.animate(ANIM_MODE_8, 1, this);
+		_actionIndex = 0;
+	}
+}
+
+void Scene40::Action6::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		scene->_object1.postInit();
+		scene->_object1.setVisage(16);
+		scene->_object1.setStrip2(6);
+		scene->_object1._moveDiff = Common::Point(40, 40);
+		scene->_object1.setPosition(Common::Point(313, 53));
+		scene->_object1._moveRate = 60;
+
+		Common::Point pt(141, 194);
+		NpcMover *mover = new NpcMover();
+		scene->_object1.addMover(mover, &pt, NULL);
+		scene->_object1.animate(ANIM_MODE_5, NULL);
+
+		scene->_doorway.postInit();
+		scene->_doorway.setVisage(46);
+		scene->_doorway.setPosition(Common::Point(305, 61));
+		scene->_doorway.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(25);
+		break;
+	}
+	case 1:
+		scene->_soundHandler.play(28);
+		scene->_doorway.setPosition(Common::Point(148, 74));
+		scene->_doorway.setFrame(1);
+		scene->_doorway.setStrip(2);
+		scene->_doorway.animate(ANIM_MODE_5, this);
+		break;
+	case 2:
+		remove();
+		break;
+	}
+}
+
+void Scene40::Action7::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(_globals->_randomSource.getRandomNumber(499) + 500);
+		break;
+	case 1:
+		scene->_object7.postInit();
+		scene->_object7.setVisage(46);
+
+		if (_globals->_randomSource.getRandomNumber(32767) >= 16384) {
+			scene->_object7.setStrip(3);
+			scene->_object7.setPosition(Common::Point(15, 185));
+		} else {
+			scene->_object7.setPosition(Common::Point(305, 61));
+			scene->_object7.setFrame(15);
+		}
+		scene->_object7.animate(ANIM_MODE_5, this);
+		scene->_soundHandler.play(25);
+		break;
+	case 2:
+		scene->_object7.remove();
+		_actionIndex = 0;
+		setDelay(60);
+		break;
+	}
+}
+
+void Scene40::Action8::signal() {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(300);
+		break;
+	case 1:
+		_globals->_player.disableControl();
+
+		if ((_globals->_player._position.y >= 197) || (_globals->_player._visage)) {
+			_actionIndex = 1;
+			setDelay(30);
+		} else {
+			scene->_doorway.postInit();
+			scene->_doorway.setVisage(16);
+			scene->_doorway.setStrip2(6);
+			scene->_doorway.fixPriority(200);
+			scene->_doorway._moveRate = 60;
+
+			if (_globals->_player._position.x >= 145) {
+				scene->_doorway.fixPriority(-1);
+				scene->_doorway.setPosition(Common::Point(6, 157));
+			} else {
+				scene->_doorway.setPosition(Common::Point(313, 53));
+			}
+
+			scene->_doorway._moveDiff = Common::Point(40, 40);
+			Common::Point pt(_globals->_player._position.x, _globals->_player._position.y - 18);
+			NpcMover *mover = new NpcMover();
+			scene->_doorway.addMover(mover, &pt, this);
+			scene->_doorway.animate(ANIM_MODE_5, NULL);
+		}
+		break;
+	case 2:
+		scene->_doorway.remove();
+		_globals->_player.setVisage(40);
+		_globals->_player.setStrip(2);
+		_globals->_player.setFrame(1);
+		_globals->_player.animate(ANIM_MODE_5, this);
+		break;
+	case 3:
+		_globals->_soundHandler.play(77, this);
+		break;
+	case 4:
+		_globals->_game->endGame(40, 45);
+		remove();
+		break;
+	}
+}
+
+void Scene40::Action8::dispatch() {
+	if (_action)
+		_action->dispatch();
+
+	if (_delayFrames) {
+		uint32 frameNumber = _globals->_events.getFrameNumber();
+		if ((_startFrame + 60) < frameNumber) {
+			--_delayFrames;
+			_startFrame = frameNumber;
+
+			if (_delayFrames <= 0) {
+				_delayFrames = 0;
+				signal();
+			}
+		}
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene40::DyingKzin::doAction(int action) {
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(40, 44);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(40, 43);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(40, 12);
+		break;
+	case CURSOR_USE:
+		SceneItem::display2(40, 18);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene40::Assassin::doAction(int action) {
+	Scene40 *scene = (Scene40 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		if (scene->_assassin._visage == 44)
+			SceneItem::display2(40, 21);
+		else {
+			_globals->_player.disableControl();
+			Common::Point pt(230, 187);
+			NpcMover *mover = new NpcMover();
+			addMover(mover, &pt, NULL);
+			scene->setAction(&scene->_action2);
+		}
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(40, (scene->_assassin._visage == 44) ? 22 : 23);
+		break;
+	case CURSOR_LOOK:
+		if (scene->_assassin._visage != 44)
+			SceneItem::display2(40, 13);
+		else
+			SceneItem::display2(40, (RING_INVENTORY._infoDisk._sceneNumber == 1) ? 19 : 14);
+		break;
+	case CURSOR_USE:
+		if (scene->_assassin._visage != 44)
+			SceneItem::display2(40, 15);
+		else if (RING_INVENTORY._infoDisk._sceneNumber == 1)
+			SceneItem::display2(40, 19);
+		else {
+			_globals->_player.disableControl();
+			setAction(&scene->_action3);
+		}
+		break;
+	case CURSOR_TALK:
+		SceneItem::display2(40, 38);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene40::Item2::doAction(int action) {
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(40, 35);
+		_globals->_events.setCursor(CURSOR_WALK);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(40, 34);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(40, 8);
+		break;
+	case CURSOR_USE:
+		SceneItem::display2(40, 36);
+		break;
+	case CURSOR_TALK:
+		SceneItem::display2(40, 37);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene40::Item6::doAction(int action) {
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(40, 25);
+		_globals->_events.setCursor(CURSOR_WALK);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(40, 42);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(40, 6);
+		break;
+	case CURSOR_USE:
+		SceneItem::display2(40, 36);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene40::Scene40() :
+	_item1(2, OBJECT_SCANNER, 40, 24, OBJECT_STUNNER, 40, 25, CURSOR_LOOK, 40, 7, CURSOR_USE, 40, 16, LIST_END),
+	_item3(5, OBJECT_SCANNER, 40, 28, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 2, CURSOR_USE, 40, 30, LIST_END),
+	_item4(6, OBJECT_SCANNER, 40, 31, OBJECT_STUNNER, 40, 32, CURSOR_LOOK, 40, 5, CURSOR_USE, 40, 33, LIST_END),
+	_item5(0, CURSOR_LOOK, 40, 11, LIST_END),
+	_item7(4, OBJECT_SCANNER, 40, 26, OBJECT_STUNNER, 40, 27, CURSOR_LOOK, 40, 9, CURSOR_USE, 40, 17, LIST_END),
+	_item8(8, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_LOOK, 40, 3, CURSOR_USE, 40, 41, LIST_END) {
+}
+
+void Scene40::postInit(SceneObjectList *OwnerList) {
+	loadScene(40);
+	Scene::postInit();
+
+	setZoomPercents(0, 100, 200, 100);
+	_globals->_stripNum = 99;
+
+	_stripManager.addSpeaker(&_speakerQR);
+	_stripManager.addSpeaker(&_speakerSL);
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerSText);
+	_stripManager.addSpeaker(&_speakerGameText);
+
+	_speakerGameText._color1 = 9;
+	_speakerGameText.setTextPos(Common::Point(160, 30));
+	_speakerQText._npc = &_globals->_player;
+	_speakerSText._npc = &_object1;
+
+	_globals->_player.postInit();
+	_globals->_player.setVisage(0);
+	_globals->_player.animate(ANIM_MODE_1, NULL);
+	_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+	_globals->_player.setPosition(Common::Point(130, 220));
+	_globals->_player.disableControl();
+
+	if (_globals->_sceneManager._previousScene == 20) {
+		_globals->_soundHandler.play(24);
+		_globals->_player.setVisage(43);
+
+		_object1.postInit();
+		_object1.setVisage(41);
+		_object1.setPosition(Common::Point(105, 220));
+		_object2.postInit();
+		_object2.setVisage(41);
+		_object2.setStrip(6);
+		_object2.fixPriority(200);
+		_object2.setPosition(Common::Point(94, 189));
+		_object2.setAction(&_action5);
+
+		_object3.postInit();
+		_object3.setVisage(41);
+		_object3.setStrip(5);
+		_object3.fixPriority(205);
+		_object3.setPosition(Common::Point(110, 186));
+		_object3._numFrames = 2;
+		_object3.animate(ANIM_MODE_8, NULL, NULL);
+
+		_assassin.postInit();
+		_assassin.setPosition(Common::Point(-40, 191));
+		_globals->_sceneItems.push_back(&_assassin);
+
+		_dyingKzin.postInit();
+		_dyingKzin.setVisage(40);
+		_dyingKzin.setStrip(6);
+		_dyingKzin.setPosition(Common::Point(-90, 65));
+		_dyingKzin.fixPriority(170);
+
+		setAction(&_action1);
+	} else {
+		_doorway.postInit();
+		_doorway.setVisage(46);
+		_doorway.setPosition(Common::Point(148, 74));
+		_doorway.setStrip(2);
+		_doorway.setFrame(_doorway.getFrameCount());
+
+		_dyingKzin.postInit();
+		_dyingKzin.setVisage(40);
+		_dyingKzin.setPosition(Common::Point(205, 183));
+		_dyingKzin.fixPriority(170);
+		_dyingKzin._frame = 9;
+		_dyingKzin.setAction(&_action7);
+
+		_assassin.postInit();
+		_assassin.setVisage(44);
+		_assassin.setPosition(Common::Point(230, 187));
+		_assassin.setAction(&_action8);
+
+		if (RING_INVENTORY._infoDisk._sceneNumber == 40) {
+			_assassin.setStrip(1);
+			_assassin.setFrame(_assassin.getFrameCount());
+		} else {
+			_assassin.setStrip(2);
+		}
+
+		_globals->_sceneItems.push_back(&_assassin);
+		_globals->_player.setPosition(Common::Point(170, 220));
+
+		setAction(&_action4);
+	}
+
+	_item5.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+	_item6._sceneRegionId = 3;
+	_item2._sceneRegionId = 7;
+
+	_globals->_sceneItems.addItems(&_dyingKzin, &_item8, &_item1, &_item2, &_item3, &_item4,
+			&_item6, &_item7, &_item5, NULL);
+}
+
+void Scene40::signal() {
+	if (_sceneMode == 41)
+		_globals->_sceneManager.changeScene(50);
+}
+
+void Scene40::dispatch() {
+	if ((_globals->_stripNum == 88) && (_globals->_player._position.y >= 197)) {
+		_globals->_player.disableControl();
+		_globals->_stripNum = 0;
+		_globals->_player.setAction(NULL);
+		_sceneMode = 41;
+		setAction(&_sequenceManager, this, 41, &_globals->_player, NULL);
+
+		if (_globals->_sceneManager._previousScene == 20) {
+			_dyingKzin.setAction(&_action6);
+		}
+	}
+
+	Scene::dispatch();
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 50 - By Flycycles
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene50::Action1::signal() {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setAction(&scene->_sequenceManager, this, 54, &_globals->_player, NULL);
+		break;
+	case 1:
+		_globals->_events.setCursor(CURSOR_WALK);
+		scene->_stripManager.start(63, this);
+		break;
+	case 2:
+		if (scene->_stripManager._field2E8 != 107) {
+			_globals->_player.enableControl();
+			remove();
+		} else {
+			Common::Point pt(282, 139);
+			NpcMover *mover = new NpcMover();
+			_globals->_player.addMover(mover, &pt, this);
+		}
+		break;
+	case 3:
+		_globals->_stripNum = -1;
+		_globals->_sceneManager.changeScene(60);
+		break;
+	}
+}
+
+void Scene50::Action2::signal() {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		_globals->_player.disableControl();
+		scene->_stripManager.start(66, this);
+		break;
+	case 1: {
+		Common::Point pt(141, 142);
+		NpcMover *mover = new NpcMover();
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 2:
+		_globals->_sceneManager.changeScene(40);
+		remove();
+		break;
+	}
+}
+
+void Scene50::Action3::signal() {
+	switch (_actionIndex++) {
+	case 0: {
+		_globals->_player.disableControl();
+		Common::Point pt(136, 185);
+		NpcMover *mover = new NpcMover();
+		_globals->_player.addMover(mover, &pt, this);
+		break;
+	}
+	case 1:
+		_globals->_sceneManager.changeScene(60);
+		remove();
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene50::Object1::doAction(int action) {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(50, 20);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(50, 19);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(50, 4);
+		break;
+	case CURSOR_USE:
+		SceneItem::display2(50, 21);
+		break;
+	case CURSOR_TALK:
+		_globals->_player.disableControl();
+		scene->_sceneMode = 52;
+		scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene50::Object2::doAction(int action) {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(50, 11);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(50, 10);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(50, 1);
+		break;
+	case OBJECT_INFODISK:
+	case CURSOR_USE:
+		_globals->_stripNum = 50;
+		scene->setAction(&scene->_action3);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene50::Object3::doAction(int action) {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(50, 11);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(50, 10);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(50, 1);
+		break;
+	case OBJECT_INFODISK:
+	case CURSOR_USE:
+		SceneItem::display2(50, 8);
+		break;
+	case CURSOR_TALK:
+		_globals->_player.disableControl();
+		scene->_sceneMode = 52;
+		scene->setAction(&scene->_sequenceManager, scene, 52, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene50::Object4::doAction(int action) {
+	Scene50 *scene = (Scene50 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+		SceneItem::display2(50, 11);
+		break;
+	case OBJECT_SCANNER:
+		SceneItem::display2(50, 10);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(50, 1);
+		break;
+	case OBJECT_INFODISK:
+	case CURSOR_USE:
+		_globals->_player.disableControl();
+		_globals->_stripNum = 0;
+		scene->_sceneMode = 51;
+		scene->setAction(&scene->_sequenceManager, scene, 51, &_globals->_player, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene50::Scene50() :
+		_item0(0, CURSOR_LOOK, 50, 3, LIST_END),
+		_item1(0, OBJECT_SCANNER, 50, 15, CURSOR_USE, 50, 16, CURSOR_LOOK, 50, 3, LIST_END),
+		_item2(0, CURSOR_LOOK, 50, 7, LIST_END),
+		_item3(8, OBJECT_STUNNER, 50, 14, OBJECT_SCANNER, 50, 13, CURSOR_LOOK, 50, 3, LIST_END),
+		_item4(9, OBJECT_SCANNER, 40, 39, OBJECT_STUNNER, 40, 40, CURSOR_USE, 40, 41, CURSOR_LOOK, 50, 5, LIST_END),
+		_item5(10, OBJECT_SCANNER, 50, 17, OBJECT_STUNNER, 50, 18, CURSOR_LOOK, 50, 6, CURSOR_USE, 30, 8, LIST_END) {
+
+	_doorwayRect = Rect(80, 108, 160, 112);
+}
+
+void Scene50::postInit(SceneObjectList *OwnerList) {
+	loadScene(50);
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerSText);
+
+	_globals->_player.postInit();
+	_globals->_player.setVisage(0);
+	_globals->_player.animate(ANIM_MODE_1, NULL);
+	_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+	_globals->_player._canWalk = false;
+	_globals->_player.changeZoom(75);
+	_globals->_player._moveDiff.y = 3;
+
+	if (_globals->_sceneManager._previousScene == 40) {
+		_globals->_player.setPosition(Common::Point(128, 123));
+	} else if (_globals->_stripNum == 50) {
+		_globals->_player.setPosition(Common::Point(136, 185));
+	} else {
+		_globals->_player.setPosition(Common::Point(270, 143));
+	}
+
+	_object2.postInit();
+	_object2.setVisage(2331);
+	_object2.setStrip(6);
+	_object2.setPosition(Common::Point(136, 192));
+	_object2.fixPriority(200);
+
+	_object3.postInit();
+	_object3.setVisage(2337);
+	_object3.setStrip(6);
+	_object3.setPosition(Common::Point(260, 180));
+	_object3.fixPriority(200);
+
+	_object4.postInit();
+	_object4.setVisage(2331);
+	_object4.setStrip(6);
+	_object4.setPosition(Common::Point(295, 144));
+	_object4.fixPriority(178);
+
+	_globals->_sceneItems.addItems(&_object2, &_object3, &_object4, NULL);
+
+	if (!_globals->getFlag(101)) {
+		_globals->_player.disableControl();
+		_globals->setFlag(101);
+		setAction(&_action1);
+	} else {
+		_globals->_player.enableControl();
+
+		if (_globals->_sceneManager._previousScene == 40) {
+			_globals->_player.disableControl();
+			_sceneMode = 54;
+			setAction(&_sequenceManager, this, 54, &_globals->_player, NULL);
+		}
+	}
+
+	_item0.setBounds(Rect(200, 0, 320, 200));
+	_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item0, NULL);
+}
+
+void Scene50::signal() {
+	switch (_sceneMode) {
+	case 51:
+		_globals->_sceneManager.changeScene(60);
+		break;
+	case 55:
+		_globals->_sceneManager.changeScene(40);
+		break;
+	case 52:
+	case 54:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene50::dispatch() {
+	Scene::dispatch();
+
+	if ((_sceneMode != 55) && _doorwayRect.contains(_globals->_player._position)) {
+		// Player in house doorway, start player moving to within
+		_globals->_player.disableControl();
+		_sceneMode = 55;
+		Common::Point pt(89, 111);
+		NpcMover *mover = new NpcMover();
+		_globals->_player.addMover(mover, &pt, this);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 60 - Flycycle controls
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene60::Action1::signal() {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(3);
+		break;
+	case 1:
+		scene->_floppyDrive.postInit();
+		scene->_floppyDrive.setVisage(60);
+		scene->_floppyDrive.setStrip(7);
+		scene->_floppyDrive.setPosition(Common::Point(136, 65));
+		scene->_floppyDrive.animate(ANIM_MODE_5, this);
+
+		scene->_soundHandler1.play(35);
+		break;
+	case 2:
+		scene->_redLights.postInit();
+		scene->_redLights.setVisage(60);
+		scene->_redLights.setPosition(Common::Point(199, 186));
+		scene->_redLights.animate(ANIM_MODE_8, 0, NULL);
+		scene->_redLights._numFrames = 5;
+
+		scene->_controlButton.animate(ANIM_MODE_2, NULL);
+
+		if (!_globals->getFlag(83)) {
+			scene->_message.postInit();
+			scene->_message.setVisage(60);
+			scene->_message.setStrip2(3);
+			scene->_message.setFrame(2);
+			scene->_message.setPosition(Common::Point(148, 85));
+			scene->_message.animate(ANIM_MODE_2, NULL);
+			scene->_message._numFrames = 5;
+
+			_globals->_sceneItems.push_front(&scene->_message);
+			scene->_soundHandler2.play(38);
+		}
+
+		_globals->_events.setCursor(CURSOR_USE);
+		break;
+	case 3:
+		scene->_soundHandler2.play(37);
+		scene->loadScene(65);
+		scene->_message.remove();
+
+		if (_globals->_sceneObjects->contains(&scene->_redLights))
+			scene->_redLights.remove();
+
+		scene->_controlButton.remove();
+		scene->_slaveButton.remove();
+		scene->_masterButton.remove();
+		scene->_item1.remove();
+		scene->_item2.remove();
+
+		scene->_nextButton.postInit();
+		scene->_nextButton.setVisage(65);
+		scene->_nextButton.setPosition(Common::Point(118, 197));
+
+		scene->_prevButton.postInit();
+		scene->_prevButton.setVisage(65);
+		scene->_prevButton.setStrip(2);
+		scene->_prevButton.setPosition(Common::Point(160, 197));
+
+		scene->_exitButton.postInit();
+		scene->_exitButton.setVisage(65);
+		scene->_exitButton.setStrip(3);
+		scene->_exitButton.setPosition(Common::Point(202, 197));
+
+		scene->_rose.postInit();
+		scene->_rose.setVisage(65);
+		scene->_rose.setStrip(4);
+		scene->_rose.setFrame(1);
+		scene->_rose.setPosition(Common::Point(145, 165));
+
+		_globals->_sceneItems.push_front(&scene->_nextButton);
+		_globals->_sceneItems.push_front(&scene->_prevButton);
+		_globals->_sceneItems.push_front(&scene->_exitButton);
+		setDelay(10);
+
+		_globals->_events.setCursor(CURSOR_USE);
+		break;
+	case 4:
+		_globals->setFlag(90);
+		// Deliberate fall-through
+	case 5:
+	case 6:
+	case 7:
+		SceneItem::display(60, _actionIndex - 4, SET_Y, 40, SET_X, 25, SET_FONT, 75,
+			SET_EXT_BGCOLOR, -1, SET_FG_COLOR, 34, SET_POS_MODE, 0,
+			SET_WIDTH, 280, SET_KEEP_ONSCREEN, 1, LIST_END);
+		_globals->_events.setCursor(CURSOR_USE);
+		break;
+	case 9:
+		_globals->_player._uiEnabled = false;
+		RING_INVENTORY._infoDisk._sceneNumber = 1;
+
+		if (_globals->_sceneObjects->contains(&scene->_message))
+			scene->_message.remove();
+
+		scene->_controlButton.animate(ANIM_MODE_NONE);
+		scene->_controlButton.setFrame(1);
+		scene->_redLights.remove();
+
+		scene->_floppyDrive.postInit();
+		scene->_floppyDrive.setVisage(60);
+		scene->_floppyDrive.setStrip(7);
+		scene->_floppyDrive.setPosition(Common::Point(136, 65));
+		scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount());
+		scene->_floppyDrive.animate(ANIM_MODE_6, this);
+
+		scene->_soundHandler1.play(35);
+		scene->_soundHandler3.stop();
+
+		scene->_masterButton.setFrame(1);
+		scene->_masterButton._state = 0;
+
+		_globals->clearFlag(103);
+		_globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+		break;
+	case 10:
+		setDelay(60);
+		break;
+	case 11:
+		_globals->_player._uiEnabled = true;
+		scene->_floppyDrive.remove();
+		remove();
+		break;
+	case 8:
+	default:
+		break;
+	}
+}
+
+void Scene60::Action2::signal() {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+	case 2:
+		setDelay(3);
+		break;
+	case 1:
+		scene->_stripManager.start(66, this);
+		break;
+	case 3:
+		_globals->_sceneManager.changeScene(50);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene60::PrevObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 16);
+	} else if (action == CURSOR_USE) {
+		animate(ANIM_MODE_8, 1, NULL);
+
+		if (scene->_action1.getActionIndex() > 5) {
+			scene->_soundHandler3.play(36);
+			scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2);
+			scene->_action1.setDelay(1);
+		}
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::NextObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 17);
+	} else if (action == CURSOR_USE) {
+		animate(ANIM_MODE_8, 1, NULL);
+
+		if (scene->_action1.getActionIndex() < 8) {
+			scene->_soundHandler3.play(36);
+			scene->_action1.setDelay(1);
+		}
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::ExitObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 18);
+	} else if (action == CURSOR_USE) {
+		scene->_soundHandler3.play(36);
+		animate(ANIM_MODE_8, 1, NULL);
+		scene->_nextButton.remove();
+		scene->_prevButton.remove();
+		scene->_exitButton.remove();
+		scene->_rose.remove();
+
+		SceneItem::display(0, 0);
+		scene->loadScene(60);
+
+		scene->_controlButton.postInit();
+		scene->_controlButton.setVisage(60);
+		scene->_controlButton.setStrip(5);
+		scene->_controlButton.setPosition(Common::Point(233, 143));
+		scene->_controlButton.animate(ANIM_MODE_2, NULL);
+
+		scene->_slaveButton.postInit();
+		scene->_slaveButton.setVisage(60);
+		scene->_slaveButton.setStrip(8);
+		scene->_slaveButton.setPosition(Common::Point(143, 125));
+
+		scene->_masterButton.postInit();
+		scene->_masterButton.setVisage(60);
+		scene->_masterButton.setStrip(8);
+		scene->_masterButton.setPosition(Common::Point(143, 105));
+
+		_globals->_sceneItems.push_front(&scene->_masterButton);
+		_globals->_sceneItems.push_front(&scene->_slaveButton);
+
+		scene->_redLights.postInit();
+		scene->_redLights.setVisage(60);
+		scene->_redLights.setPosition(Common::Point(199, 186));
+		scene->_redLights.animate(ANIM_MODE_8, 0, NULL);
+		scene->_redLights._numFrames = 5;
+		scene->_redLights.setAction(&scene->_sequenceManager, scene, 61, NULL);
+
+		if (scene->_slaveButton._state)
+			scene->_slaveButton.setFrame(2);
+		if (scene->_masterButton._state)
+			scene->_masterButton.setFrame(2);
+
+		_globals->_sceneItems.push_front(&scene->_item1);
+		_globals->_sceneItems.push_front(&scene->_controlButton);
+		_globals->_sceneItems.push_front(&scene->_slaveButton);
+		_globals->_sceneItems.push_front(&scene->_masterButton);
+		_globals->_sceneItems.push_back(&scene->_item2);
+
+		_globals->gfxManager()._font.setFontNumber(2);
+		_globals->_sceneText._fontNumber = 2;
+
+		scene->_action1.setActionIndex(2);
+		scene->_action1.setDelay(1);
+		scene->_sceneMode = 9999;
+		scene->signal();
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::MessageObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 9);
+	} else if (action == CURSOR_USE) {
+		scene->_action1.setDelay(1);
+		_globals->setFlag(83);
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::ControlObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 11);
+	} else if (action == CURSOR_USE) {
+		if (_animateMode == ANIM_MODE_NONE)
+			SceneItem::display2(60, 14);
+		else if (!scene->_slaveButton._state) {
+			_globals->_soundHandler.play(40);
+			_globals->_soundHandler.holdAt(true);
+			_globals->_sceneManager.changeScene(20);
+		} else {
+			scene->_sceneMode = 15;
+			setAction(&scene->_sequenceManager, scene, 62, NULL);
+		}
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::SlaveObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 8);
+	} else if (action == CURSOR_USE) {
+		if (scene->_masterButton._state)
+			scene->_sceneMode = 19;
+		else if (_state) {
+			scene->_soundHandler3.stop();
+			animate(ANIM_MODE_6, NULL);
+			_globals->clearFlag(102);
+			_globals->clearFlag(!_globals->_stripNum ? 117 : 120);
+			_state = 0;
+			scene->_sceneMode = 9998;
+		} else {
+			scene->_soundHandler3.play(39);
+			_globals->setFlag(102);
+			_globals->setFlag(!_globals->_stripNum ? 117 : 120);
+			animate(ANIM_MODE_5, NULL);
+			_state = 1;
+			scene->_sceneMode = 9998;
+		}
+
+		setAction(&scene->_sequenceManager, scene, 62, NULL);
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::MasterObject::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 7);
+	} else if (action == CURSOR_USE) {
+		if (!scene->_controlButton._animateMode)
+			scene->_sceneMode = 14;
+		else if (scene->_slaveButton._state)
+			scene->_sceneMode = 20;
+		else if (_state) {
+			scene->_soundHandler3.stop();
+			animate(ANIM_MODE_6, NULL);
+			_state = 0;
+			_globals->clearFlag(103);
+			_globals->clearFlag(!_globals->_stripNum ? 116 : 119);
+			scene->_sceneMode = 9998;
+		} else {
+			scene->_soundHandler3.play(39);
+			animate(ANIM_MODE_5, NULL);
+			_state = 1;
+			_globals->setFlag(103);
+			_globals->setFlag(!_globals->_stripNum ? 116 : 119);
+			scene->_sceneMode = 9998;
+		}
+
+		setAction(&scene->_sequenceManager, scene, 62, NULL);
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+void Scene60::FloppyDrive::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		SceneItem::display2(60, 13);
+	} else if (action == CURSOR_USE) {
+		_globals->setFlag(!_globals->_stripNum ? 118 : 121);
+		scene->setAction(&scene->_action1);
+	} else {
+		SceneHotspot::doAction(action);
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene60::Item1::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_INFODISK:
+		RING_INVENTORY._infoDisk._sceneNumber = 60;
+		_globals->setFlag(!_globals->_stripNum ? 118 : 121);
+		scene->_sceneMode = 0;
+		scene->setAction(&scene->_action1);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(60, 10);
+		break;
+	case CURSOR_USE:
+		if (RING_INVENTORY._infoDisk._sceneNumber == 60) {
+			if (_globals->getFlag(118) && !_globals->_stripNum) {
+				_globals->clearFlag(118);
+				scene->setAction(&scene->_action1);
+				scene->_action1.setActionIndex(9);
+				scene->_action1.setDelay(1);
+			}
+			if (_globals->getFlag(121) && !_globals->_stripNum) {
+				_globals->clearFlag(121);
+				scene->setAction(&scene->_action1);
+				scene->_action1.setActionIndex(9);
+				scene->_action1.setDelay(1);
+			}
+		} else if (RING_INVENTORY._infoDisk._sceneNumber == 1) {
+			scene->_sceneMode = 0;
+			setAction(&scene->_sequenceManager, scene, 62, NULL);
+		} else {
+			scene->setAction(&scene->_action2);
+		}
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene60::Item::doAction(int action) {
+	Scene60 *scene = (Scene60 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_LOOK:
+		SceneItem::display2(60, _messageNum);
+		break;
+	case CURSOR_USE:
+		scene->_sceneMode = _sceneMode;
+		setAction(&scene->_sequenceManager, this, 62, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene60::Scene60() :
+		_item2(0, 12, 12),
+		_item3(8, 22, 23),
+		_item4(9, 24, 25),
+		_item5(10, 26, 27),
+		_item6(11, 28, 29) {
+}
+
+void Scene60::postInit(SceneObjectList *OwnerList) {
+	loadScene(60);
+	Scene::postInit();
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerSText);
+
+	_globals->_player._uiEnabled = true;
+	_globals->_events.setCursor(CURSOR_USE);
+
+	_slaveButton.postInit();
+	_slaveButton.setVisage(60);
+	_slaveButton.setStrip(8);
+	_slaveButton.setPosition(Common::Point(143, 125));
+	_slaveButton._state = 0;
+
+	_masterButton.postInit();
+	_masterButton.setVisage(60);
+	_masterButton.setStrip(8);
+	_masterButton.setPosition(Common::Point(143, 105));
+	_masterButton._state = 0;
+
+	_globals->_sceneItems.push_back(&_masterButton);
+	_globals->_sceneItems.push_back(&_slaveButton);
+
+	_controlButton.postInit();
+	_controlButton.setVisage(60);
+	_controlButton.setStrip(5);
+	_controlButton.setPosition(Common::Point(233, 143));
+	_globals->_sceneItems.push_back(&_controlButton);
+
+	if (_globals->_stripNum == -1) {
+		_globals->_stripNum = 0;
+	} else {
+		_globals->_player.disableControl();
+		_sceneMode = 9999;
+		setAction(&_sequenceManager, this, 61, NULL);
+	}
+
+	_item1.setBounds(Rect(130, 55, 174, 70));
+	_item2.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+
+	if (_globals->_stripNum == 0) {
+		if (_globals->getFlag(117)) {
+			_slaveButton._state = 1;
+			_slaveButton.setFrame(2);
+		}
+
+		if (_globals->getFlag(116)) {
+			_masterButton._state = 1;
+			_masterButton.setFrame(2);
+		}
+
+		if (_globals->getFlag(118)) {
+			_controlButton.animate(ANIM_MODE_2, NULL);
+
+			_redLights.postInit();
+			_redLights.setVisage(60);
+			_redLights.setPosition(Common::Point(199, 186));
+			_redLights.animate(ANIM_MODE_8, 0, NULL);
+
+			_soundHandler1.play(35);
+
+			if (!_globals->getFlag(83)) {
+				_message.postInit();
+				_message.setVisage(60);
+				_message.setStrip2(3);
+				_message.setFrame(2);
+				_message.setPosition(Common::Point(148, 85));
+				_message.animate(ANIM_MODE_2, NULL);
+				_message._numFrames = 5;
+				_globals->_sceneItems.push_front(&_message);
+
+				_soundHandler2.play(38);
+			}
+		}
+	} else {
+		if (_globals->getFlag(120)) {
+			_slaveButton._state = 1;
+			_slaveButton.setFrame(2);
+		}
+
+		if (_globals->getFlag(119)) {
+			_masterButton._state = 1;
+			_masterButton.setFrame(2);
+		}
+
+		if (_globals->getFlag(121)) {
+			_controlButton.animate(ANIM_MODE_2, NULL);
+
+			_redLights.postInit();
+			_redLights.setVisage(60);
+			_redLights.setPosition(Common::Point(199, 186));
+			_redLights.animate(ANIM_MODE_8, 0, NULL);
+			_redLights._numFrames = 5;
+
+			_soundHandler1.play(35);
+
+			if (!_globals->getFlag(83)) {
+				_message.postInit();
+				_message.setVisage(60);
+				_message.setStrip2(3);
+				_message.setFrame(2);
+				_message.setPosition(Common::Point(148, 85));
+				_message.animate(ANIM_MODE_2, NULL);
+				_message._numFrames = 5;
+				_globals->_sceneItems.push_front(&_message);
+
+				_soundHandler2.play(38);
+			}
+		}
+	}
+
+	_globals->_sceneItems.addItems(&_item3, &_item4, &_item5, &_item6,
+		&_item1, &_item2, NULL);
+}
+
+void Scene60::signal() {
+	if (_sceneMode != 0) {
+		if (_sceneMode == 9998) {
+			_globals->_events.setCursor(CURSOR_USE);
+		} else if (_sceneMode == 9999) {
+			_globals->_player._uiEnabled = true;
+			_globals->_events.setCursor(CURSOR_USE);
+
+			_gfxButton.setText(EXIT_MSG);
+			_gfxButton._bounds.center(160, 193);
+			_gfxButton.draw();
+			_gfxButton._bounds.expandPanes();
+		} else {
+			SceneItem::display2(60, _sceneMode);
+			_globals->_events.setCursor(CURSOR_USE);
+		}
+	}
+}
+
+void Scene60::process(Event &event) {
+	Scene::process(event);
+
+	if (_screenNumber == 60) {
+		if (_gfxButton.process(event))
+			_globals->_sceneManager.changeScene(50);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 90 - Shipyard Entrance
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene90::Action1::signal() {
+	Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(10);
+		break;
+	case 1:
+		_globals->_scenePalette.addRotation(64, 72, -1);
+		_globals->_events.setCursor(CURSOR_WALK);
+		scene->_stripManager.start(90, this);
+		break;
+	case 2:
+		setDelay(2);
+		break;
+	case 3: {
+		Common::Point pt(278, 191);
+		NpcMover *mover = new NpcMover();
+		scene->_object2.addMover(mover, &pt, this);
+		break;
+	}
+	case 4:
+		scene->_object2.setStrip(3);
+		setDelay(2);
+		break;
+	case 5:
+		scene->_soundHandler2.play(58);
+
+		if (scene->_stripManager._field2E8 == 220)
+			scene->_stripManager.start(91, this, scene);
+		else {
+			scene->_stripManager.start(_globals->getFlag(104) ? 93 : 92, this, scene);
+			_actionIndex = 7;
+		}
+		break;
+	case 6:
+		scene->_object2.animate(ANIM_MODE_NONE);
+		_globals->_player._uiEnabled = true;
+		break;
+	case 7:
+		scene->_object2.animate(ANIM_MODE_NONE);
+		_globals->_soundHandler.play(56);
+		scene->_object3.animate(ANIM_MODE_5, this);
+		break;
+	case 8: {
+		Common::Point pt(215, 127);
+		PlayerMover *mover = new PlayerMover();
+		scene->_object5.addMover(mover, &pt, this);
+		break;
+	}
+	case 9: {
+		Common::Point pt1(215, 127);
+		PlayerMover *mover1 = new PlayerMover();
+		scene->_object1.addMover(mover1, &pt1, this);
+		Common::Point pt2(86, 62);
+		PlayerMover *mover2 = new PlayerMover();
+		scene->_object5.addMover(mover2, &pt2, this);
+		break;
+	}
+	case 10: {
+		PlayerMover2 *mover = new PlayerMover2();
+		scene->_object1.addMover(mover, 10, 15, &scene->_object5);
+
+		if (!_globals->getFlag(104)) {
+			mover = new PlayerMover2();
+			scene->_object4.addMover(mover, 10, 15, &scene->_object1);
+		}
+		setDelay(60);
+		break;
+	}
+	case 11:
+		_globals->_soundHandler.play(57);
+		_globals->_soundHandler.play(68);
+		scene->_object3.animate(ANIM_MODE_6, NULL);
+
+		SceneItem::display(90, _globals->getFlag(104) ? 15 : 14,
+			SET_EXT_BGCOLOR, 13, SET_KEEP_ONSCREEN, -1, SET_X, 120, SET_Y, 20, LIST_END);
+		break;
+	case 12:
+		SceneItem::display(0, 0);
+		_globals->_scenePalette.clearListeners();
+		_globals->_sceneManager.changeScene(95);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene90::Object1::doAction(int action) {
+	Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_LOOK:
+		SceneItem::display2(90, 7);
+		break;
+	case CURSOR_USE:
+		_globals->_player.disableControl();
+		scene->_sceneMode = 97;
+		setAction(&scene->_sequenceManager, scene, 97, this, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+void Scene90::Object2::doAction(int action) {
+	Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_STUNNER:
+	case CURSOR_USE:
+		_globals->_player.disableControl();
+		scene->_object6.postInit();
+		scene->_object6.setVisage(90);
+		scene->_object6.setStrip(6);
+		scene->_object6.setPosition(Common::Point(184, 210));
+		scene->_object6.hide();
+
+		scene->_sceneMode = 91;
+		scene->_soundHandler1.play(59);
+		scene->_soundHandler1.holdAt(true);
+		scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL);
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display2(90, 8);
+		break;
+	case CURSOR_TALK:
+		_globals->_player.disableControl();
+		setAction(&scene->_sequenceManager, scene, 96, this, NULL);
+		break;
+	default:
+		SceneHotspot::doAction(action);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene90::Scene90() :
+		_item1(0, CURSOR_LOOK, 90, 9, LIST_END),
+		_item2(0, CURSOR_LOOK, 90, 10, LIST_END),
+		_item3(0, CURSOR_LOOK, 90, 11, LIST_END),
+		_object3(OBJECT_STUNNER, 90, 13, CURSOR_LOOK, 90, 12, CURSOR_USE, 90, 16, LIST_END),
+		_object4(CURSOR_LOOK, 90, 17, LIST_END),
+		_object5(CURSOR_LOOK, 90, 18, CURSOR_USE, 90, 19, LIST_END) {
+}
+
+void Scene90::stripCallback(int v) {
+	Scene90 *scene = (Scene90 *)_globals->_sceneManager._scene;
+
+	if (v == 1)
+		scene->_object2.animate(ANIM_MODE_7, NULL);
+	else if (v == 2)
+		scene->_object2.animate(ANIM_MODE_NONE);
+}
+
+void Scene90::postInit(SceneObjectList *OwnerList) {
+	loadScene(90);
+	Scene::postInit();
+
+	setZoomPercents(70, 10, 180, 100);
+	_stripManager.addSpeaker(&_speakerSText);
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerMText);
+	_stripManager.addSpeaker(&_speakerQL);
+	_stripManager.addSpeaker(&_speakerSR);
+
+	_speakerMText._npc = &_object2;
+	_speakerQText._textWidth = 160;
+	_speakerQText._npc = &_object5;
+	_speakerSText._npc = &_object1;
+
+	_object5.postInit();
+	_object5.setVisage(2333);
+	_object5.setObjectWrapper(new SceneObjectWrapper());
+	_object5._strip = 7;
+	_object5._moveDiff = Common::Point(22, 22);
+	_object5.setPosition(Common::Point(151, 177));
+	_object5.changeZoom(-1);
+	_globals->_sceneItems.push_back(&_object5);
+
+	_object1.postInit();
+	_object1.setVisage(2337);
+	_object1.setObjectWrapper(new SceneObjectWrapper());
+	_object1._strip = 4;
+	_object1._moveDiff = Common::Point(20, 20);
+	_object1.setPosition(Common::Point(212, 183));
+	_object1.changeZoom(-1);
+	_globals->_sceneItems.push_back(&_object1);
+
+	if (!_globals->getFlag(104)) {
+		_object4.postInit();
+		_object4.setVisage(2331);
+		_object4.setObjectWrapper(new SceneObjectWrapper());
+		_object4._strip = 4;
+		_object4._moveDiff = Common::Point(20, 20);
+		_object4.setPosition(Common::Point(251, 207));
+		_object4.changeZoom(-1);
+		_globals->_sceneItems.push_back(&_object4);
+	}
+
+	_object2.postInit();
+	_object2.setVisage(90);
+	_object2.animate(ANIM_MODE_1, NULL);
+	_object2.setPosition(Common::Point(315, 185));
+	_object2._strip = 2;
+	_globals->_sceneItems.push_back(&_object2);
+
+	_object3.postInit();
+	_object3.setVisage(90);
+	_object3.animate(ANIM_MODE_1, NULL);
+	_object3.setPosition(Common::Point(196, 181));
+	_object3.fixPriority(175);
+	_globals->_sceneItems.push_back(&_object3);
+
+	_globals->_player.disableControl();
+	_globals->_soundHandler.play(55);
+	_soundHandler1.play(52);
+	_soundHandler1.holdAt(true);
+
+	setAction(&_action1);
+
+	_item3.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+	_item1.setBounds(Rect(271, 65, 271, 186));
+	_item2.setBounds(Rect(0, 17, 124, 77));
+
+	_globals->_sceneItems.addItems(&_item1, &_item2, &_item3, NULL);
+}
+
+void Scene90::signal() {
+	switch (_sceneMode) {
+	case 91:
+		_sceneMode = 92;
+		_globals->_soundHandler.play(77, this);
+		break;
+	case 92:
+		_globals->_scenePalette.clearListeners();
+		_globals->_game->endGame(90, 6);
+		break;
+	case 96:
+		_globals->_player.enableControl();
+		break;
+	case 97:
+		_stripManager._field2E8 = 0;
+		_action1.setActionIndex(5);
+		_action1.setDelay(1);
+		break;
+	default:
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 95 - Ship Close-up
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene95::Action1::signal() {
+	Scene95 *scene = (Scene95 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		_state = 6;
+		setDelay(60);
+		break;
+	case 1:
+		if (_state) {
+			SceneItem::display(95, _state % 2, SET_FONT, 2,
+				SET_EXT_BGCOLOR, -1, SET_EXT_BGCOLOR, 20,
+				SET_WIDTH, 200, SET_KEEP_ONSCREEN, 1, SET_TEXT_MODE, 1, LIST_END);
+			--_state;
+			_actionIndex = 1;
+		}
+		setDelay(60);
+		break;
+	case 2: {
+		scene->_soundHandler.play(66);
+		scene->_object3._numFrames = 5;
+		scene->_object3.animate(ANIM_MODE_5, NULL);
+		SceneItem::display(0, 0);
+
+		Common::Point pt1(5, 198);
+		NpcMover *mover1 = new NpcMover();
+		_globals->_player.addMover(mover1, &pt1, this);
+
+		Common::Point pt2(9, 190);
+		NpcMover *mover2 = new NpcMover();
+		scene->_object1.addMover(mover2, &pt2, NULL);
+		break;
+	}
+	case 3: {
+		scene->_soundHandler.play(21);
+
+		Common::Point pt1(235, 72);
+		PlayerMover *mover1 = new PlayerMover();
+		_globals->_player.addMover(mover1, &pt1, NULL);
+
+		Common::Point pt2(235, 72);
+		PlayerMover *mover2 = new PlayerMover();
+		scene->_object1.addMover(mover2, &pt2, NULL);
+
+		SceneItem::display(95, 2, SET_Y, 45, SET_FONT, 2,
+			SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 13, SET_WIDTH, 200,
+			SET_KEEP_ONSCREEN, 1, LIST_END);
+		setDelay(240);
+		break;
+	}
+	case 4:
+		scene->_object3.remove();
+
+		SceneItem::display(95, 3, SET_Y, 45, SET_FONT, 2,
+			SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200,
+			SET_KEEP_ONSCREEN, 1, LIST_END);
+		setDelay(240);
+		break;
+	case 5:
+		SceneItem::display(95, 4, SET_Y, 45, SET_FONT, 2,
+			SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 35, SET_WIDTH, 200,
+			SET_KEEP_ONSCREEN, 1, LIST_END);
+		setDelay(240);
+		break;
+	case 6:
+		setDelay(20);
+		break;
+	case 7: {
+		SceneItem::display(0, 0);
+		_globals->_player.setVisage(92);
+		_globals->_player.setPosition(Common::Point(-25, 200));
+		scene->_object1.setVisage(91);
+		scene->_object1.setPosition(Common::Point(-22, 220));
+
+		scene->_soundHandler.play(21);
+
+		Common::Point pt1(5, 198);
+		NpcMover *mover1 = new NpcMover();
+		_globals->_player.addMover(mover1, &pt1, this);
+
+		Common::Point pt2(9, 190);
+		NpcMover *mover2 = new NpcMover();
+		scene->_object1.addMover(mover2, &pt2, NULL);
+		break;
+	}
+	case 8: {
+		Common::Point pt1(108, 112);
+		PlayerMover *mover1 = new PlayerMover();
+		_globals->_player.addMover(mover1, &pt1, this);
+
+		Common::Point pt2(108, 112);
+		PlayerMover *mover2 = new PlayerMover();
+		scene->_object1.addMover(mover2, &pt2, NULL);
+		break;
+	}
+	case 9:
+		_globals->_sceneManager.changeScene(2300);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene95::Scene95() {
+}
+
+void Scene95::postInit(SceneObjectList *OwnerList) {
+	loadScene(95);
+	Scene::postInit();
+	setZoomPercents(100, 10, 200, 100);
+
+	_globals->_player.postInit();
+	_globals->_player.setVisage(2337);
+	_globals->_player.setObjectWrapper(new SceneObjectWrapper());
+	_globals->_player._strip = 4;
+	_globals->_player._moveDiff = Common::Point(30, 30);
+	_globals->_player.setPosition(Common::Point(-35, 200));
+	_globals->_player.changeZoom(-1);
+	_globals->_player.disableControl();
+
+	_object1.postInit();
+	_object1.setVisage(2333);
+	_object1.setPosition(Common::Point(-22, 220));
+	_object1.animate(ANIM_MODE_1, NULL);
+	_object1.setObjectWrapper(new SceneObjectWrapper());
+	_object1._moveDiff = Common::Point(30, 30);
+	_object1.changeZoom(-1);
+
+	_object3.postInit();
+	_object3.setVisage(96);
+	_object3.setPosition(Common::Point(29, 198));
+
+	_soundHandler.play(67);
+	setAction(&_action1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 6100 - Sunflower navigation sequence
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene6100::Action1::signal() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		scene->showMessage(SCENE6100_CAREFUL, 13, this);
+		break;
+	case 1:
+		scene->showMessage(SCENE6100_TOUGHER, 35, this);
+		break;
+	case 2:
+		scene->showMessage(NULL, 0, NULL);
+		remove();
+		break;
+	}
+}
+
+void Scene6100::Action2::signal() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		scene->showMessage(SCENE6100_ONE_MORE_HIT, 13, this);
+		break;
+	case 1:
+		scene->showMessage(SCENE6100_DOING_BEST, 35, this);
+		break;
+	case 2:
+		scene->showMessage(NULL, 0, NULL);
+		remove();
+		break;
+	}
+}
+
+void Scene6100::Action3::signal() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		scene->_speed = 0;
+		setDelay(60);
+		break;
+	case 1:
+		_globals->_scenePalette.clearListeners();
+		scene->_fadePercent = 100;
+		_globals->_scenePalette.refresh();
+		scene->loadScene(9997);
+		scene->_object1.hide();
+		scene->_object2.hide();
+		scene->_object3.hide();
+		scene->_sunflower1.hide();
+		scene->_sunflower2.hide();
+		scene->_sunflower3.hide();
+		scene->_rocks.hide();
+		scene->_sceneText.hide();
+
+		_globals->_events.setCursor(CURSOR_WALK);
+		scene->_stripManager.start(8120, this);
+		break;
+	case 2:
+		scene->showMessage(SCENE6100_REPAIR, 7, this);
+		break;
+	case 3:
+		scene->showMessage(NULL, 0, NULL);
+		_globals->_events.setCursor(CURSOR_WALK);
+		scene->_stripManager.start(8130, this);
+		break;
+	case 4:
+		_globals->setFlag(76);
+		_globals->_sceneManager.changeScene(
+			(scene->_stripManager._field2E8 == 135) ? 6100 : 2320);
+		remove();
+		break;
+	}
+}
+
+void Scene6100::Action4::signal() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		scene->showMessage(SCENE6100_ROCKY_AREA, 13, this);
+		break;
+	case 1:
+		scene->showMessage(SCENE6100_REPLY, 35, this);
+		break;
+	case 2:
+		scene->showMessage(NULL, 0, NULL);
+		remove();
+		break;
+	}
+}
+
+void Scene6100::Action5::dispatch() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+	FloatSet zeroSet;
+	const double MULTIPLY_FACTOR = 0.01744;		// 2 * pi / 360
+
+	if (scene->_turnAmount) {
+		scene->_angle = (scene->_turnAmount + scene->_angle) % 360;
+
+		for (int objIndex = 1; objIndex <= 3; ++objIndex) {
+			SceneObject *obj = &scene->_object1;
+			if (objIndex == 2) obj = &scene->_object2;
+			if (objIndex == 3) obj = &scene->_object3;
+
+			obj->_position.x += scene->_turnAmount * 2;
+			if (obj->_position.x >= 320)
+				obj->_position.x -= 480;
+			if (obj->_position.x < -160)
+				obj->_position.x += 480;
+		}
+	}
+
+	scene->_object1._flags |= OBJFLAG_PANES;
+	scene->_object2._flags |= OBJFLAG_PANES;
+	scene->_object3._flags |= OBJFLAG_PANES;
+
+	double distance = scene->_speed;
+	double angle = (double)scene->_angle * MULTIPLY_FACTOR;
+	scene->_probe._floats._float1 += sin(angle) * distance;
+	scene->_probe._floats._float2 += cos(angle) * distance;
+
+	for (int idx = 0; idx < 4; ++idx) {
+		FloatSet tempSet = scene->_objList[idx]->_floats;
+		tempSet.add(-scene->_probe._floats._float1, -scene->_probe._floats._float2,
+			-scene->_probe._floats._float3);
+
+		tempSet.proc1(scene->_angle * MULTIPLY_FACTOR);
+
+		double sqrtVal = tempSet.sqrt(zeroSet);
+		if (sqrtVal != 0.0) {
+			scene->_objList[idx]->_position.y = static_cast<int>(13800.0 / sqrtVal + 62.0);
+		}
+
+		scene->_objList[idx]->_position.x = static_cast<int>(
+			 160.0 - (330.0 / (tempSet._float2 + 330.0) * tempSet._float1));
+		scene->_objList[idx]->dispatch();
+
+		if (tempSet._float2 < 0) {
+			scene->_objList[idx]->_position.y = 300;
+
+			if (idx != 3) {
+				scene->_objList[idx]->_floats._float1 =
+					_globals->_randomSource.getRandomNumber(199);
+				scene->_objList[idx]->_floats._float2 =
+					_globals->_randomSource.getRandomNumber(999) + 750.0;
+
+				scene->_objList[idx]->_floats.proc1(
+					-(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR);
+				scene->_objList[idx]->_floats.add(scene->_probe._floats._float1,
+					scene->_probe._floats._float2, scene->_probe._floats._float3);
+			}
+		}
+
+		if (idx == 3) {
+			scene->_rocksCheck = (ABS((int)tempSet._float1) < 100) && (tempSet._float2 > 0);
+		}
+
+		scene->_objList[idx]->_flags |= OBJFLAG_PANES;
+
+		if ((idx != 3) && (scene->_fadePercent == 100) &&
+				(tempSet.sqrt(zeroSet) < 150.0)) {
+			switch (scene->_hitCount++) {
+			case 0:
+				scene->_soundHandler.play(233);
+				scene->showMessage(NULL, 0, NULL);
+
+				if (!_globals->getFlag(76))
+					scene->_probe.setAction(&scene->_action1);
+				break;
+			case 1:
+				scene->_soundHandler.play(233);
+				scene->showMessage(NULL, 0, NULL);
+
+				if (!_globals->getFlag(76))
+					scene->_probe.setAction(&scene->_action2);
+				break;
+			case 2:
+				scene->_soundHandler.play(234);
+				scene->showMessage(NULL, 0, NULL);
+
+				if (!_globals->getFlag(76))
+					scene->_probe.setAction(NULL);
+				scene->setAction(&scene->_action3);
+				break;
+			}
+
+			_globals->_scenePalette.clearListeners();
+			scene->_fadePercent = 0;
+		}
+	}
+}
+
+void Scene6100::GetBoxAction::signal() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0: {
+		scene->_turnAmount = 0;
+		Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y + 10);
+		ProbeMover *mover = new ProbeMover();
+		scene->_probe.addMover(mover, &pt, NULL);
+		scene->_probe.show();
+		break;
+	}
+	case 1: {
+		scene->showMessage(SCENE6100_TAKE_CONTROLS, 35, this);
+		_globals->_scenePalette.clearListeners();
+
+		Common::Point pt(scene->_rocks._position.x, scene->_rocks._position.y - 10);
+		NpcMover *mover = new NpcMover();
+		scene->_probe.addMover(mover, &pt, NULL);
+		break;
+	}
+	case 2:
+		scene->_probe._percent = 4;
+		scene->showMessage(SCENE6100_SURPRISE, 13, this);
+		break;
+	case 3:
+		scene->showMessage(SCENE6100_SWEAT, 35, this);
+		break;
+	case 4:
+		scene->showMessage(SCENE6100_VERY_WELL, 13, this);
+		break;
+	case 5:
+		scene->showMessage(NULL, 0, NULL);
+		_globals->_sceneManager.changeScene(2320);
+		remove();
+	}
+}
+
+void Scene6100::GetBoxAction::dispatch() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	if (!scene->_probe._mover && (scene->_getBoxAction._actionIndex >= 1)) {
+		if (scene->_getBoxAction._actionIndex == 1) {
+			scene->_speed = 0;
+			scene->_getBoxAction.signal();
+		}
+
+		if (scene->_probe._percent > 4)
+			// Handle the probe disappearing into the rocks
+			scene->_probe._percent = scene->_probe._percent * 7 / 8;
+		scene->_probe._flags |= OBJFLAG_PANES;
+	}
+
+	Action::dispatch();
+}
+
+void Scene6100::Action7::signal() {
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(30);
+		break;
+	case 1:
+		setDelay(90);
+		break;
+	case 2:
+		_globals->_sceneManager.changeScene(2100);
+		remove();
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::Object::synchronize(Serializer &s) {
+	SceneObject::synchronize(s);
+
+	// Save the double fields of the FloatSet
+	s.syncAsDouble(_floats._float1);
+	s.syncAsDouble(_floats._float2);
+	s.syncAsDouble(_floats._float3);
+	s.syncAsDouble(_floats._float4);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::ProbeMover::dispatch() {
+	Scene6100 *scene = (Scene6100 *)_globals->_sceneManager._scene;
+
+	if (!dontMove()) {
+		if (scene->_speed > 0) {
+			scene->_action5.dispatch();
+			scene->_speed = (scene->_speed * 4) / 5;
+		}
+	}
+
+	NpcMover::dispatch();
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene6100::Item1::doAction(int action) {
+	SceneItem::display2(4000, 0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene6100::Scene6100(): Scene() {
+	_objList[0] = &_sunflower1;
+	_objList[1] = &_sunflower2;
+	_objList[2] = &_sunflower3;
+	_objList[3] = &_rocks;
+
+	_speed = 30;
+	_fadePercent = 100;
+	_rocksCheck = false;
+	_hitCount = 0;
+	_turnAmount = 0;
+	_angle = 0;
+	_msgActive = false;
+
+	_globals->_sceneHandler._delayTicks = 8;
+
+	_globals->_player.disableControl();
+	_globals->_events.setCursor(CURSOR_WALK);
+}
+
+void Scene6100::synchronize(Serializer &s) {
+	Scene::synchronize(s);
+
+	s.syncAsSint16LE(_speed);
+	s.syncAsSint16LE(_fadePercent);
+	s.syncAsByte(_rocksCheck);
+	s.syncAsByte(_msgActive);
+	s.syncAsSint16LE(_hitCount);
+	s.syncAsSint16LE(_turnAmount);
+	s.syncAsSint16LE(_angle);
+}
+
+void Scene6100::postInit(SceneObjectList *OwnerList) {
+	loadScene(6100);
+	Scene::postInit();
+	setZoomPercents(62, 2, 200, 425);
+
+	_stripManager.addSpeaker(&_speakerQR);
+	_stripManager.addSpeaker(&_speakerSL);
+
+	_object1.postInit();
+	_object1.setVisage(6100);
+	_object1._frame = 1;
+	_object1._strip = 4;
+	_object1.setPosition(Common::Point(0, 60));
+	_object1.fixPriority(1);
+
+	_object2.postInit();
+	_object2.setVisage(6100);
+	_object2._frame = 1;
+	_object2._strip = 4;
+	_object2.setPosition(Common::Point(160, 60));
+	_object2.fixPriority(1);
+
+	_object3.postInit();
+	_object3.setVisage(6100);
+	_object3._frame = 1;
+	_object3._strip = 4;
+	_object3.setPosition(Common::Point(320, 60));
+	_object3.fixPriority(1);
+
+	_rocks.postInit();
+	_rocks.setVisage(6100);
+	_rocks._frame = 1;
+	_rocks._strip = 3;
+	_rocks.setPosition(Common::Point(320, 0));
+	_rocks.fixPriority(2);
+	_rocks.changeZoom(-1);
+	_rocks._floats._float1 = 320.0;
+	_rocks._floats._float2 = 25000.0;
+	_rocks._floats._float3 = 0.0;
+
+	_probe.postInit();
+	_probe._moveDiff = Common::Point(15, 15);
+	_probe.setVisage(6100);
+	_probe._frame = 1;
+	_probe._strip = 5;
+	_probe.setPosition(Common::Point(160, 260));
+	_probe.fixPriority(3);
+	_probe._floats._float1 = 320.0;
+	_probe._floats._float2 = 0.0;
+	_probe._floats._float3 = 0.0;
+	_probe.hide();
+
+	int baseVal = 2000;
+	for (int idx = 0; idx < 3; ++idx) {
+		_objList[idx]->_floats._float1 = _globals->_randomSource.getRandomNumber(999);
+		_objList[idx]->_floats._float2 = baseVal;
+		_objList[idx]->_floats._float3 = 0.0;
+		baseVal += _globals->_randomSource.getRandomNumber(499);
+
+		_objList[idx]->postInit();
+		_objList[idx]->setVisage(6100);
+		_objList[idx]->_frame = 1;
+		_objList[idx]->_strip = 2;
+
+		_objList[idx]->setPosition(Common::Point(
+			_globals->_randomSource.getRandomNumber(319), 60));
+		_objList[idx]->fixPriority(1);
+		_objList[idx]->changeZoom(-1);
+	}
+
+	setAction(&_action5);
+	_globals->_scenePalette.addRotation(96, 143, -1);
+
+	if (!_globals->getFlag(76))
+		_probe.setAction(&_action4);
+
+	_globals->_soundHandler.play(231);
+}
+
+void Scene6100::remove() {
+	_globals->_player.disableControl();
+	_globals->_scenePalette.clearListeners();
+	Scene::remove();
+}
+
+void Scene6100::process(Event &event) {
+	Scene::process(event);
+
+	if (event.eventType == EVENT_KEYPRESS) {
+		// Handle incremental turning speeds with arrow keys
+		if ((event.kbd.keycode == Common::KEYCODE_LEFT) || (event.kbd.keycode == Common::KEYCODE_KP4)) {
+			_turnAmount = MIN(_turnAmount + 1, 8);
+		} else if ((event.kbd.keycode == Common::KEYCODE_RIGHT) || (event.kbd.keycode == Common::KEYCODE_KP6)) {
+			_turnAmount = MAX(_turnAmount - 1, -8);
+		}
+	}
+
+	if (_probe._action)
+		_probe._action->process(event);
+}
+
+void Scene6100::dispatch() {
+	Scene::dispatch();
+
+	if (_probe._action)
+		_probe._action->dispatch();
+
+	// Handle mouse controlling the turning
+	int changeAmount = (_globals->_events._mousePos.x - 160) / -20;
+	_turnAmount += (changeAmount - _turnAmount) / 2;
+
+	if (_fadePercent < 100) {
+		_fadePercent += 10;
+		if (_fadePercent >= 100) {
+			_globals->_scenePalette.addRotation(96, 143, -1);
+			_fadePercent = 100;
+		}
+
+		byte adjustData[] = {0xff, 0xff, 0xff, 0};
+		_globals->_scenePalette.fade(adjustData, false, _fadePercent);
+	}
+
+	if (_action != &_action3) {
+		// Display the distance remaining to the target
+		int distance = (int)_probe._floats.sqrt(_rocks._floats);
+		Common::String s = Common::String::format("%06d", distance);
+
+		_sceneText.setPosition(Common::Point(24, 160));
+		_sceneText._fontNumber = 0;
+		_sceneText._color1 = 35;
+		_sceneText.setup(s);
+	}
+
+	if (_rocksCheck && (_action == &_action5)) {
+		// Check whether the probe is close enough to the rocks
+		double distance = _probe._floats.sqrt(_rocks._floats);
+
+		if ((distance >= 300.0) && (distance <= 500.0))
+			setAction(&_getBoxAction);
+	}
+}
+
+void Scene6100::showMessage(const Common::String &msg, int color, Action *action) {
+	if (_msgActive) {
+		_msgActive = false;
+		_speaker1.removeText();
+	}
+
+	if (!msg.empty()) {
+		_msgActive = true;
+		_speaker1._textPos.x = 20;
+		_speaker1._textWidth = 280;
+		_speaker1._color1 = color;
+		_speaker1._action = action;
+		_speaker1.setText(msg);
+	}
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h
new file mode 100644
index 0000000..dd64e56
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes1.h
@@ -0,0 +1,538 @@
+/* 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_RINGWORLD_SCENES1_H
+#define TSAGE_RINGWORLD_SCENES1_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.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"
+
+namespace tSage {
+
+class Scene10 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+public:
+	Speaker _speakerSText;
+	Speaker _speakerQText;
+	Action1 _action1;
+	Action2 _action2;
+	SceneObject _object1, _object2, _object3;
+	SceneObject _object4, _object5, _object6;
+
+	virtual void stripCallback(int v);
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene15 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+		virtual void dispatch();
+	};
+public:
+	Action1 _action1;
+	SceneObject _object1;
+	ASound _soundHandler;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+};
+
+class Scene20 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action3 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action4 : public Action {
+	public:
+		virtual void signal();
+	};
+public:
+	SequenceManager _sequenceManager;
+	SpeakerQText _speakerQText;
+	SpeakerGameText _speakerGameText;
+	Action1 _action1;
+	Action2 _action2;
+	Action3 _action3;
+	Action4 _action4;
+	SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5;
+	ASound _sound;
+public:
+	Scene20();
+	virtual ~Scene20() {}
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+};
+
+class Scene30 : public Scene {
+	/* Scene objects */
+	// Doorway beam sensor
+	class BeamObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	// Doorway object
+	class DoorObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	// Kzin object
+	class KzinObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+
+	/* Actions */
+	class BeamAction : public Action {
+	public:
+		virtual void signal();
+	};
+	class KzinAction : public Action {
+	public:
+		virtual void signal();
+	};
+	class RingAction : public Action {
+	public:
+		virtual void signal();
+	};
+	class TalkAction : public Action {
+	public:
+		virtual void signal();
+	};
+
+public:
+	ASound _sound;
+	DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot;
+	BeamObject _beam;
+	DoorObject _door;
+	KzinObject _kzin;
+
+	BeamAction _beamAction;
+	KzinAction _kzinAction;
+	RingAction _ringAction;
+	TalkAction _talkAction;
+	SequenceManager _sequenceManager;
+
+	SpeakerSR _speakerSR;
+	SpeakerQL _speakerQL;
+	SpeakerSText _speakerSText;
+	SpeakerQText _speakerQText;
+public:
+	Scene30();
+	virtual ~Scene30() {}
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+};
+
+class Scene40 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action3 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action4 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action5 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action6 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action7 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action8 : public Action {
+	public:
+		virtual void signal();
+		virtual void dispatch();
+	};
+
+	/* Objects */
+	class DyingKzin : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Assassin : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+
+	/* Items */
+	class Item2 : public SceneHotspot {
+	public:
+		virtual void doAction(int action);
+	};
+	class Item6 : public SceneHotspot {
+	public:
+		virtual void doAction(int action);
+	};
+	class Item8 : public SceneHotspot {
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	SequenceManager _sequenceManager;
+	SpeakerSL _speakerSL;
+	SpeakerQR _speakerQR;
+	SpeakerQText _speakerQText;
+	SpeakerSText _speakerSText;
+	SpeakerGameText _speakerGameText;
+	ASound _soundHandler;
+	Action1 _action1;
+	Action2 _action2;
+	Action3 _action3;
+	Action4 _action4;
+	Action5 _action5;
+	Action6 _action6;
+	Action7 _action7;
+	Action8 _action8;
+	SceneObject _object1, _object2, _object3;
+	DyingKzin _dyingKzin;
+	Assassin _assassin;
+	SceneObject _doorway, _object7, _object8;
+	DisplayHotspot _item1;
+	Item2 _item2;
+	DisplayHotspot _item3, _item4, _item5;
+	Item6 _item6;
+	DisplayHotspot _item7, _item8;
+
+	Scene40();
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene50 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action3 : public Action {
+	public:
+		virtual void signal();
+	};
+
+	/* Objects */
+	class Object1 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Object2 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Object3 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Object4 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+
+public:
+	SequenceManager _sequenceManager;
+	Action1 _action1;
+	Action2 _action2;
+	Action3 _action3;
+	Object1 _object1;
+	Object2 _object2;
+	Object3 _object3;
+	Object4 _object4;
+	Rect _doorwayRect;
+	SpeakerSText _speakerSText;
+	SpeakerQText _speakerQText;
+	DisplayHotspot _item0, _item1, _item2;
+	DisplayHotspot _item3, _item4, _item5;
+
+	Scene50();
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene60 : public Scene {
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+	class PrevObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class NextObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class ExitObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class MessageObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class ControlObject : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class SlaveObject : public SceneObjectExt {
+	public:
+		virtual void doAction(int action);
+	};
+	class MasterObject : public SceneObjectExt {
+	public:
+		virtual void doAction(int action);
+	};
+	class FloppyDrive : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Item1 : public SceneHotspot {
+	public:
+		virtual void doAction(int action);
+	};
+	class Item : public SceneHotspot {
+	public:
+		int _messageNum, _sceneMode;
+
+		Item(int sceneRegionId, int messageNum, int sceneMode) {
+			_sceneRegionId = sceneRegionId;
+			_messageNum = messageNum;
+			_sceneMode = sceneMode;
+		}
+		virtual void doAction(int action);
+	};
+
+public:
+	GfxButton _gfxButton;
+	SequenceManager _sequenceManager;
+	SpeakerQText _speakerQText;
+	SpeakerSText _speakerSText;
+	Action1 _action1;
+	Action2 _action2;
+	SceneObject _rose;
+	PrevObject _prevButton;
+	NextObject _nextButton;
+	ExitObject _exitButton;
+	MessageObject _message;
+	ControlObject _controlButton;
+	SlaveObject _slaveButton;
+	MasterObject _masterButton;
+	FloppyDrive _floppyDrive;
+	SceneObject _redLights;
+	Item1 _item1;
+	Item _item2, _item3, _item4, _item5, _item6;
+	ASound _soundHandler1;
+	ASound _soundHandler2;
+	ASound _soundHandler3;
+
+	Scene60();
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void process(Event &event);
+};
+
+class Scene90 : public Scene {
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Object1 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+	class Object2 : public SceneObject {
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	SequenceManager _sequenceManager;
+	SpeakerSText _speakerSText;
+	SpeakerQText _speakerQText;
+	SpeakerQL _speakerQL;
+	SpeakerSR _speakerSR;
+	SpeakerMText _speakerMText;
+	Action1 _action1;
+	Object1 _object1;
+	Object2 _object2;
+	DisplayObject _object3, _object4, _object5;
+	SceneObject _object6;
+	DisplayHotspot _item1, _item2, _item3;
+	ASound _soundHandler1, _soundHandler2;
+
+	Scene90();
+
+	virtual void stripCallback(int v);
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+};
+
+class Scene95 : public Scene {
+	class Action1 : public ActionExt {
+	public:
+		virtual void signal();
+	};
+
+public:
+	Action1 _action1;
+	SceneObject _object1, _object2, _object3;
+	ASound _soundHandler;
+
+	Scene95();
+	virtual void postInit(SceneObjectList *OwnerList);
+};
+
+class Scene6100 : public Scene {
+	/* Actions */
+	class Action1 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action2 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action3 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action4 : public Action {
+	public:
+		virtual void signal();
+	};
+	class Action5 : public Action {
+	public:
+		virtual void dispatch();
+	};
+	class GetBoxAction : public Action {
+	public:
+		virtual void signal();
+		virtual void dispatch();
+	};
+	class Action7 : public Action {
+	public:
+		virtual void signal();
+	};
+
+	/* Objects */
+	class Object : public SceneObject {
+	public:
+		FloatSet _floats;
+
+		virtual void synchronize(Serializer &s);
+	};
+	class ProbeMover : public NpcMover {
+	public:
+		virtual void dispatch();
+	};
+
+	/* Items */
+	class Item1 : public SceneItem {
+	public:
+		virtual void doAction(int action);
+	};
+
+public:
+	Action1 _action1;
+	Action2 _action2;
+	Action3 _action3;
+	Action4 _action4;
+	Action5 _action5;
+	GetBoxAction _getBoxAction;
+	Action7 _action7;
+	ASound _soundHandler;
+	Speaker _speaker1;
+	SpeakerQR _speakerQR;
+	SpeakerSL _speakerSL;
+	SceneObject _object1, _object2, _object3;
+	Object _rocks, _probe;
+	Object _sunflower1, _sunflower2, _sunflower3;
+	SceneText _sceneText;
+	SceneItem _item1;
+
+	int _turnAmount, _angle, _speed, _fadePercent;
+	int _hitCount;
+	bool _rocksCheck;
+	Object *_objList[4];
+	bool _msgActive;
+
+	Scene6100();
+	virtual void synchronize(Serializer &s);
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void remove();
+	virtual void process(Event &event);
+	virtual void dispatch();
+	void showMessage(const Common::String &msg, int color, Action *action);
+
+};
+
+} // End of namespace tSage
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp
new file mode 100644
index 0000000..1cff5d0
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes10.cpp
@@ -0,0 +1,2089 @@
+/* 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/ringworld/ringworld_scenes10.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/staticres.h"
+
+namespace tSage {
+
+Scene2::Scene2() : Scene() {
+	_sceneState = 0;
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Object9350::postInit(SceneObjectList *OwnerList) {
+	//SceneObject::postInit(&_globals->_sceneManager._altSceneObjects);
+	SceneObject::postInit(OwnerList);
+}
+
+void Object9350::draw() {
+	reposition();
+	Rect destRect = _bounds;
+	destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
+	Region *priorityRegion = _globals->_sceneManager._scene->_priorities.find(_globals->_sceneManager._scene->_stripManager._stripNum);
+	GfxSurface frame = getFrame();
+	_globals->gfxManager().copyFrom(frame, destRect, priorityRegion);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9100 - Near beach: Slave washing clothes
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9100::SceneHotspot1::doAction(int action) {
+	Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_TALK) {
+		if (_globals->getFlag(23)) {
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9104;
+		} else {
+			_globals->setFlag(23);
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9105;
+		}
+		scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, &scene->_object5, &scene->_object6, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9100::dispatch() {
+	Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+	if (!_action) {
+		if (_globals->_player._position.x < 25) {
+			_globals->_player.disableControl();
+			if (!_globals->getFlag(23) || _globals->getFlag(11))
+				_sceneMode = 9106;
+			else {
+				_sceneMode = 9108;
+				_globals->setFlag(11);
+			}
+
+			scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &_globals->_player, NULL);
+		}
+	} else {
+		Scene::dispatch();
+	}
+}
+
+void Scene9100::signal() {
+	Scene9100 *scene = (Scene9100 *)_globals->_sceneManager._scene;
+
+	switch (scene->_sceneMode) {
+	case 9102:
+	case 9106:
+	case 9108:
+		_globals->_sceneManager.changeScene(9150);
+		break;
+	case 9105:
+		_sceneHotspot3.remove();
+	// No break on purpose
+	case 9103:
+	case 9104:
+	case 9107:
+	case 9109:
+	default:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene9100::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+	_object1.postInit();
+	_object1.setVisage(9100);
+	_object1._strip = 1;
+	_object1._numFrames = 6;
+	_object1.setPosition(Common::Point(279, 132));
+	_object1.animate(ANIM_MODE_2, NULL);
+	_object1.fixPriority(10);
+
+	_globals->_player.postInit();
+
+	_object2.postInit();
+	_object2.hide();
+
+	_object3.postInit();
+	_object3.hide();
+
+	_object4.postInit();
+	_object4.hide();
+
+	_object5.postInit();
+	_object5.hide();
+
+	if (!_globals->getFlag(23)) {
+		_object6.postInit();
+		_object6.setVisage(9111);
+		_object6.setStrip(6);
+		_object6.setFrame(1);
+		_object6.setPosition(Common::Point(138, 166));
+		_sceneHotspot3.setup(145, 125, 166, 156, 9100, 40, 43);
+	}
+	_sceneHotspot1.setup(140, 176, 185, 215, 9100, 36, 37);
+	_sceneHotspot2.setup(161, 138, 182, 175, 9100, 38, 39);
+	_sceneHotspot4.setup(37, 196, 47, 320, 9100, 44, -1);
+	_sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46);
+	_sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48);
+
+	_globals->_soundHandler.play(251);
+	if (_globals->_sceneManager._previousScene == 9150) {
+		if (_globals->getFlag(20)) {
+			_globals->_player.disableControl();
+			if (_globals->getFlag(11))
+				_sceneMode = 9107;
+			else
+				_sceneMode = 9109;
+			setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object5, NULL);
+		} else {
+			_sceneMode = 9103;
+			_globals->_player.disableControl();
+			setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+			_globals->setFlag(20);
+		}
+	} else {
+		_sceneMode = 9102;
+		_globals->_player.disableControl();
+		setAction(&_sequenceManager, this, _sceneMode, &_globals->_player, &_object2, &_object3, &_object4, &_object5, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9150 - Castle: Outside the bulwarks
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9150::Object3::signal() {
+	switch (_signalFlag++) {
+	case 0:
+		_timer = 10 + _globals->_randomSource.getRandomNumber(90);
+		break;
+	default:
+		animate(ANIM_MODE_5, this);
+		_signalFlag = 0;
+		break;
+	}
+}
+
+void Scene9150::Object3::dispatch() {
+	SceneObject::dispatch();
+	if ((_timer != 0) && (--_timer == 0))
+		signal();
+}
+
+void Scene9150::signal() {
+	switch (_sceneMode) {
+	case 9151:
+	case 9157:
+		_globals->_sceneManager.changeScene(9100);
+		break;
+	case 9153:
+		_globals->_sceneManager.changeScene(9300);
+		break;
+	case 9152:
+	case 9155:
+	case 9156:
+		_globals->_player.enableControl();
+		break;
+	case 9154:
+	default:
+		break;
+	}
+}
+
+void Scene9150::dispatch() {
+
+	if ((_sceneState != 0) && (_sceneBounds.left == 0)) {
+		_object3._timer = 0;
+		_sceneState = 0;
+		_object3.setAction(&_sequenceManager2, NULL, 9154, &_object3, NULL);
+		_sceneHotspot10.remove();
+	}
+
+	if (_action) {
+		_action->dispatch();
+	} else {
+		if (_globals->_player._position.x >= 160) {
+			if (_globals->_player._position.x > 630) {
+				_globals->_player.disableControl();
+				_sceneMode = 9157;
+				setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+			}
+		} else {
+			_globals->_player.disableControl();
+			if (_globals->getFlag(11)) {
+				_globals->_soundHandler.play(286);
+				_sceneMode = 9153;
+			} else {
+				_sceneMode = 9156;
+			}
+			setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+		}
+	}
+}
+
+void Scene9150::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+	_globals->_player.postInit();
+
+	_object3.postInit();
+	_sceneState = 1;
+	_object3.setVisage(9151);
+	_object3._strip = 1;
+	_object3._frame = 1;
+	_object3.setPosition(Common::Point(312, 95));
+	_object3.signal();
+
+	_sceneHotspot1.setup(0, 0, 200, 94, 9150, 46, -1);
+	_sceneHotspot2.setup(51, 90, 118, 230, 9150, 47, -1);
+	_sceneHotspot3.setup(182, 104, 200, 320, 9150, 48, 49);
+	_sceneHotspot4.setup(103, 292, 152, 314, 9150, 50, 51);
+	_sceneHotspot5.setup(115, 350, 160, 374, 9150, 52, 53);
+	_sceneHotspot6.setup(0, 471, 200, 531, 9150, 54, 55);
+	_sceneHotspot7.setup(170, 320, 185, 640, 9150, 56, -1);
+	_sceneHotspot9.setup(157, 107, 186, 320, 9150, 56, -1);
+	_sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1);
+	_sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59);
+
+	_globals->_soundHandler.play(285);
+	_globals->_player.disableControl();
+
+	if (_globals->getFlag(20)) {
+		// Walking alone
+		_globals->_scrollFollower = &_globals->_player;
+		if (_globals->getFlag(11))
+			// Hero wearing peasan suit
+			_sceneMode = 9155;
+		else
+			// Hero wearing Purple suit
+			_sceneMode = 9152;
+		setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, NULL);
+	} else {
+		// Walking with the tiger
+		_sceneMode = 9151;
+		_object2.postInit();
+		_object2.hide();
+		_object1.postInit();
+		setAction(&_sequenceManager1, this, _sceneMode, &_globals->_player, &_object1, &_object2, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9200 - Castle: Near the fountain
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9200::SceneHotspot1::doAction(int action) {
+	Scene9200 *scene = (Scene9200 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_TUNIC) {
+		_globals->_player.disableControl();
+		if (_globals->getFlag(93)) {
+			scene->_sceneState = 9214;
+			scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+		} else {
+			_globals->setFlag(93);
+			scene->_sceneState = 9213;
+			scene->setAction(&scene->_sequenceManager, scene, 9213, &_globals->_player, &scene->_object2, NULL);
+		}
+	} else if (action <= 100) {
+		_globals->_player.disableControl();
+		scene->_sceneState = 9214;
+		scene->setAction(&scene->_sequenceManager, scene, 9214, &_globals->_player, &scene->_object2, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9200::signal() {
+	switch (_sceneState++) {
+	case 9207:
+		_globals->_sceneManager.changeScene(9700);
+		break;
+	case 9208:
+	case 9211:
+	case 9212:
+		_globals->_sceneManager.changeScene(9500);
+		break;
+	case 9209:
+		_globals->_sceneManager.changeScene(9360);
+		break;
+	case 9210:
+		_hotspot1.remove();
+	// No break on purpose
+	case 9201:
+	case 9202:
+	case 9203:
+	case 9204:
+	case 9205:
+	case 9206:
+	default:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene9200::process(Event &event) {
+	Scene::process(event);
+}
+
+void Scene9200::dispatch() {
+//	Rect rect9200 = Rect(320, 175, 250, 154);
+	Rect rect9200 = Rect(250, 154, 320, 175);
+
+	if (_action) {
+		_action->dispatch();
+	} else {
+		if ( (_globals->_player._position.x <= 0) || ((_globals->_player._position.x < 100) && (_globals->_player._position.y > 199))) {
+				_globals->_player.disableControl();
+				_sceneState = 9209;
+				setAction(&_sequenceManager, this, 9209, &_globals->_player, &_object2, &_object3, NULL);
+		} else {
+			if (rect9200.contains(_globals->_player._position)) {
+				if (_globals->getFlag(93)) {
+					if (_globals->getFlag(86)) {
+						_sceneState = 9215;
+						setAction(&_sequenceManager, this, 9215, &_globals->_player, &_object2, &_object3, NULL);
+					} else {
+						_sceneState = 9208;
+						setAction(&_sequenceManager, this, 9208, &_globals->_player, &_object2, &_object3, NULL);
+					}
+				} else {
+					_globals->_player.disableControl();
+					_sceneState = 9204;
+					setAction(&_sequenceManager, this, 9204, &_globals->_player, &_object2, &_object3, NULL);
+				}
+			} else {
+				if (_globals->_player._position.y < 140) {
+					_globals->_player.disableControl();
+					_sceneState = 9207;
+					setAction(&_sequenceManager, this, 9207, &_globals->_player, &_object2, &_object3, NULL);
+				}
+			}
+		}
+	}
+}
+
+void Scene9200::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(130, 50, 200, 150);
+
+	_globals->_player.postInit();
+	_object3.postInit();
+	_object3.hide();
+	_object1.postInit();
+	// Water animation
+	_object1.setVisage(9200);
+	_object1._strip = 3;
+	_object1.animate(ANIM_MODE_2, NULL);
+	_object1.setPosition(Common::Point(132, 114));
+	_object1.fixPriority(140);
+	_soundHandler.play(297);
+
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerGR);
+	_stripManager.addSpeaker(&_speakerGText);
+
+	if (!_globals->getFlag(86)) {
+		_object2.postInit();
+		_hotspot1.setup(96, 194, 160, 234, 9200, 29, 31);
+	}
+	_hotspot2.setup(164, 0, 200, 282, 9200, 0, 1);
+	_hotspot3.setup(140, 39, 165, 153, 9200, 2, 3);
+	_hotspot4.setup(92, 122, 139, 152, 9200, 4, 5);
+	_hotspot5.setup(33, 20, 142, 115, 9200, 6, 7);
+	_hotspot6.setup(104, 235, 153, 265, 9200, 8, 9);
+	_hotspot7.setup(107, 262, 153, 286, 9200, 10, 11);
+	_hotspot8.setup(69, 276, 164, 320, 9200, 12, 13);
+
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.disableControl();
+
+	switch (_globals->_sceneManager._previousScene) {
+	case 9500:
+		if (_globals->getFlag(85)) {
+			if (RING_INVENTORY._helmet._sceneNumber == 1) {
+				_globals->setFlag(86);
+				_globals->_player.disableControl();
+				_sceneState = 9210;
+				setAction(&_sequenceManager, this, 9210, &_globals->_player, &_object2, &_object3, NULL);
+			} else {
+				_globals->_player.disableControl();
+				_sceneState = 9212;
+				setAction(&_sequenceManager, this, 9212, &_globals->_player, &_object2, &_object3, NULL);
+			}
+		} else {
+			if (RING_INVENTORY._helmet._sceneNumber == 1) {
+				_globals->_player.disableControl();
+				_sceneState = 9211;
+				setAction(&_sequenceManager, this, 9211, &_globals->_player, &_object2, &_object3, NULL);
+			} else {
+				_globals->_player.disableControl();
+				_sceneState = 9202;
+				setAction(&_sequenceManager, this, 9202, &_globals->_player, &_object2, &_object3, NULL);
+			}
+		}
+		break;
+	case 9700:
+		if (_globals->getFlag(86)) {
+			_sceneState = 9206;
+			setAction(&_sequenceManager, this, 9206, &_globals->_player, &_object2, &_object3, NULL);
+		} else {
+			_sceneState = 9203;
+			setAction(&_sequenceManager, this, 9203, &_globals->_player, &_object2, &_object3, NULL);
+		}
+		break;
+	case 9360:
+	default:
+		if (_globals->getFlag(86)) {
+			_sceneState = 9205;
+			setAction(&_sequenceManager, this, 9205, &_globals->_player, &_object2, &_object3, NULL);
+		} else {
+			_sceneState = 9201;
+			setAction(&_sequenceManager, this, 9201, &_globals->_player, &_object2, &_object3, NULL);
+		}
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9300 - Castle: In front of a large guarded door
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9300::signal() {
+	switch (_sceneMode++) {
+	case 9301:
+		_globals->setFlag(84);
+		// No break on purpose
+	case 9303:
+		_globals->_soundHandler.play(295);
+		_globals->_sceneManager.changeScene(9350);
+		break;
+	case 9302:
+		_globals->_player.enableControl();
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9300::dispatch() {
+	if (_action) {
+		_action->dispatch();
+	} else if (_globals->_player._position.y < 145) {
+		_globals->_player.disableControl();
+		_sceneMode = 9303;
+		setAction(&_sequenceManager, this, 9303, &_globals->_player, &_object1, &_object2, NULL);
+	}
+}
+
+void Scene9300::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(130, 75, 230, 150);
+
+	_sceneMode = 0;
+	_globals->_player.postInit();
+	_globals->_player.changeZoom(-1);
+	_object1.postInit();
+	_object2.postInit();
+	_globals->_soundHandler.play(289);
+
+	_hotspot1.setup(35, 142, 76, 212, 9300, 0, 1);
+	_hotspot2.setup(28, 90, 81, 143, 9300, 2, 3);
+	_hotspot3.setup(78, 142, 146, 216, 9300, 4, 5);
+	_hotspot4.setup(3, 43, 91, 74, 9300, 6, 7);
+	_hotspot5.setup(82, 19, 157, 65, 9300, 8, 9);
+	_hotspot6.setup(5, 218, 84, 274, 9300, 10, 11);
+	_hotspot7.setup(86, 233, 168, 293, 9300, 12, 13);
+	_hotspot8.setup(157, 0, 200, 230, 9300, 14, 15);
+	_hotspot9.setup(169, 227, 200, 320, 9300, 16, 17);
+	_hotspot10.setup(145, 97, 166, 225, 9300, 18, 19);
+	_hotspot11.setup(81, 75, 145, 145, 9300, 20, 21);
+	_hotspot12.setup(0, 0, 94, 35, 9300, 22, 23);
+	_hotspot13.setup(12, 268, 149, 320, 9300, 24, 25);
+
+	if (_globals->_sceneManager._previousScene == 9350) {
+		_globals->_player.disableControl();
+		_sceneMode = 9302;
+		setAction(&_sequenceManager, this, 9302, &_globals->_player, &_object1, &_object2, NULL);
+	} else {
+		_globals->_player.disableControl();
+		_sceneMode = 9301;
+		setAction(&_sequenceManager, this, 9301, &_globals->_player, &_object1, &_object2, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9350 - Castle: In a hallway
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9350::signal() {
+	switch (_sceneState ++) {
+	case 0:
+	case 9352:
+	case 9353:
+	case 9354:
+		_globals->_player.enableControl();
+		break;
+	case 9355:
+		_globals->_sceneManager.changeScene(9300);
+		break;
+	case 9356:
+		_globals->_sceneManager.changeScene(9360);
+		break;
+	case 9357:
+	case 9359:
+		_globals->_sceneManager.changeScene(9400);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9350::dispatch() {
+	if (_action == 0) {
+		if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
+			_globals->_player.disableControl();
+			_sceneState = 9356;
+			setAction(&_sequenceManager, this, 9356, &_globals->_player, &_object2, NULL);
+		} else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
+			_globals->_player.disableControl();
+			_sceneState = 9357;
+			setAction(&_sequenceManager, this, 9357, &_globals->_player, &_object2, NULL);
+		} else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
+			_globals->_player.disableControl();
+			_sceneState = 9355;
+			setAction(&_sequenceManager, this, 9355, &_globals->_player, &_object2, NULL);
+		}
+	} else {
+		Scene::dispatch();
+	}
+}
+
+void Scene9350::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(95, 80, 200, 100);
+	_globals->_player.postInit();
+
+	_object1.setup(9351, 1, 3, 139, 97, 0);
+	_sceneHotspot1.setup(42, 0, 97, 60, 9350, 0, -1);
+	_sceneHotspot2.setup(37, 205, 82, 256, 9350, 0, -1);
+	_sceneHotspot3.setup(29, 93, 92, 174, 9350, 1, -1);
+	_sceneHotspot4.setup(0, 308, 109, 320, 9350, 2, -1);
+	_sceneHotspot5.setup(0, 0, 200, 320, 9350, 3, -1);
+
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.disableControl();
+
+	if (_globals->_sceneManager._previousScene == 9360) {
+		_globals->_player.disableControl();
+		_sceneState = 9352;
+		setAction(&_sequenceManager, this, 9352, &_globals->_player, &_object2, NULL);
+	} else if (_globals->_sceneManager._previousScene == 9400) {
+		_globals->_player.disableControl();
+		_sceneState = 9353;
+		setAction(&_sequenceManager, this, 9353, &_globals->_player, &_object2, NULL);
+	} else {
+		if (_globals->getFlag(84)) {
+			_globals->clearFlag(84);
+			_object2.postInit();
+			_globals->_player.disableControl();
+			_sceneState = 9359;
+			setAction(&_sequenceManager, this, 9359, &_globals->_player, &_object2, NULL);
+		} else {
+			_globals->_player.disableControl();
+			_sceneState = 9354;
+			setAction(&_sequenceManager, this, 9354, &_globals->_player, &_object2, NULL);
+		}
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9360 - Castle: In a hallway
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9360::signal() {
+	switch (_sceneState ++) {
+	case 0:
+	case 9362:
+	case 9363:
+	case 9364:
+		_globals->_player.enableControl();
+		break;
+	case 9365:
+		_globals->_sceneManager.changeScene(9350);
+		break;
+	case 9366:
+		_globals->_sceneManager.changeScene(9200);
+		break;
+	case 9367:
+		_globals->_sceneManager.changeScene(9450);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9360::dispatch() {
+	if (_action == 0) {
+		if ((_globals->_player._position.x > 300) && (_globals->_player._position.y < 160)) {
+			_globals->_player.disableControl();
+			_sceneState = 9366;
+			setAction(&_sequenceManager, this, 9366, &_globals->_player, NULL);
+		} else if ((_globals->_player._position.x > 110) && (_globals->_player._position.y >= 195)) {
+			_globals->_player.disableControl();
+			_sceneState = 9367;
+			setAction(&_sequenceManager, this, 9367, &_globals->_player, NULL);
+		} else if ((_globals->_player._position.x < 10) || ((_globals->_player._position.x <= 110) && (_globals->_player._position.y >= 195))) {
+			_globals->_player.disableControl();
+			_sceneState = 9365;
+			setAction(&_sequenceManager, this, 9365, &_globals->_player, NULL);
+		}
+	} else {
+		Scene::dispatch();
+	}
+}
+
+void Scene9360::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(95, 80, 200, 100);
+	_globals->_player.postInit();
+
+	_hotspot1.setup(37, 92, 93, 173, 9360, 0, 1);
+	_hotspot2.setup(42, 0, 100, 63, 9360, 2, -1);
+	_hotspot3.setup(36, 205, 82, 260, 9360, 3, -1);
+	_hotspot4.setup(103, 2, 200, 320, 9360, 4, -1);
+	_hotspot5.setup(0, 0, 37, 320, 9360, 4, -1);
+	_hotspot6.setup(35, 61, 103, 92, 9360, 4, -1);
+	_hotspot7.setup(33, 174, 93, 207, 9360, 4, -1);
+	_hotspot8.setup(28, 257, 149, 320, 9360, 4, -1);
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.disableControl();
+	if (_globals->_sceneManager._previousScene == 9350) {
+		_globals->_player.disableControl();
+		_sceneState = 9364;
+		setAction(&_sequenceManager, this, 9364, &_globals->_player, NULL);
+	} else if (_globals->_sceneManager._previousScene == 9450) {
+		_globals->_player.disableControl();
+		_sceneState = 9363;
+		setAction(&_sequenceManager, this, 9363, &_globals->_player, NULL);
+	} else {
+		_globals->_player.disableControl();
+		_sceneState = 9362;
+		setAction(&_sequenceManager, this, 9362, &_globals->_player, NULL);
+	}
+	_object1.setup(9351, 1, 1, 131, 90, 0);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9400 - Castle: Black-Smith room
+ *
+ *--------------------------------------------------------------------------*/
+Scene9400::Scene9400() {
+	_field1032 = 0;
+}
+
+void Scene9400::SceneHotspot7::doAction(int action) {
+	Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+
+	if ((action == CURSOR_USE) && (RING_INVENTORY._straw._sceneNumber != 1)) {
+		scene->_sceneState = 1;
+		RING_INVENTORY._straw._sceneNumber = 1;
+		scene->setAction(&scene->_sequenceManager, scene, 9408, &_globals->_player, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9400::SceneHotspot8::doAction(int action) {
+	Scene9400 *scene = (Scene9400 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_TALK) {
+		_globals->_player.disableControl();
+		scene->_sceneState = 2;
+		scene->signal();
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9400::signal() {
+	switch (_sceneState ++) {
+	case 0:
+		_object1._numFrames = 6;
+		_stripManager.start(9400, this);
+		break;
+	case 1:
+		_object1._numFrames = 6;
+		_object1.animate(ANIM_MODE_2, NULL);
+		_globals->_player.enableControl();
+		break;
+	case 2:
+		_object1.animate(ANIM_MODE_5, this);
+		break;
+	case 3:
+		_stripManager.start(9405, this);
+		break;
+	case 4:
+		_object1.animate(ANIM_MODE_2, this);
+		_globals->_player.enableControl();
+		break;
+	case 9350:
+		_globals->_sceneManager.changeScene(9350);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9400::dispatch() {
+	if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){
+		if (_field1032 == 0) {
+			_soundHandler.play(296);
+			_field1032 = 1;
+		}
+	} else {
+		_field1032 = 0;
+	}
+	if (_action == 0) {
+		if (_globals->_player._position.y < 120) {
+			_sceneState = 9350;
+			_globals->_player.disableControl();
+			setAction(&_action1);
+			Common::Point pt(-45, 88);
+			NpcMover *mover = new NpcMover();
+			_globals->_player.addMover(mover, &pt, this);
+		}
+	} else {
+		Scene::dispatch();
+	}
+}
+
+void Scene9400::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	_screenNumber = 9400;
+	setZoomPercents(0, 100, 200, 100);
+	_globals->_player.postInit();
+	_object1.postInit();
+	_object3.postInit();
+	_speakerQText._textPos.x = 20;
+
+	_hotspot7.setup(157, 66, 180, 110, 9400, 21, 23);
+	_hotspot5.setup(130, 133, 152, 198, 9400, 22, -1);
+	_hotspot1.setup(33, 280, 69, 297, 9400, 1, 2);
+	_hotspot2.setup(73, 96, 87, 159, 9400, 3, 4);
+	_hotspot3.setup(89, 253, 111, 305, 9400, 5, 6);
+	_hotspot4.setup(46, 0, 116, 35, 9400, 7, 8);
+	_hotspot8.setup(58, 169, 122, 200, 9400, 9, 10);
+	_hotspot6.setup(0, 0, 199, 319, 9400, 16, 0);
+
+	_stripManager.addSpeaker(&_speakerQText);
+	_stripManager.addSpeaker(&_speakerOR);
+	_stripManager.addSpeaker(&_speakerOText);
+
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.disableControl();
+
+	// Useless check (skipped) : if (_globals->_sceneManager._previousScene == 9350)
+	_sceneState = 2;
+	if (!_globals->getFlag(89)) {
+		_globals->setFlag(89);
+		_sceneState = 0;
+	}
+
+	setAction(&_sequenceManager, this, 9400, &_globals->_player, &_object1, &_object3, NULL);
+}
+
+void Scene9400::synchronize(Serializer &s) {
+	Scene::synchronize(s);
+	if (s.getVersion() >= 3)
+		s.syncAsSint16LE(_field1032);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9450 - Castle: Dining room
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9450::Object2::signal() {
+	Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+	this->setAction(&scene->_sequenceManager3, this, 9458, this, &scene->_object1, NULL);
+}
+
+void Scene9450::Object3::dispatch() {
+	SceneObject::dispatch();
+	_percent = (_percent * 20) / 30;
+}
+
+void Scene9450::Hotspot1::doAction(int action) {
+	Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		if (scene->_object2._action)
+			scene->_object2._action->remove();
+		scene->_sceneMode = 9459;
+		_globals->_player.disableControl();
+		scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9450::Hotspot3::doAction(int action) {
+	Scene9450 *scene = (Scene9450 *)_globals->_sceneManager._scene;
+
+	switch (action) {
+	case OBJECT_CLOAK:
+	case OBJECT_JACKET:
+	case OBJECT_TUNIC2:
+		scene->_sceneMode = 9460;
+		_globals->_player.disableControl();
+		scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+		break;
+	case OBJECT_TUNIC:
+		SceneItem::display(9450, 49, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		break;
+	case CURSOR_WALK:
+		// nothing
+		break;
+	case CURSOR_LOOK:
+		SceneItem::display(9450, 41, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		break;
+	case CURSOR_USE:
+	case CURSOR_TALK:
+		if (RING_INVENTORY._tunic._sceneNumber == 9450) {
+			if (scene->_object2._action)
+				scene->_object2._action->remove();
+			scene->_sceneMode = 9459;
+			_globals->_player.disableControl();
+			scene->setAction(&scene->_sequenceManager1, scene, 9459, &scene->_object2, &scene->_object1, &scene->_object3, &_globals->_player, NULL);
+		} else if ((RING_INVENTORY._cloak._sceneNumber != 1) && (RING_INVENTORY._jacket._sceneNumber != 1) && (RING_INVENTORY._tunic2._sceneNumber != 1)) {
+			SceneItem::display(9450, 38, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		} else {
+			scene->_sceneMode = 9460;
+			_globals->_player.disableControl();
+			scene->setAction(&scene->_sequenceManager1, scene, 9460, &_globals->_player, &scene->_object2, &scene->_object1, NULL);
+		}
+		break;
+	default:
+		SceneItem::display(9450, 45, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		break;
+	}
+}
+
+void Scene9450::signal() {
+	switch (_sceneMode++) {
+	case 1002:
+	case 1004:
+		// Drink
+		setAction(&_sequenceManager1, this, 9456, &_object2, &_object1, &_object3, NULL);
+		break;
+	case 1005:
+		// Bring me more wine
+		setAction(&_sequenceManager1, this, 9457, &_object2, &_object1, &_object3, NULL);
+		break;
+	case 9451:
+		if (_globals->getFlag(87)) {
+			_globals->_player.enableControl();
+		} else {
+			_sceneMode = 1001;
+			if (_object2._action)
+				_object2._action->remove();
+			// Eat
+			setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL);
+		}
+		break;
+	case 1001:
+	case 1003:
+		// Eat
+		setAction(&_sequenceManager1, this, 9455, &_object2, &_object1, &_object3, NULL);
+		break;
+	case 9453:
+		_globals->_sceneManager.changeScene(9360);
+		break;
+	case 9459:
+		RING_INVENTORY._tunic._sceneNumber = 1;
+		_object2.signal();
+		_globals->_player.enableControl();
+		_globals->_events.setCursor(CURSOR_WALK);
+		_hotspot1.remove();
+		break;
+	case 1006:
+		_globals->setFlag(87);
+		// No break on purpose
+	default:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene9450::dispatch() {
+	if (_action) {
+		_action->dispatch();
+	} else {
+		if ((_globals->_player._position.y < 98) && (_globals->_player._position.x > 241) && (_globals->_player._position.x < 282)) {
+			_globals->_player.disableControl();
+			_sceneMode = 9452;
+			setAction(&_sequenceManager1, this, 9452, &_globals->_player, NULL);
+		} else if ((_globals->_player._position.y < 99) && (_globals->_player._position.x > 68) && (_globals->_player._position.x < 103)) {
+			_globals->_player.disableControl();
+			_sceneMode = 9453;
+			setAction(&_sequenceManager1, this, 9453, &_globals->_player, NULL);
+		}
+	}
+}
+
+void Scene9450::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(84, 75, 167, 150);
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.postInit();
+
+	_object2.postInit();
+	_object1.postInit();
+	_object1.hide();
+
+	_globals->_player.disableControl();
+	_sceneMode = 9451;
+	setAction(&_sequenceManager1, this, 9451, &_globals->_player, NULL);
+
+	if (_globals->getFlag(87)) {
+		if (RING_INVENTORY._tunic._sceneNumber == 1) {
+			_object2.signal();
+		} else {
+			_object2.setPosition(Common::Point(184, 144));
+			_object2.setVisage(9451);
+			_object2.fixPriority(250);
+			_object2._strip = 5;
+			_object2._frame = 10;
+		}
+	} else {
+		_object3.postInit();
+		_object3.hide();
+		_object3.setAction(&_sequenceManager2, NULL, 9455, &_object2, &_object1, NULL);
+	}
+
+	if (RING_INVENTORY._tunic._sceneNumber != 1)
+		_hotspot1.setup(123, 139, 138, 170, 9450, 37, -1);
+
+	_hotspot2.setup(153, 102, 176, 141, 9450, 39, 40);
+	_hotspot3.setup(97, 198, 130, 229, 9450, 41, 42);
+	_hotspot15.setup(131, 190, 145, 212, 9450, 43, 44);
+	_hotspot4.setup(33, 144, 105, 192, 9450, 0, 1);
+	_hotspot5.setup(20, 236, 106, 287, 9450, 2, 3);
+	_hotspot6.setup(137, 119, 195, 320, 9450, 4, 5);
+	_hotspot7.setup(20, 59, 99, 111, 9450, 6, -1);
+	_hotspot8.setup(110, 0, 199, 117, 9450, 7, 8);
+	_hotspot9.setup(101, 104, 130, 174, 9450, 9, 10);
+	_hotspot10.setup(110, 246, 149, 319, 9450, 11, 12);
+	_hotspot11.setup(16, 34, 74, 62, 6450, 13, 14);
+	_hotspot12.setup(19, 108, 72, 134, 9450, 15, 16);
+	_hotspot13.setup(18, 215, 71, 237, 9450, 17, 18);
+	_hotspot14.setup(15, 288, 76, 314, 9450, 19, 20);
+	_hotspot16.setup(0, 0, 200, 320, 9450, 46, -1);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9500 - Castle: Bedroom
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9500::Hotspot1::doAction(int action) {
+	Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_SWORD) {
+		scene->_sceneMode = 9510;
+		_globals->setFlag(92);
+		RING_INVENTORY._sword._sceneNumber = 9500;
+		_globals->_player.disableControl();
+		_globals->_sceneItems.remove(this);
+		scene->_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+		scene->setAction(&scene->_sequenceManager, scene, 9510, &_globals->_player, &scene->_object2, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9500::Hotspot2::doAction(int action) {
+	Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		scene->_sceneMode = 9511;
+		_globals->_player.disableControl();
+		_globals->_sceneItems.remove(this);
+		scene->setAction(&scene->_sequenceManager, scene, 9511, &_globals->_player, &scene->_object2, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9500::Hotspot3::doAction(int action) {
+	Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+	if ((action == CURSOR_USE) && (RING_INVENTORY._candle._sceneNumber != 1)){
+		scene->_sceneMode = 9505;
+		_globals->_player.disableControl();
+		_globals->_sceneItems.remove(this);
+		scene->setAction(&scene->_sequenceManager, scene, 9505, &_globals->_player, &scene->_candle, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9500::Hotspot4::doAction(int action) {
+	Scene9500 *scene = (Scene9500 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_CANDLE) {
+		_globals->_player.disableControl();
+		if (RING_INVENTORY._straw._sceneNumber == 9500) {
+			scene->_sceneMode = 9506;
+			_globals->_sceneItems.remove(&scene->_hotspot5);
+			_globals->_sceneItems.remove(this);
+			scene->setAction(&scene->_sequenceManager, scene, 9506, &_globals->_player, &scene->_object3, NULL);
+			RING_INVENTORY._candle._sceneNumber = 9850;
+		} else {
+			scene->_sceneMode = 9507;
+			scene->setAction(&scene->_sequenceManager, scene, 9507, &_globals->_player, &scene->_object3, NULL);
+		}
+	} else if (action == OBJECT_STRAW) {
+		scene->_sceneMode = 9512;
+		_globals->_player.disableControl();
+		RING_INVENTORY._straw._sceneNumber = 9500;
+		scene->setAction(&scene->_sequenceManager, scene, 9512, &_globals->_player, &scene->_object3, NULL);
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9500::signal() {
+	switch (_sceneMode) {
+	case 9503:
+		_globals->_sceneManager.changeScene(9200);
+		_globals->_soundHandler.play(295);
+		break;
+	case 9504:
+		_globals->_sceneManager.changeScene(9850);
+		break;
+	case 9505:
+		_candle.setStrip(2);
+		RING_INVENTORY._candle._sceneNumber = 1;
+		_globals->_player.enableControl();
+		break;
+	case 9506:
+		_globals->setFlag(85);
+		_globals->_player.enableControl();
+		break;
+	case 9511:
+		RING_INVENTORY._helmet._sceneNumber = 1;
+		_globals->_player.enableControl();
+		if (!_globals->getFlag(51)) {
+			_globals->setFlag(51);
+			_globals->_player.disableControl();
+			_sceneMode = 9514;
+			setAction(&_sequenceManager, this, 9514, &_globals->_player, NULL, NULL, NULL, NULL);
+		}
+		break;
+	case 0:
+	case 9514:
+	default:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene9500::dispatch() {
+	if (_action) {
+		_action->dispatch();
+	} else {
+		if (_globals->_player._position.y >= 199) {
+			_globals->_player.disableControl();
+			_sceneMode = 9503;
+			setAction(&_sequenceManager, this, 9503, &_globals->_player, NULL, NULL, NULL, NULL);
+		} else if (_globals->_player._position.y < 127) {
+			_globals->_player.disableControl();
+			_sceneMode = 9504;
+			setAction(&_sequenceManager, this, 9504, &_globals->_player, NULL, NULL, NULL, NULL);
+		}
+	}
+
+}
+
+void Scene9500::process(Event &event) {
+	Scene::process(event);
+}
+
+void Scene9500::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(110, 75, 200, 150);
+
+	_globals->_player.postInit();
+	_globals->_soundHandler.play(305);
+
+	_candle.postInit();
+	_candle.setVisage(9500);
+	_candle.setStrip(1);
+	_candle.animate(ANIM_MODE_2);
+	_candle.setPosition(Common::Point(30, 105));
+	if (RING_INVENTORY._candle._sceneNumber != 9500)
+		_candle.setStrip(2);
+
+	_object3.postInit();
+	_object3.hide();
+	_object3.fixPriority(150);
+	_object3.setPosition(Common::Point(166, 133));
+	if (RING_INVENTORY._straw._sceneNumber == 9500) {
+		_object3.show();
+		_object3.setVisage(5);
+		_object3._strip = 2;
+		_object3._frame = 9;
+		_object3.setPosition(Common::Point(168, 128));
+		if (_globals->getFlag(85)) {
+			_object3.setVisage(9500);
+			_object3.setStrip(4);
+			_object3.animate(ANIM_MODE_8, 0, NULL);
+			_object3.setPosition(Common::Point(166, 133));
+		}
+	}
+
+	_object2.postInit();
+	_object2.hide();
+	if (_globals->getFlag(92)) {
+		_object2.show();
+		_object2.setVisage(9501);
+		_object2.setStrip(1);
+		_object2.setFrame(_object2.getFrameCount());
+		_object2.setPosition(Common::Point(303, 130));
+		_object2.fixPriority(132);
+		if (RING_INVENTORY._helmet._sceneNumber == 1) {
+			_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+		} else {
+			_object2.setStrip(2);
+			_object2.setFrame(1);
+		}
+	} else {
+		_hotspot1.setup(105, 295, 134, 313, 9500, 9, 10);
+	}
+
+	_hotspot17.setup(101, 293, 135, 315, 9500, 9, 10);
+	_hotspot3.setup(84, 12, 107, 47, 9500, 15, 15);
+	_hotspot6.setup(93, 11, 167, 46, 9500, 0, 1);
+	_hotspot7.setup(100, 70, 125, 139, 9500, 2, 3);
+
+	if (!_globals->getFlag(85)) {
+		_hotspot5.setup(111, 68, 155, 244, 9500, 17, -1);
+		_hotspot4.setup(57, 71, 120, 126, 9500, 16, -1);
+	}
+
+	_hotspot8.setup(60, 24, 90, 53, 9500, 4, 5);
+	_hotspot9.setup(72, 143, 93, 163, 9500, 4, 5);
+	_hotspot10.setup(70, 205, 92, 228, 9500, 4, 5);
+	_hotspot11.setup(66, 291, 90, 317, 9500, 4, 5);
+	_hotspot12.setup(22, 58, 101, 145, 9500, 6, 7);
+	_hotspot13.setup(121, 57, 163, 249, 9500, 6, 7);
+	_hotspot14.setup(115, 133, 135, 252, 9500, 6, 7);
+	_hotspot15.setup(55, 240, 125, 254, 9500, 6, 7);
+	_hotspot16.setup(53, 251, 132, 288, 9500, 8, -1);
+	_hotspot19.setup(101, 207, 120, 225, 9500, 9, 10);
+	_hotspot18.setup(98, 144, 117, 162, 9500, 9, 10);
+	_hotspot20.setup(102, 27, 132, 50, 9500, 9, 10);
+
+	_globals->_events.setCursor(CURSOR_WALK);
+	_globals->_player.disableControl();
+
+	if ((_globals->_sceneManager._previousScene == 9200) || (_globals->_sceneManager._previousScene != 9850)) {
+		_sceneMode = 0;
+		if (RING_INVENTORY._helmet._sceneNumber != 1) {
+			setAction(&_sequenceManager, this, 9501, &_globals->_player, &_candle, NULL);
+		} else {
+			RING_INVENTORY._helmet._sceneNumber = 9500;
+			_hotspot2.setup(87, 294, 104, 314, 9400, 17, -1);
+			setAction(&_sequenceManager, this, 9513, &_globals->_player, &_object2, NULL);
+		}
+	} else {
+		_sceneMode = 0;
+		setAction(&_sequenceManager, this, 9502, &_globals->_player, &_candle, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9700 - Castle: Balcony
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9700::signal() {
+	switch (_sceneMode ++) {
+	case 9703:
+		_globals->setFlag(88);
+		// No break on purpose
+	case 9701:
+	case 9702:
+		_gfxButton1.setText(EXIT_MSG);
+		_gfxButton1._bounds.center(50, 190);
+		_gfxButton1.draw();
+		_gfxButton1._bounds.expandPanes();
+		_globals->_player.enableControl();
+		_globals->_player._canWalk = false;
+		_globals->_events.setCursor(CURSOR_USE);
+		break;
+	case 9704:
+		_globals->_soundHandler.play(323);
+		_globals->_sceneManager.changeScene(9750);
+		break;
+	}
+}
+
+void Scene9700::process(Event &event) {
+	Scene::process(event);
+	if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) {
+		if (_gfxButton1.process(event)) {
+			_globals->_sceneManager.changeScene(9200);
+		} else if (_globals->_events._currentCursor == OBJECT_SCANNER) {
+			event.handled = true;
+			if (RING_INVENTORY._helmet._sceneNumber == 1) {
+				_globals->_player.disableControl();
+				_sceneMode = 9704;
+				setAction(&_sequenceManager, this, 9704, &_globals->_player, &_object1, NULL);
+			} else {
+				_globals->_player.disableControl();
+				_sceneMode = 9703;
+				setAction(&_sequenceManager, this, 9703, &_globals->_player, &_object1, NULL);
+			}
+		}
+	}
+}
+
+void Scene9700::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	_sceneHotspot1.setup(84, 218, 151, 278, 9700, 14, -1);
+	_sceneHotspot2.setup(89, 11, 151, 121, 9700, 14, -1);
+	_sceneHotspot3.setup(69, 119, 138, 216, 9700, 15, 16);
+	_sceneHotspot4.setup(34, 13, 88, 116, 9700, 17, -1);
+	_sceneHotspot5.setup(52, 119, 68, 204, 9700, 17, -1);
+	_sceneHotspot6.setup(0, 22, 56, 275, 9700, 18, -1);
+
+	_object1.postInit();
+	_object1.hide();
+	_globals->_player.postInit();
+	if (!_globals->getFlag(97)) {
+		_globals->_player.disableControl();
+		_sceneMode = 9701;
+		setAction(&_sequenceManager, this, 9701, &_globals->_player, &_object1, NULL);
+		_globals->setFlag(97);
+	} else {
+		_globals->_player.disableControl();
+		_sceneMode = 9702;
+		setAction(&_sequenceManager, this, 9702, &_globals->_player, &_object1, NULL);
+	}
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9750 - Castle: In the garden
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9750::signal() {
+	switch (_sceneMode ++) {
+	case 9751:
+		_globals->_soundHandler.fadeOut(this);
+		break;
+	case 9752:
+		_globals->_sceneManager.changeScene(2100);
+	default:
+		break;
+	}
+}
+
+void Scene9750::dispatch() {
+	Scene::dispatch();
+}
+
+void Scene9750::postInit(SceneObjectList *OwnerList) {
+	loadScene(9750);
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	_globals->_player.postInit();
+	_object1.postInit();
+	_object1.hide();
+	_object2.postInit();
+	_object2.hide();
+	_globals->_player.disableControl();
+	_sceneMode = 9751;
+	setAction(&_sequenceManager, this, 9751, &_globals->_player, &_object1, &_object2, NULL);
+}
+
+
+/*--------------------------------------------------------------------------
+ * Scene 9850 - Castle: Dressing room
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9850::Object6::doAction(int action) {
+	if ((_flags & OBJFLAG_HIDE) == 0) {
+		if (action == CURSOR_LOOK) {
+			SceneItem::display(9850, 27, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		} else if (action == CURSOR_USE) {
+			RING_INVENTORY._scimitar._sceneNumber = 1;
+			hide();
+		} else {
+			SceneHotspot::doAction(action);
+		}
+	}
+}
+void Scene9850::Object7::doAction(int action) {
+	if ((_flags & OBJFLAG_HIDE) == 0) {
+		if (action == CURSOR_LOOK) {
+			SceneItem::display(9850, 28, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+		} else if (action == CURSOR_USE) {
+			RING_INVENTORY._sword._sceneNumber = 1;
+			hide();
+		} else {
+			SceneHotspot::doAction(action);
+		}
+	}
+}
+
+// Hair covered tunic
+void Scene9850::Hotspot12::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		if (RING_INVENTORY._tunic2._sceneNumber != 1) {
+			RING_INVENTORY._tunic2._sceneNumber = 1;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9858;
+			scene->setAction(&scene->_sequenceManager, scene, 9858, &_globals->_player, &scene->_objTunic2, NULL);
+		} else {
+			RING_INVENTORY._tunic2._sceneNumber = 9850;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9861;
+			scene->setAction(&scene->_sequenceManager, scene, 9861, &_globals->_player, &scene->_objTunic2, NULL);
+		}
+	} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._tunic2._sceneNumber != 1)) {
+		NamedHotspot::doAction(action);
+	} else {
+		SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	}
+}
+
+void Scene9850::Hotspot14::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		if (RING_INVENTORY._jacket._sceneNumber != 1) {
+			RING_INVENTORY._jacket._sceneNumber = 1;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9857;
+			scene->setAction(&scene->_sequenceManager, scene, 9857, &_globals->_player, &scene->_objJacket, NULL);
+		} else {
+			RING_INVENTORY._jacket._sceneNumber = 9850;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9860;
+			scene->setAction(&scene->_sequenceManager, scene, 9860, &_globals->_player, &scene->_objJacket, NULL);
+		}
+	} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._jacket._sceneNumber != 1)) {
+		NamedHotspot::doAction(action);
+	} else {
+		SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	}
+}
+
+void Scene9850::Hotspot16::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		if (RING_INVENTORY._cloak._sceneNumber != 1) {
+			RING_INVENTORY._cloak._sceneNumber = 1;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9862;
+			scene->setAction(&scene->_sequenceManager, scene, 9862, &_globals->_player, &scene->_objCloak, NULL);
+		} else {
+			RING_INVENTORY._cloak._sceneNumber = 9850;
+			_globals->_player.disableControl();
+			scene->_sceneMode = 9859;
+			scene->setAction(&scene->_sequenceManager, scene, 9859, &_globals->_player, &scene->_objCloak, NULL);
+		}
+	} else if ((action != CURSOR_LOOK) || (RING_INVENTORY._cloak._sceneNumber != 1)) {
+		NamedHotspot::doAction(action);
+	} else {
+		SceneItem::display(9850, 30, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	}
+}
+
+void Scene9850::Hotspot17::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_SCANNER) {
+		SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	} else {
+		if (action == CURSOR_USE)
+			scene->_soundHandler.play(306);
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9850::Hotspot18::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_SCANNER) {
+		SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	} else {
+		if (action == CURSOR_USE)
+			scene->_soundHandler.play(306);
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9850::Hotspot19::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == OBJECT_SCANNER) {
+		SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END);
+	} else {
+		if (action == CURSOR_USE)
+			scene->_soundHandler.play(313);
+		NamedHotspot::doAction(action);
+	}
+}
+
+// Arrow on Statue
+void Scene9850::Hotspot20::doAction(int action) {
+	Scene9850 *scene = (Scene9850 *)_globals->_sceneManager._scene;
+
+	if (action == CURSOR_USE) {
+		_globals->_player.disableControl();
+		if (scene->_objSword._state == 0) {
+			if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+				scene->_objScimitar.show();
+			if (RING_INVENTORY._sword._sceneNumber == 9850)
+				scene->_objSword.show();
+			scene->_sceneMode = 11;
+			setAction(&scene->_sequenceManager, scene, 9853, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+		} else {
+			scene->_sceneMode = 10;
+			setAction(&scene->_sequenceManager, scene, 9854, &_globals->_player, &scene->_objDoor, &scene->_objLever, NULL);
+		}
+		scene->_objSword._state ^= 1;
+	} else {
+		NamedHotspot::doAction(action);
+	}
+}
+
+void Scene9850::signal() {
+	switch (_sceneMode ++) {
+	case 10:
+		// Hidden closet closed
+		if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+			_objScimitar.hide();
+		if (RING_INVENTORY._sword._sceneNumber == 9850)
+			_objSword.hide();
+		_globals->_sceneItems.remove(&_objScimitar);
+		_globals->_sceneItems.remove(&_objSword);
+		_globals->_sceneItems.addItems(&_hotspot19, NULL);
+		_globals->_player.enableControl();
+		break;
+	case 11:
+		// Hidden closet opened
+		if (RING_INVENTORY._scimitar._sceneNumber == 9850)
+			_globals->_sceneItems.addItems(&_objScimitar, NULL);
+		if (RING_INVENTORY._sword._sceneNumber == 9850)
+			_globals->_sceneItems.addItems(&_objSword, NULL);
+		_globals->_sceneItems.remove(&_hotspot19);
+		_globals->_player.enableControl();
+		break;
+	case 9500:
+		_globals->_sceneManager.changeScene(_sceneMode - 1);
+		break;
+	case 0:
+	default:
+		_globals->_player.enableControl();
+		break;
+	}
+}
+
+void Scene9850::process(Event &event) {
+	Scene::process(event);
+	if ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_4)) {
+		event.handled = true;
+		_globals->_player.disableControl();
+		if (_objSword._state == 0) {
+			_sceneMode = 0;
+			setAction(&_sequenceManager, this, 9853, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL);
+		} else {
+			_sceneMode = 10;
+			setAction(&_sequenceManager, this, 9854, &_objLever, &_objDoor, &_objScimitar, &_objSword, NULL);
+		}
+		_objSword._state ^= 1;
+	}
+}
+
+void Scene9850::dispatch() {
+	if (_action) {
+		_action->dispatch();
+	} else if (_globals->_player._position.y >= 198) {
+		_globals->_player.disableControl();
+		_sceneMode = 9500;
+		setAction(&_sequenceManager, this, 9852, &_globals->_player, NULL);
+	}
+}
+
+void Scene9850::postInit(SceneObjectList *OwnerList) {
+	Scene::postInit();
+	_objSword._state = 0;
+
+	_objDoor.postInit();
+	_objDoor.setVisage(9850);
+	_objDoor.setStrip(1);
+	_objDoor.setFrame(1);
+	_objDoor.setPosition(Common::Point(28, 118));
+	_objDoor.fixPriority(90);
+
+	_objLever.postInit();
+	_objLever.setVisage(9850);
+	_objLever.setStrip(4);
+	_objLever.setFrame(1);
+	_objLever.setPosition(Common::Point(256, 35));
+
+	_objCloak.postInit();
+	_objCloak.setVisage(9850);
+	_objCloak.setStrip(5);
+	_objCloak.setFrame(1);
+	_objCloak.fixPriority(90);
+	_objCloak.setPosition(Common::Point(157, 81));
+	if (RING_INVENTORY._cloak._sceneNumber != 9850)
+		_objCloak.hide();
+
+	_objJacket.postInit();
+	_objJacket.setVisage(9850);
+	_objJacket.setStrip(5);
+	_objJacket.setFrame(2);
+	_objJacket.fixPriority(90);
+	_objJacket.setPosition(Common::Point(201, 84));
+	if (RING_INVENTORY._jacket._sceneNumber != 9850)
+		_objJacket.hide();
+
+	_objTunic2.postInit();
+	_objTunic2.setVisage(9850);
+	_objTunic2.setStrip(5);
+	_objTunic2.setFrame(3);
+	_objTunic2.fixPriority(90);
+	_objTunic2.setPosition(Common::Point(295, 90));
+	if (RING_INVENTORY._tunic2._sceneNumber != 9850)
+		_objTunic2.hide();
+
+	if (RING_INVENTORY._scimitar._sceneNumber == 9850) {
+		_objScimitar.postInit();
+		_objScimitar.setVisage(9850);
+		_objScimitar.setStrip(2);
+		_objScimitar.setFrame(1);
+		_objScimitar.setPosition(Common::Point(55, 83));
+		_objScimitar.fixPriority(80);
+		_objScimitar.hide();
+	}
+
+	if (RING_INVENTORY._sword._sceneNumber == 9850) {
+		_objSword.postInit();
+		_objSword.setVisage(9850);
+		_objSword.setStrip(3);
+		_objSword.setFrame(1);
+		_objSword.setPosition(Common::Point(56, 101));
+		_objSword.fixPriority(80);
+		_objSword.hide();
+	}
+
+	_spotLever.setup(30, 251, 45, 270, 9850, 26, -1);
+	_hotspot1.setup(123, 0, 200, 320, 9850, 0, 1);
+	_hotspot2.setup(107, 87, 133, 308, 9850, 0, 1);
+	_hotspot3.setup(2, 28, 53, 80, 9850, 2, 3);
+	_hotspot4.setup(13, 0, 55, 27, 9850, 2, 3);
+	_hotspot5.setup(8, 74, 27, 91, 9850, 4, 5);
+	_hotspot17.setup(61, 0, 125, 28, 9850, 6, 7);
+	_hotspot18.setup(51, 95, 105, 145, 9850, 6, 7);
+	_hotspot19.setup(56, 28, 115, 97, 9850, 6, 8);
+	_hotspot6.setup(0, 223, 115, 257, 9850, 9, 10);
+	_hotspot7.setup(15, 254, 33, 268, 9850, 9, -1);
+	_hotspot8.setup(17, 218, 37, 233, 9850, 9, 10);
+	_hotspot9.setup(8, 113, 26, 221, 9850, 11, 12);
+	_hotspot10.setup(14, 94, 53, 112, 9850, 13, 14);
+	_hotspot11.setup(5, 269, 29, 303, 9850, 15, 16);
+	_hotspot12.setup(43, 278, 91, 317, 9850, 17, 18);
+	_hotspot13.setup(47, 263, 112, 282, 9850, 19, 20);
+	_hotspot14.setup(43, 188, 86, 224, 9850, 21, 22);
+	_hotspot15.setup(43, 162, 92, 191, 9850, 23, 24);
+	_hotspot16.setup(40, 146, 90, 169, 9850, 25, -1);
+
+	_globals->_player.postInit();
+	_globals->_player.disableControl();
+	_sceneMode = 0;
+	setAction(&_sequenceManager, this, 9851, &_globals->_player, NULL);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9900 - Ending
+ *
+ *--------------------------------------------------------------------------*/
+void Scene9900::strAction1::signal() {
+	const byte mask1[3] = {0xff, 0xff, 0xff};
+	const byte mask2[3] = {0, 0, 0};
+
+	Scene9900 *scene = (Scene9900 *)_globals->_sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		scene->_soundHandler.play(351);
+		_object9.postInit();
+		_object9.setVisage(18);
+		_object9._frame = 1;
+		_object9._strip = 6;
+		_object9.fixPriority(250);
+		_object9.setPosition(Common::Point(171, 59));
+		_object9.animate(ANIM_MODE_5, NULL);
+		_globals->_scenePalette.addRotation(67, 111, 1, 1, this);
+		scene->_object2.hide();
+		break;
+	case 1:
+		_palette1.getPalette();
+		_globals->_scenePalette.addFader(&mask1[0], 1, 10, this);
+		break;
+	case 2:
+		_object9.remove();
+		_globals->_scenePalette.addFader(&mask2[0], 1, 5, this);
+		break;
+	case 3:
+		_globals->_soundHandler.play(377);
+		setDelay(120);
+		break;
+	case 4:
+		_globals->_scenePalette.addFader(_palette1._palette, 256, 1, this);
+		break;
+	case 5:
+		remove();
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9900::strAction2::signal() {
+	switch (_actionIndex++) {
+	case 0:
+		_lineNum = 0;
+		_txtArray1Index = 0;
+		_txtArray1[0]._position.y = 200;
+		_txtArray1[1]._position.y = 300;
+		_txtArray2[0]._position.y = 400;
+		_txtArray2[1]._position.y = 500;
+		_var3 = 0;
+		// No break on purpose
+	case 1: {
+		Common::String msg = _resourceManager->getMessage(8030, _lineNum++);
+		if (msg.compareTo("LASTCREDIT")) {
+			if (_var3) {
+				// Not used?
+				// int x = _txtArray1[_txtArray1Index].getFrame().getBounds().height();
+				_txtArray1[_txtArray1Index]._moveDiff.y = 10;
+
+				NpcMover *mover = new NpcMover();
+				Common::Point pt(_txtArray1[_txtArray1Index]._position.x, -100);
+				_txtArray1[_txtArray1Index].addMover(mover, &pt, NULL);
+
+				// Not used?
+				// int x = _txtArray2[_txtArray1Index].getFrame().getBounds().height();
+				_txtArray2[_txtArray1Index]._moveDiff.y = 10;
+				_txtArray1Index = (_txtArray1Index + 1) % 2;
+			}
+			_var3 = 1;
+			_txtArray1[_txtArray1Index]._textMode = ALIGN_CENTER;
+			_txtArray1[_txtArray1Index]._width = 240;
+			_txtArray1[_txtArray1Index]._fontNumber = 2;
+			_txtArray1[_txtArray1Index]._color1 = 7;
+			_txtArray1[_txtArray1Index].setup(msg);
+			_txtArray1[_txtArray1Index]._moveRate = 20;
+			_txtArray1[_txtArray1Index]._moveDiff.y = 2;
+			_txtArray1[_txtArray1Index].fixPriority(255);
+			int frameWidth = _txtArray1[_txtArray1Index].getFrame().getBounds().width();
+			int frameHeight = _txtArray1[_txtArray1Index].getFrame().getBounds().height();
+			_txtArray1[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200));
+
+			NpcMover *mover2 = new NpcMover();
+			Common::Point pt2(_txtArray1[_txtArray1Index]._position.x, 100);
+			_txtArray1[_txtArray1Index].addMover(mover2, &pt2, this);
+
+			_txtArray2[_txtArray1Index]._textMode = ALIGN_CENTER;
+			_txtArray2[_txtArray1Index]._width = 240;
+			_txtArray2[_txtArray1Index]._fontNumber = 2;
+			_txtArray2[_txtArray1Index]._color1 = 23;
+
+			msg = _resourceManager->getMessage(8030, _lineNum++);
+			_txtArray2[_txtArray1Index].setup(msg);
+			_txtArray2[_txtArray1Index]._moveRate = 20;
+			_txtArray2[_txtArray1Index]._moveDiff.y = 2;
+			_txtArray2[_txtArray1Index].fixPriority(255);
+			frameWidth = _txtArray2[_txtArray1Index].getFrame().getBounds().width();
+			_txtArray2[_txtArray1Index].setPosition(Common::Point((320 - frameWidth) / 2, 200 + frameHeight));
+		} else {
+			// WORKAROUND: Fix inventory becoming available at end of credits
+			_globals->_events.setCursor(CURSOR_WALK);
+			_actionIndex = 3;
+			signal();
+		}
+		break;
+	}
+	case 2:
+		setDelay(60);
+		_actionIndex = 1;
+		break;
+	case 3:
+		setDelay(7200);
+		break;
+	case 4:
+		_txtArray1[0].remove();
+		_txtArray1[1].remove();
+		_txtArray2[0].remove();
+		_txtArray2[1].remove();
+		remove();
+		break;
+	default:
+		break;
+	}
+}
+void Scene9900::strAction2::dispatch() {
+//	if (this->_txtArray1[0]._textSurface != 0) {
+		int frameHeight = _txtArray1[0].getFrame().getBounds().height();
+		_txtArray2[0]._position.y = frameHeight + _txtArray1[0]._position.y;
+		_txtArray2[0]._flags |= OBJFLAG_PANES;
+//	}
+//	if (this->_txtArray1[1]._textSurface != 0) {
+		frameHeight = _txtArray1[1].getFrame().getBounds().height();
+		_txtArray2[1]._position.y = frameHeight + _txtArray1[1]._position.y;
+		_txtArray2[1]._flags |= OBJFLAG_PANES;
+//	}
+	Action::dispatch();
+}
+
+void Scene9900::strAction2::synchronize(Serializer &s) {
+	Action::synchronize(s);
+	if (s.getVersion() >= 3) {
+		s.syncAsSint16LE(_lineNum);
+		s.syncAsSint16LE(_txtArray1Index);
+		s.syncAsSint16LE(_var3);
+	}
+}
+
+void Scene9900::strAction3::signal() {
+	const byte mask3[3] = {0xff, 0, 0};
+	const byte mask4[3] = {0, 0, 0};
+
+	switch (_actionIndex++) {
+	case 0:
+		_palette2.getPalette();
+		_palette3.loadPalette(2003);
+		_globals->_scenePalette.addFader(_palette3._palette, 256, 5, this);
+		break;
+	case 1:
+		_globals->_scenePalette.addFader(&mask3[0], 1, 10, this);
+		break;
+	case 2:
+		_globals->_scenePalette.addFader(&mask4[0], 1, 1, this);
+		break;
+	case 3:
+		_palette2.loadPalette(17);
+		_globals->_sceneManager._scene->loadScene(17);
+		_globals->_scenePalette.addFader(_palette2._palette, 256, 5, this);
+		break;
+	case 4:
+		_globals->_game->endGame(9900, 61);
+		remove();
+	default:
+		break;
+	}
+}
+
+void Scene9900::signal() {
+	if ((_sceneMode != 9913) && (_sceneMode != 9905) && (_sceneMode != 9904) && (_sceneMode != 9912)) {
+		_object1.hide();
+		_object2.hide();
+		_object3.hide();
+		_object4.hide();
+		_object5.hide();
+		_object6.hide();
+	}
+
+	_object1.animate(ANIM_MODE_NONE, NULL);
+	_object2.animate(ANIM_MODE_NONE, NULL);
+	_object3.animate(ANIM_MODE_NONE, NULL);
+	_object4.animate(ANIM_MODE_NONE, NULL);
+	_object5.animate(ANIM_MODE_NONE, NULL);
+	_object6.animate(ANIM_MODE_NONE, NULL);
+
+	_object1.setObjectWrapper(NULL);
+	_object2.setObjectWrapper(NULL);
+	_object3.setObjectWrapper(NULL);
+	_object4.setObjectWrapper(NULL);
+	_object5.setObjectWrapper(NULL);
+	_object6.setObjectWrapper(NULL);
+
+	_object1.addMover(NULL);
+	_object2.addMover(NULL);
+	_object3.addMover(NULL);
+	_object4.addMover(NULL);
+	_object5.addMover(NULL);
+	_object6.addMover(NULL);
+
+	switch (_sceneMode){
+	case 150:
+		_globals->_soundHandler.play(380);
+		_object8.postInit();
+		_object8.setVisage(2002);
+		_object8.setStrip(1);
+		_object8.setFrame(1);
+		_object8.fixPriority(200);
+		_object8.setPosition(Common::Point(64, 199));
+		_globals->_player.disableControl();
+		_sceneMode = 9908;
+		setAction(&_sequenceManager, this, 9908, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 162:
+		warning("TBC: shutdown();");
+		_globals->_game->quitGame();
+		break;
+	case 9901:
+		_globals->_player.disableControl();
+		_sceneMode = 9906;
+		setAction(&_sequenceManager, this, 9906, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		_globals->_player._uiEnabled = true;
+		_globals->_events.setCursor(CURSOR_USE);
+		break;
+	case 9902:
+		_globals->_player.disableControl();
+		_sceneMode = 9901;
+		setAction(&_sequenceManager, this, 9901, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9903:
+		_globals->_player.disableControl();
+		_sceneMode = 9902;
+		setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9904:
+		_globals->_soundHandler.play(390);
+		_sceneMode = 9912;
+		setAction(&_strAction2, this);
+		break;
+	case 9905:
+		_sceneMode = 150;
+		setAction(&_strAction1, this);
+		break;
+	case 9906:
+		if (_object8._state == 0) {
+			_globals->_player.disableControl();
+			_sceneMode = 9913;
+			setAction(&_sequenceManager, this, 9913, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		} else {
+			_globals->_player.disableControl();
+			_sceneMode = 9905;
+			setAction(&_sequenceManager, this, 9905, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		}
+		break;
+	case 9907:
+		_globals->_player.disableControl();
+		_sceneMode = 9903;
+		setAction(&_sequenceManager, this, 9903, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9908:
+		_object8.remove();
+		_globals->_player.disableControl();
+		_sceneMode = 9904;
+		setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9909:
+		_globals->_soundHandler.play(375);
+		_globals->_player.disableControl();
+		_sceneMode = 9907;
+		setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9910:
+		_globals->_player.disableControl();
+		_sceneMode = 9911;
+		setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9911:
+		_globals->_soundHandler.play(367);
+		_globals->_player.disableControl();
+		_sceneMode = 9909;
+		setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		break;
+	case 9912:
+		_globals->_player.disableControl();
+		_sceneMode = 9912;
+		setAction(&_sequenceManager, this, 9912, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+		_sceneMode = 162;
+		_globals->_player.enableControl();
+		_globals->_player._canWalk = false;
+		break;
+	case 9913:
+		_sceneMode = 200;
+		setAction(&_strAction3, this);
+		break;
+	default:
+		break;
+	}
+}
+
+void Scene9900::process(Event &event) {
+	if (event.handled)
+		return;
+	Scene::process(event);
+	if (_sceneMode == 9906) {
+		if ((event.eventType == EVENT_BUTTON_DOWN) && (_globals->_events.getCursor() == OBJECT_ITEMS)) {
+			_object8._state = 1;
+			RING_INVENTORY._items._sceneNumber = 9900;
+			_globals->_events.setCursor(CURSOR_USE);
+		}
+	}
+}
+
+void Scene9900::dispatch() {
+	if (_action)
+		_action->dispatch();
+}
+
+void Scene9900::postInit(SceneObjectList *OwnerList) {
+	_object1.postInit();
+	_object1.hide();
+	_object2.postInit();
+	_object2.hide();
+	_object3.postInit();
+	_object3.hide();
+	_object4.postInit();
+	_object4.hide();
+	_object5.postInit();
+	_object5.hide();
+	_object6.postInit();
+	_object6.hide();
+
+	_object8._state = 0;
+
+	RING_INVENTORY._concentrator._sceneNumber = 9900;
+	RING_INVENTORY._items._rlbNum = 3;
+	RING_INVENTORY._items._cursorNum = 6;
+	RING_INVENTORY._items._description = Common::String("One of the items from the stasis ship. The other is on the Lance's bridge.");
+
+	_stripManager.addSpeaker(&_speakerMR);
+	_globals->_player.disableControl();
+	_sceneMode = 9910;
+	setAction(&_sequenceManager, this, 9910, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6);
+}
+
+/*--------------------------------------------------------------------------
+ * Scene 9999 - Space travel
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene9999::Action1::signal() {
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(600);
+		break;
+	case 1:
+		_globals->_sceneManager.changeScene(3500);
+		break;
+	default:
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene9999::Action2::signal() {
+	switch (_actionIndex++) {
+	case 0:
+		setDelay(10);
+		break;
+	case 1:
+		SceneItem::display(9999, 0, SET_Y, 10, SET_X, 30, SET_FONT, 2, SET_BG_COLOR, -1, SET_EXT_BGCOLOR, 23, SET_WIDTH, 260, SET_KEEP_ONSCREEN, 1, LIST_END);
+		setDelay(300);
+		break;
+	case 2:
+		_globals->_stripNum = 3600;
+		_globals->_sceneManager.changeScene(3600);
+	default:
+		break;
+	}
+}
+
+void Scene9999::postInit(SceneObjectList *OwnerList) {
+	loadScene(9998);
+	Scene::postInit();
+	setZoomPercents(0, 100, 200, 100);
+
+	_object1.postInit();
+	_object1.setVisage(1303);
+	_object1.setStrip2(3);
+	_object1.setPosition(Common::Point(160, 152));
+
+	_globals->_player.postInit();
+	_globals->_player.setVisage(1303);
+	_globals->_player.setStrip2(1);
+	_globals->_player.fixPriority(250);
+	_globals->_player.animate(ANIM_MODE_2, NULL);
+	_globals->_player.setPosition(Common::Point(194, 98));
+	_globals->_player._numFrames = 20;
+	_globals->_player.disableControl();
+
+	_object2.postInit();
+	_object2.setVisage(1303);
+	_object2.setStrip2(2);
+	_object2.fixPriority(2);
+	_object2.setPosition(Common::Point(164, 149));
+
+	_object3.postInit();
+	_object3.setVisage(1303);
+	_object3.setStrip2(2);
+	_object3.fixPriority(2);
+	_object3.setFrame(2);
+	_object3.setPosition(Common::Point(292, 149));
+	_object3.setAction(&_action3);
+
+	if (_globals->_sceneManager._previousScene == 3500)
+		setAction(&_action2);
+	else
+		setAction(&_action1);
+
+	_globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y);
+	_globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds);
+	_globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160;
+
+	if (_globals->_sceneManager._previousScene == 3500)
+		_globals->_stripNum = 2222;
+	else
+		_globals->_stripNum = 2121;
+
+	_globals->_soundHandler.play(118);
+
+}
+
+} // End of namespace tSage
diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
new file mode 100644
index 0000000..792234c
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -0,0 +1,532 @@
+/* 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_RINGWORLD_SCENES10_H
+#define TSAGE_RINGWORLD_SCENES10_H
+
+#include "common/scummsys.h"
+#include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+
+namespace tSage {
+
+class SceneObject9150 : public SceneObject {
+public:
+	int _timer, _signalFlag;
+
+	virtual void synchronize(Serializer &s) {
+		SceneObject::synchronize(s);
+		s.syncAsSint16LE(_timer);
+		s.syncAsSint16LE(_signalFlag);
+	}
+	virtual Common::String getClassName() { return "SceneObject9150"; }
+};
+
+class Scene2 : public Scene {
+public :
+	int _sceneState;
+
+	Scene2();
+	virtual void synchronize(Serializer &s) {
+		Scene::synchronize(s);
+		s.syncAsSint16LE(_sceneState);
+	}
+};
+
+class Object9350 : public SceneObject {
+public:
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void draw();
+};
+
+class Scene9100 : public Scene {
+	/* Items */
+	class SceneHotspot1 : public NamedHotspot {
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	SequenceManager _sequenceManager;
+	SceneObject _object1;
+	SceneObject _object2;
+	SceneObject _object3;
+	SceneObject _object4;
+	SceneObject _object5;
+	SceneObject _object6;
+	SceneHotspot1  _sceneHotspot1;
+	NamedHotspot _sceneHotspot2;
+	NamedHotspot _sceneHotspot3;
+	NamedHotspot _sceneHotspot4;
+	NamedHotspot _sceneHotspot5;
+	NamedHotspot _sceneHotspot6;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9150 : public Scene2 {
+	class Object3 : public SceneObject9150 {
+	public:
+		virtual void signal();
+		virtual void dispatch();
+	};
+public:
+	SequenceManager _sequenceManager1;
+	SequenceManager _sequenceManager2;
+	SceneObject _object1;
+	SceneObject _object2;
+	Object3 _object3;
+	NamedHotspot _sceneHotspot1;
+	NamedHotspot _sceneHotspot2;
+	NamedHotspot _sceneHotspot3;
+	NamedHotspot _sceneHotspot4;
+	NamedHotspot _sceneHotspot5;
+	NamedHotspot _sceneHotspot6;
+	NamedHotspot _sceneHotspot7;
+	NamedHotspot _sceneHotspot8;
+	NamedHotspot _sceneHotspot9;
+	NamedHotspot _sceneHotspot10;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9200 : public Scene2 {
+	class SceneHotspot1 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	SequenceManager _sequenceManager;
+	SceneObject _object1;
+	SceneObject _object2;
+	SceneObject _object3;
+	Action _action1;
+	SpeakerGText _speakerGText;
+	SpeakerGR _speakerGR;
+	SpeakerQText _speakerQText;
+	ASound _soundHandler;
+	SceneHotspot1 _hotspot1;
+	NamedHotspot _hotspot2;
+	NamedHotspot _hotspot3;
+	NamedHotspot _hotspot4;
+	NamedHotspot _hotspot5;
+	NamedHotspot _hotspot6;
+	NamedHotspot _hotspot7;
+	NamedHotspot _hotspot8;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+	virtual void process(Event &event);
+};
+
+class Scene9300 : public Scene {
+public:
+	SequenceManager _sequenceManager;
+	SceneObject _object1;
+	SceneObject _object2;
+	NamedHotspot _hotspot1;
+	NamedHotspot _hotspot2;
+	NamedHotspot _hotspot3;
+	NamedHotspot _hotspot4;
+	NamedHotspot _hotspot5;
+	NamedHotspot _hotspot6;
+	NamedHotspot _hotspot7;
+	NamedHotspot _hotspot8;
+	NamedHotspot _hotspot9;
+	NamedHotspot _hotspot10;
+	NamedHotspot _hotspot11;
+	NamedHotspot _hotspot12;
+	NamedHotspot _hotspot13;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9350 : public Scene2 {
+public:
+	SequenceManager _sequenceManager;
+	Object9350 _object1;
+	SceneObject _object2;
+	NamedHotspot _sceneHotspot1;
+	NamedHotspot _sceneHotspot2;
+	NamedHotspot _sceneHotspot3;
+	NamedHotspot _sceneHotspot4;
+	NamedHotspot _sceneHotspot5;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9360 : public Scene2 {
+public:
+	SequenceManager _sequenceManager;
+	Action _action1;
+	Object9350 _object1;
+	NamedHotspot _hotspot1;
+	NamedHotspot _hotspot2;
+	NamedHotspot _hotspot3;
+	NamedHotspot _hotspot4;
+	NamedHotspot _hotspot5;
+	NamedHotspot _hotspot6;
+	NamedHotspot _hotspot7;
+	NamedHotspot _hotspot8;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9400 : public Scene2 {
+	class SceneHotspot7 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+
+	class SceneHotspot8 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	Scene9400();
+	SequenceManager _sequenceManager;
+	Action _action1;
+	SceneObject _object1;
+	SceneObject _object2;
+	SceneObject _object3;
+	SpeakerOText _speakerOText;
+	SpeakerOR _speakerOR;
+	SpeakerQText _speakerQText;
+	NamedHotspot _hotspot1;
+	NamedHotspot _hotspot2;
+	NamedHotspot _hotspot3;
+	NamedHotspot _hotspot4;
+	NamedHotspot _hotspot5;
+	NamedHotspot _hotspot6;
+	ASound _soundHandler;
+	int _field1032;
+	SceneHotspot7 _hotspot7;
+	SceneHotspot8 _hotspot8;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+	virtual void synchronize(Serializer &s);
+};
+
+class Scene9450 : public Scene2 {
+	class Object2 : public SceneObject {
+	public:
+		virtual void signal();
+	};
+
+	class Object3 : public SceneObject9150 {
+	public:
+		virtual void dispatch();
+	};
+
+	class Hotspot1 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+
+	class Hotspot3 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+public:
+	SceneObject _object1;
+	SequenceManager _sequenceManager1;
+	SequenceManager _sequenceManager2;
+	Object2 _object2;
+	SequenceManager _sequenceManager3;
+	Object3 _object3;
+	Hotspot1 _hotspot1;
+	NamedHotspot _hotspot2;
+	Hotspot3 _hotspot3;
+	NamedHotspot _hotspot4;
+	NamedHotspot _hotspot5;
+	NamedHotspot _hotspot6;
+	NamedHotspot _hotspot7;
+	NamedHotspot _hotspot8;
+	NamedHotspot _hotspot9;
+	NamedHotspot _hotspot10;
+	NamedHotspot _hotspot11;
+	NamedHotspot _hotspot12;
+	NamedHotspot _hotspot13;
+	NamedHotspot _hotspot14;
+	NamedHotspot _hotspot15;
+	NamedHotspot _hotspot16;
+
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void dispatch();
+};
+
+class Scene9500 : public Scene2 {
+	class Hotspot1 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+
+	class Hotspot2 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+
+	class Hotspot3 : public NamedHotspot{
+	public:
+		virtual void doAction(int action);
+	};
+
+	class Hotspot4 : public NamedHotspot{
+	public:






More information about the Scummvm-git-logs mailing list