[Scummvm-cvs-logs] scummvm master -> 6ef18187de22de775c5e440e57ca62648be865b2

dreammaster dreammaster at scummvm.org
Thu Sep 8 12:50:31 CEST 2011


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

Summary:
88e68abd4b TSAGE: Separated speaker classes for both games into separate files
8b17e8a9b8 TSAGE: More core functionality needed for Blue Force
6ef18187de TSAGE: Implemented Scene 315 (Inside Police Station)


Commit: 88e68abd4b0e2b8430395cc0ad87dac45ef974c6
    https://github.com/scummvm/scummvm/commit/88e68abd4b0e2b8430395cc0ad87dac45ef974c6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-09-08T03:40:23-07:00

Commit Message:
TSAGE: Separated speaker classes for both games into separate files

Changed paths:
  A engines/tsage/blue_force/blueforce_speakers.cpp
  A engines/tsage/blue_force/blueforce_speakers.h
  A engines/tsage/ringworld/ringworld_speakers.cpp
  A engines/tsage/ringworld/ringworld_speakers.h
    engines/tsage/ringworld/ringworld_logic.cpp
    engines/tsage/ringworld/ringworld_logic.h
    engines/tsage/ringworld/ringworld_scenes1.h
    engines/tsage/ringworld/ringworld_scenes10.h
    engines/tsage/ringworld/ringworld_scenes2.h
    engines/tsage/ringworld/ringworld_scenes3.h
    engines/tsage/ringworld/ringworld_scenes4.h
    engines/tsage/ringworld/ringworld_scenes5.h
    engines/tsage/ringworld/ringworld_scenes6.h
    engines/tsage/ringworld/ringworld_scenes8.h



diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp
new file mode 100644
index 0000000..95a7372
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_speakers.cpp
@@ -0,0 +1,291 @@
+/* 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_speakers.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/graphics.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+VisualSpeaker::VisualSpeaker(): Speaker() {
+	_textWidth = 312;
+	_color1 = 19;
+	_hideObjects = false;
+	_removeObject1 = false;
+	_removeObject2 = false;
+	_xp = 160;
+	_fontNumber = 4;
+	_color2 = 82;
+	_offsetPos = Common::Point(4, 170);
+	_numFrames = 0;
+}
+
+void VisualSpeaker::remove() {
+	if (_removeObject2)
+		_object2.remove();
+	if (_removeObject1)
+		_object1.remove();
+
+	Speaker::remove();
+}
+
+void VisualSpeaker::synchronize(Serializer &s) {
+	Speaker::synchronize(s);
+	
+	s.syncAsByte(_removeObject1);
+	s.syncAsByte(_removeObject2);
+	s.syncAsSint16LE(_xp);
+	s.syncAsSint16LE(_numFrames);
+	s.syncAsSint16LE(_offsetPos.x);
+	s.syncAsSint16LE(_offsetPos.y);
+}
+
+void VisualSpeaker::proc12(Action *action) {
+	Speaker::proc12(action);
+	_textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left,
+		_offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top);
+	_numFrames = 0;
+}
+
+void VisualSpeaker::setText(const Common::String &msg) {
+	_objectList.draw();
+	BF_GLOBALS._sceneObjects->draw();
+
+	_sceneText._color1 = _color1;
+	_sceneText._color2 = _color2;
+	_sceneText._color3 = _color3;
+	_sceneText._width = _textWidth;
+	_sceneText._fontNumber = _fontNumber;
+	_sceneText._textMode = _textMode;
+	_sceneText.setup(msg);
+
+	// Get the string bounds
+	GfxFont f;
+	f.setFontNumber(_fontNumber);
+	Rect bounds;
+	f.getStringBounds(msg.c_str(), bounds, _textWidth);
+
+	// Set the position for the text
+	switch (_textMode) {
+	case ALIGN_LEFT:
+	case ALIGN_JUSTIFIED:
+		_sceneText.setPosition(_textPos);
+		break;
+	case ALIGN_CENTER:
+		_sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y));
+		break;
+	case ALIGN_RIGHT:
+		_sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y));
+		break;
+	default:
+		break;
+	}
+
+	// Ensure the text is in the foreground
+	_sceneText.fixPriority(256);
+
+	// Count the number of words (by spaces) in the string
+	const char *s = msg.c_str();
+	int spaceCount = 0;
+	while (*s) {
+		if (*s++ == ' ')
+			++spaceCount;
+	}
+
+	_numFrames = spaceCount * 3 + 2;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerGameText::SpeakerGameText(): VisualSpeaker() {
+	_speakerName = "GAMETEXT";
+	_color1 = 8;
+	_color2 = 19;
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerSutter::SpeakerSutter() {
+	_speakerName = "SUTTER";
+	_color1 = 20;
+	_color2 = 22;
+	_textMode = ALIGN_CENTER;
+}
+
+void SpeakerSutter::setText(const Common::String &msg) {
+	_removeObject1 = _removeObject2 = true;
+
+	_object1.postInit();
+	_object1.setVisage(329);
+	_object1.setStrip2(2);
+	_object1.fixPriority(254);
+	_object1.changeZoom(100);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	_object2.postInit();
+	_object2.setVisage(329);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	VisualSpeaker::setText(msg);
+	_object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerDoug::SpeakerDoug(): VisualSpeaker() {
+	_color1 = 32;
+	_speakerName = "DOUG";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() {
+	_color1 = 13;
+	_speakerName = "JAKE_NO_HEAD";
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerHarrison::SpeakerHarrison(): VisualSpeaker() {
+	_color1 = 32;
+	_speakerName = "HARRISON";
+}
+
+void SpeakerHarrison::setText(const Common::String &msg) {
+	_removeObject1 = _removeObject2 = true;
+
+	_object1.postInit();
+	_object1.setVisage(325);
+	_object1.setStrip2(7);
+	_object1.fixPriority(254);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	_object2.postInit();
+	_object2.fixPriority(255);
+	_object2.setVisage(325);
+	_object2.setStrip2(6);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	VisualSpeaker::setText(msg);
+	_object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeJacket::SpeakerJakeJacket(): VisualSpeaker() {
+	_color1 = 13;
+	_color2 = 7;
+	_speakerName = "JAKEJACKET";
+}
+
+void SpeakerJakeJacket::setText(const Common::String &msg) {
+	_removeObject1 = _removeObject2 = true;
+
+	_object1.postInit();
+	_object1.setVisage(1001);
+	_object1.setStrip2(4);
+	_object1.fixPriority(254);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	_object2.postInit();
+	_object2.setVisage(1001);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	VisualSpeaker::setText(msg);
+	_object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJakeUniform::SpeakerJakeUniform(): VisualSpeaker() {
+	_color1 = 13;
+	_color2 = 7;
+	_speakerName = "JAKEUNIFORM";
+}
+
+void SpeakerJakeUniform::setText(const Common::String &msg) {
+	_removeObject1 = _removeObject2 = true;
+
+	_object1.postInit();
+	_object1.setVisage(1001);
+	_object1.setStrip2(3);
+	_object1.fixPriority(254);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	_object2.postInit();
+	_object2.setVisage(1001);
+	_object2.setStrip2(1);
+	_object2.fixPriority(255);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	VisualSpeaker::setText(msg);
+	_object2.fixCountdown(8, _numFrames);
+}
+
+/*--------------------------------------------------------------------------*/
+
+SpeakerJailer::SpeakerJailer(): VisualSpeaker() {
+	_color1 = 13;
+	_color2 = 7;
+	_speakerName = "JAILER";
+}
+
+void SpeakerJailer::setText(const Common::String &msg) {
+	_removeObject1 = _removeObject2 = true;
+
+	_object1.postInit();
+	_object1.setVisage(395);
+	_object1.setStrip(6);
+	_object1.fixPriority(254);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	_object2.postInit();
+	_object2.setVisage(395);
+	_object2.setStrip(5);
+	_object2.fixPriority(255);
+	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40,
+		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
+
+	VisualSpeaker::setText(msg);
+	_object2.fixCountdown(8, _numFrames);
+}
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h
new file mode 100644
index 0000000..9db0dd2
--- /dev/null
+++ b/engines/tsage/blue_force/blueforce_speakers.h
@@ -0,0 +1,123 @@
+/* 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_SPEAKERS_H
+#define TSAGE_BLUEFORCE_SPEAKERS_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/blue_force/blueforce_logic.h"
+
+namespace TsAGE {
+
+namespace BlueForce {
+
+using namespace TsAGE;
+
+class VisualSpeaker: public Speaker {
+public:
+	NamedObject _object1;
+	CountdownObject _object2;
+	bool _removeObject1, _removeObject2;
+	int _xp;
+	int _numFrames;
+	Common::Point _offsetPos;
+public:
+	VisualSpeaker();
+
+	virtual Common::String getClassName() { return "VisualSpeaker"; }
+	virtual void synchronize(Serializer &s);
+	virtual void remove();
+	virtual void proc12(Action *action);
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerGameText: public VisualSpeaker {
+public:
+	SpeakerGameText();
+
+	virtual Common::String getClassName() { return "SpeakerGameText"; }
+};
+
+class SpeakerSutter: public VisualSpeaker {
+public:
+	SpeakerSutter();
+
+	virtual Common::String getClassName() { return "SpeakerSutter"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerDoug: public VisualSpeaker {
+public:
+	SpeakerDoug();
+
+	virtual Common::String getClassName() { return "SpeakerDoug"; }
+};
+
+class SpeakerJakeNoHead: public VisualSpeaker {
+public:
+	SpeakerJakeNoHead();
+
+	virtual Common::String getClassName() { return "SpeakerJakeNoHead"; }
+};
+
+class SpeakerHarrison: public VisualSpeaker {
+public:
+	SpeakerHarrison();
+
+	virtual Common::String getClassName() { return "SpeakerHarrison"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJakeJacket: public VisualSpeaker {
+public:
+	SpeakerJakeJacket();
+
+	virtual Common::String getClassName() { return "SpeakerJakeJacket"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJakeUniform: public VisualSpeaker {
+public:
+	SpeakerJakeUniform();
+
+	virtual Common::String getClassName() { return "SpeakerJakeUniform"; }
+	virtual void setText(const Common::String &msg);
+};
+
+class SpeakerJailer: public VisualSpeaker {
+public:
+	SpeakerJailer();
+
+	virtual Common::String getClassName() { return "SpeakerJailer"; }
+	virtual void setText(const Common::String &msg);
+};
+
+} // End of namespace BlueForce
+
+} // End of namespace TsAGE
+
+#endif
diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp
index 72c5697..4bd0b0a 100644
--- a/engines/tsage/ringworld/ringworld_logic.cpp
+++ b/engines/tsage/ringworld/ringworld_logic.cpp
@@ -331,878 +331,6 @@ void SceneArea::synchronize(Serializer &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."),
diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h
index 830b283..286abd3 100644
--- a/engines/tsage/ringworld/ringworld_logic.h
+++ b/engines/tsage/ringworld/ringworld_logic.h
@@ -102,302 +102,6 @@ public:
 };
 
 /*--------------------------------------------------------------------------*/
-// 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:
diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h
index 49ea65e..bb98c89 100644
--- a/engines/tsage/ringworld/ringworld_scenes1.h
+++ b/engines/tsage/ringworld/ringworld_scenes1.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 #include "tsage/converse.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h
index 02c42f3..6bca487 100644
--- a/engines/tsage/ringworld/ringworld_scenes10.h
+++ b/engines/tsage/ringworld/ringworld_scenes10.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
 #include "tsage/scenes.h"
diff --git a/engines/tsage/ringworld/ringworld_scenes2.h b/engines/tsage/ringworld/ringworld_scenes2.h
index 3502aea..382d9d4 100644
--- a/engines/tsage/ringworld/ringworld_scenes2.h
+++ b/engines/tsage/ringworld/ringworld_scenes2.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
 #include "tsage/scenes.h"
diff --git a/engines/tsage/ringworld/ringworld_scenes3.h b/engines/tsage/ringworld/ringworld_scenes3.h
index 2dbdc27..682ef44 100644
--- a/engines/tsage/ringworld/ringworld_scenes3.h
+++ b/engines/tsage/ringworld/ringworld_scenes3.h
@@ -27,6 +27,7 @@
 #include "tsage/core.h"
 #include "tsage/converse.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 
 namespace TsAGE {
 
diff --git a/engines/tsage/ringworld/ringworld_scenes4.h b/engines/tsage/ringworld/ringworld_scenes4.h
index af31de8..6470680 100644
--- a/engines/tsage/ringworld/ringworld_scenes4.h
+++ b/engines/tsage/ringworld/ringworld_scenes4.h
@@ -27,6 +27,7 @@
 #include "tsage/core.h"
 #include "tsage/converse.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 
 namespace TsAGE {
 
diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h
index 6c6b6b6..80e6775 100644
--- a/engines/tsage/ringworld/ringworld_scenes5.h
+++ b/engines/tsage/ringworld/ringworld_scenes5.h
@@ -27,6 +27,7 @@
 #include "tsage/core.h"
 #include "tsage/converse.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 
 namespace TsAGE {
 
diff --git a/engines/tsage/ringworld/ringworld_scenes6.h b/engines/tsage/ringworld/ringworld_scenes6.h
index 79e604a..bf353de 100644
--- a/engines/tsage/ringworld/ringworld_scenes6.h
+++ b/engines/tsage/ringworld/ringworld_scenes6.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
 #include "tsage/scenes.h"
diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h
index 4878db5..84178c3 100644
--- a/engines/tsage/ringworld/ringworld_scenes8.h
+++ b/engines/tsage/ringworld/ringworld_scenes8.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/ringworld/ringworld_logic.h"
+#include "tsage/ringworld/ringworld_speakers.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
 #include "tsage/scenes.h"
diff --git a/engines/tsage/ringworld/ringworld_speakers.cpp b/engines/tsage/ringworld/ringworld_speakers.cpp
new file mode 100644
index 0000000..c56639a
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_speakers.cpp
@@ -0,0 +1,905 @@
+/* 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_speakers.h"
+#include "tsage/scenes.h"
+#include "tsage/tsage.h"
+#include "tsage/graphics.h"
+#include "tsage/staticres.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+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);
+}
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld/ringworld_speakers.h b/engines/tsage/ringworld/ringworld_speakers.h
new file mode 100644
index 0000000..305984a
--- /dev/null
+++ b/engines/tsage/ringworld/ringworld_speakers.h
@@ -0,0 +1,337 @@
+/* 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_SPEAKERS_H
+#define TSAGE_RINGWORLD_SPEAKERS_H
+
+#include "common/scummsys.h"
+#include "tsage/converse.h"
+#include "tsage/events.h"
+#include "tsage/core.h"
+#include "tsage/scenes.h"
+#include "tsage/globals.h"
+#include "tsage/ringworld/ringworld_logic.h"
+
+namespace TsAGE {
+
+namespace Ringworld {
+
+using namespace TsAGE;
+
+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);
+};
+
+} // End of namespace Ringworld
+
+} // End of namespace TsAGE
+
+#endif


Commit: 8b17e8a9b841bea6810c519143a7a3cd44521497
    https://github.com/scummvm/scummvm/commit/8b17e8a9b841bea6810c519143a7a3cd44521497
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-09-08T03:41:10-07:00

Commit Message:
TSAGE: More core functionality needed for Blue Force

Changed paths:
    engines/tsage/blue_force/blueforce_logic.cpp
    engines/tsage/blue_force/blueforce_logic.h
    engines/tsage/blue_force/blueforce_scenes1.cpp
    engines/tsage/blue_force/blueforce_scenes1.h
    engines/tsage/blue_force/blueforce_ui.cpp
    engines/tsage/blue_force/blueforce_ui.h
    engines/tsage/converse.cpp
    engines/tsage/converse.h
    engines/tsage/core.cpp
    engines/tsage/core.h
    engines/tsage/events.h
    engines/tsage/globals.cpp
    engines/tsage/globals.h
    engines/tsage/module.mk



diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp
index 99e3c38..616a773 100644
--- a/engines/tsage/blue_force/blueforce_logic.cpp
+++ b/engines/tsage/blue_force/blueforce_logic.cpp
@@ -84,6 +84,8 @@ Scene *BlueForceGame::createScene(int sceneNumber) {
 		// Outside Police Station
 		return new Scene300();
 	case 315:
+		// Inside Police Station
+		return new Scene315();
 	case 325:
 	case 330:
 	case 340:
@@ -360,7 +362,7 @@ void NamedObject::synchronize(Serializer &s) {
 	s.syncAsSint16LE(_useLineNum);
 }
 
-void NamedObject::startAction(CursorType action) {
+void NamedObject::startAction(CursorType action, Event &event) {
 	bool handled = true;
 
 	switch (action) {
@@ -498,10 +500,13 @@ void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yD
 /*--------------------------------------------------------------------------*/
 
 SceneExt::SceneExt(): Scene() {
-	warning("TODO: dword_503AA/dword_503AE/dword_53030");
+	_stripManager._onBegin = SceneExt::startStrip;
+	_stripManager._onEnd = SceneExt::endStrip;
 
-	_field372 = 0;
-	_field37A = 0;
+	_field372 = _field37A = 0;
+	_savedPlayerEnabled = false;
+	_savedUiEnabled = false;
+	_savedCanWalk = false;
 	_eventHandler = NULL;
 	_cursorVisage.setVisage(1, 8);
 }
@@ -599,6 +604,35 @@ void SceneExt::gunDisplay() {
 	}
 }
 
+void SceneExt::startStrip() {
+	SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+	scene->_field372 = 1;
+	scene->_savedPlayerEnabled = BF_GLOBALS._player._enabled;
+	
+	if (scene->_savedPlayerEnabled) {
+		scene->_savedUiEnabled = BF_GLOBALS._player._uiEnabled;
+		scene->_savedCanWalk = BF_GLOBALS._player._canWalk;
+		BF_GLOBALS._player.disableControl();
+
+		if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active)
+			BF_GLOBALS._uiElements.hide();
+	}
+}
+
+void SceneExt::endStrip() {
+	SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene;
+	scene->_field372 = 0;
+
+	if (scene->_savedPlayerEnabled) {
+		BF_GLOBALS._player.enableControl();
+		BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled;
+		BF_GLOBALS._player._canWalk = scene->_savedCanWalk;
+
+		if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active)
+			BF_GLOBALS._uiElements.show();
+	}
+}
+
 /*--------------------------------------------------------------------------*/
 
 GroupedScene::GroupedScene() {
@@ -644,145 +678,17 @@ void SceneHandlerExt::process(Event &event) {
 			return;
 	}
 
-	SceneHandler::process(event);
-
-	// TODO: All the new stuff from Blue Force
-}
-
-/*--------------------------------------------------------------------------*/
-
-VisualSpeaker::VisualSpeaker(): Speaker() {
-	_textWidth = 312;
-	_color1 = 19;
-	_hideObjects = false;
-	_removeObject1 = false;
-	_removeObject2 = false;
-	_field20E = 160;
-	_fontNumber = 4;
-	_color2 = 82;
-	_offsetPos = Common::Point(4, 170);
-	_numFrames = 0;
-}
-
-void VisualSpeaker::remove() {
-	if (_removeObject2)
-		_object2.remove();
-	if (_removeObject1)
-		_object1.remove();
-
-	Speaker::remove();
-}
-
-void VisualSpeaker::synchronize(Serializer &s) {
-	Speaker::synchronize(s);
-	
-	s.syncAsByte(_removeObject1);
-	s.syncAsByte(_removeObject2);
-	s.syncAsSint16LE(_field20C);
-	s.syncAsSint16LE(_field20E);
-	s.syncAsSint16LE(_numFrames);
-	s.syncAsSint16LE(_offsetPos.x);
-	s.syncAsSint16LE(_offsetPos.y);
-}
-
-void VisualSpeaker::proc12(Action *action) {
-	Speaker::proc12(action);
-	_textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left,
-		_offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top);
-	_numFrames = 0;
-}
-
-void VisualSpeaker::setText(const Common::String &msg) {
-	_objectList.draw();
-	BF_GLOBALS._sceneObjects->draw();
-
-	_sceneText._color1 = _color1;
-	_sceneText._color2 = _color2;
-	_sceneText._color3 = _color3;
-	_sceneText._width = _textWidth;
-	_sceneText._fontNumber = _fontNumber;
-	_sceneText._textMode = _textMode;
-	_sceneText.setup(msg);
-
-	// Get the string bounds
-	GfxFont f;
-	f.setFontNumber(_fontNumber);
-	Rect bounds;
-	f.getStringBounds(msg.c_str(), bounds, _textWidth);
-
-	// Set the position for the text
-	switch (_textMode) {
-	case ALIGN_LEFT:
-	case ALIGN_JUSTIFIED:
-		_sceneText.setPosition(_textPos);
-		break;
-	case ALIGN_CENTER:
-		_sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y));
-		break;
-	case ALIGN_RIGHT:
-		_sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y));
-		break;
-	default:
-		break;
-	}
-
-	// Ensure the text is in the foreground
-	_sceneText.fixPriority(256);
-
-	// Count the number of words (by spaces) in the string
-	const char *s = msg.c_str();
-	int spaceCount = 0;
-	while (*s) {
-		if (*s++ == ' ')
-			++spaceCount;
+	// If the strip proxy is currently being controlled by the strip manager, 
+	// then pass all events to it first
+	if (BF_GLOBALS._stripProxy._action) {
+		BF_GLOBALS._stripProxy._action->process(event);
+		if (event.handled)
+			return;
 	}
 
-	_numFrames = spaceCount * 3 + 2;
-}
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerSutter::SpeakerSutter() {
-	_speakerName = "SUTTER";
-	_color1 = 20;
-	_color2 = 22;
-	_textMode = ALIGN_CENTER;
-}
-
-void SpeakerSutter::setText(const Common::String &msg) {
-	_removeObject1 = _removeObject2 = true;
-
-	_object1.postInit();
-	_object1.setVisage(329);
-	_object1.setStrip2(2);
-	_object1.fixPriority(254);
-	_object1.changeZoom(100);
-	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
-		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
-
-	_object2.postInit();
-	_object2.setVisage(329);
-	_object2.setStrip2(1);
-	_object2.fixPriority(255);
-	_object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45,
-		BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166));
-
-	VisualSpeaker::setText(msg);
-	_object2.fixCountdown(8, _numFrames);
-}
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerDoug::SpeakerDoug(): VisualSpeaker() {
-	_color1 = 32;
-	_speakerName = "DOUG";
-}
-
-/*--------------------------------------------------------------------------*/
+	SceneHandler::process(event);
 
-SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() {
-	_color1 = 13;
-	_speakerName = "JAKE_NO_HEAD";
+	// TODO: All the new stuff from Blue Force
 }
 
 /*--------------------------------------------------------------------------*/
@@ -936,66 +842,66 @@ void BlueForceInvObjectList::reset() {
 	}
 
 	// Set up default inventory
-	setObjectRoom(INV_COLT45, 1);
-	setObjectRoom(INV_HANDCUFFS, 1);
-	setObjectRoom(INV_AMMO_BELT, 1);
-	setObjectRoom(INV_ID, 1);
+	setObjectScene(INV_COLT45, 1);
+	setObjectScene(INV_HANDCUFFS, 1);
+	setObjectScene(INV_AMMO_BELT, 1);
+	setObjectScene(INV_ID, 1);
 
 	// Set default room for other objects
-	setObjectRoom(INV_TICKET_BOOK, 60);
-	setObjectRoom(INV_MIRANDA_CARD, 60);
-	setObjectRoom(INV_FOREST_RAP, 320);
-	setObjectRoom(INV_GREEN_ID, 370);
-	setObjectRoom(INV_BASEBALL_CARD, 840);
-	setObjectRoom(INV_BOOKING_GREEN, 390);
-	setObjectRoom(INV_FLARE, 355);
-	setObjectRoom(INV_COBB_RAPP, 810);
-	setObjectRoom(INV_22_BULLET, 415);
-	setObjectRoom(INV_AUTO_RIFLE, 415);
-	setObjectRoom(INV_WIG, 415);
-	setObjectRoom(INV_FRANKIE_ID, 410);
-	setObjectRoom(INV_TYRONE_ID, 410);
-	setObjectRoom(INV_22_SNUB, 410);
-	setObjectRoom(INV_FBI_TELETYPE, 320);
-	setObjectRoom(INV_DA_NOTE, 320);
-	setObjectRoom(INV_PRINT_OUT, 570);
-	setObjectRoom(INV_WHAREHOUSE_KEYS, 360);
-	setObjectRoom(INV_CENTER_PUNCH, 0);
-	setObjectRoom(INV_TRANQ_GUN, 830);
-	setObjectRoom(INV_HOOK, 350);
-	setObjectRoom(INV_RAGS, 870);
-	setObjectRoom(INV_JAR, 870);
-	setObjectRoom(INV_SCREWDRIVER, 355);
-	setObjectRoom(INV_D_FLOPPY, 570);
-	setObjectRoom(INV_BLANK_DISK, 560);
-	setObjectRoom(INV_STICK, 710);
-	setObjectRoom(INV_CRATE1, 710);
-	setObjectRoom(INV_CRATE2, 870);
-	setObjectRoom(INV_SHOEBOX, 270);
-	setObjectRoom(INV_BADGE, 560);
-	setObjectRoom(INV_RENTAL_COUPON, 0);
-	setObjectRoom(INV_NICKEL, 560);
-	setObjectRoom(INV_LYLE_CARD, 270);
-	setObjectRoom(INV_CARTER_NOTE, 830);
-	setObjectRoom(INV_MUG_SHOT, 810);
-	setObjectRoom(INV_CLIPPING, 810);
-	setObjectRoom(INV_MICROFILM, 810);
-	setObjectRoom(INV_WAVE_KEYS, 840);
-	setObjectRoom(INV_RENTAL_KEYS, 840);
-	setObjectRoom(INV_NAPKIN, 115);
-	setObjectRoom(INV_DMV_PRINTOUT, 810);
-	setObjectRoom(INV_FISHING_NET, 830);
-	setObjectRoom(INV_9MM_BULLETS, 930);
-	setObjectRoom(INV_SCHEDULE, 930);
-	setObjectRoom(INV_GRENADES, 355);
-	setObjectRoom(INV_GREENS_KNIFE, 370);
-	setObjectRoom(INV_JACKET, 880);
-	setObjectRoom(INV_DOG_WHISTLE, 880);
-	setObjectRoom(INV_YELLOW_CORD, 910);
-	setObjectRoom(INV_BLACK_CORD, 910);
-}
-
-void BlueForceInvObjectList::setObjectRoom(int objectNum, int sceneNumber) {
+	setObjectScene(INV_TICKET_BOOK, 60);
+	setObjectScene(INV_MIRANDA_CARD, 60);
+	setObjectScene(INV_FOREST_RAP, 320);
+	setObjectScene(INV_GREEN_ID, 370);
+	setObjectScene(INV_BASEBALL_CARD, 840);
+	setObjectScene(INV_BOOKING_GREEN, 390);
+	setObjectScene(INV_FLARE, 355);
+	setObjectScene(INV_COBB_RAP, 810);
+	setObjectScene(INV_22_BULLET, 415);
+	setObjectScene(INV_AUTO_RIFLE, 415);
+	setObjectScene(INV_WIG, 415);
+	setObjectScene(INV_FRANKIE_ID, 410);
+	setObjectScene(INV_TYRONE_ID, 410);
+	setObjectScene(INV_22_SNUB, 410);
+	setObjectScene(INV_FBI_TELETYPE, 320);
+	setObjectScene(INV_DA_NOTE, 320);
+	setObjectScene(INV_PRINT_OUT, 570);
+	setObjectScene(INV_WHAREHOUSE_KEYS, 360);
+	setObjectScene(INV_CENTER_PUNCH, 0);
+	setObjectScene(INV_TRANQ_GUN, 830);
+	setObjectScene(INV_HOOK, 350);
+	setObjectScene(INV_RAGS, 870);
+	setObjectScene(INV_JAR, 870);
+	setObjectScene(INV_SCREWDRIVER, 355);
+	setObjectScene(INV_D_FLOPPY, 570);
+	setObjectScene(INV_BLANK_DISK, 560);
+	setObjectScene(INV_STICK, 710);
+	setObjectScene(INV_CRATE1, 710);
+	setObjectScene(INV_CRATE2, 870);
+	setObjectScene(INV_SHOEBOX, 270);
+	setObjectScene(INV_BADGE, 560);
+	setObjectScene(INV_RENTAL_COUPON, 0);
+	setObjectScene(INV_NICKEL, 560);
+	setObjectScene(INV_LYLE_CARD, 270);
+	setObjectScene(INV_CARTER_NOTE, 830);
+	setObjectScene(INV_MUG_SHOT, 810);
+	setObjectScene(INV_CLIPPING, 810);
+	setObjectScene(INV_MICROFILM, 810);
+	setObjectScene(INV_WAVE_KEYS, 840);
+	setObjectScene(INV_RENTAL_KEYS, 840);
+	setObjectScene(INV_NAPKIN, 115);
+	setObjectScene(INV_DMV_PRINTOUT, 810);
+	setObjectScene(INV_FISHING_NET, 830);
+	setObjectScene(INV_9MM_BULLETS, 930);
+	setObjectScene(INV_SCHEDULE, 930);
+	setObjectScene(INV_GRENADES, 355);
+	setObjectScene(INV_GREENS_KNIFE, 370);
+	setObjectScene(INV_JACKET, 880);
+	setObjectScene(INV_DOG_WHISTLE, 880);
+	setObjectScene(INV_YELLOW_CORD, 910);
+	setObjectScene(INV_BLACK_CORD, 910);
+}
+
+void BlueForceInvObjectList::setObjectScene(int objectNum, int sceneNumber) {
 	// Find the appropriate object
 	int num = objectNum;
 	SynchronizedList<InvObject *>::iterator i = _itemList.begin(); 
@@ -1010,6 +916,8 @@ void BlueForceInvObjectList::setObjectRoom(int objectNum, int sceneNumber) {
 	BF_GLOBALS._uiElements.updateInventory();
 }
 
+/*--------------------------------------------------------------------------*/
+
 } // End of namespace BlueForce
 
 } // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h
index c4c1b22..b2cab69 100644
--- a/engines/tsage/blue_force/blueforce_logic.h
+++ b/engines/tsage/blue_force/blueforce_logic.h
@@ -35,7 +35,7 @@ namespace BlueForce {
 
 using namespace TsAGE;
 
-#define BLUE_INVENTORY (*((::TsAGE::BlueForce::BlueForceInvObjectList *)_globals->_inventory))
+#define BF_INVENTORY (*((::TsAGE::BlueForce::BlueForceInvObjectList *)_globals->_inventory))
 
 class BlueForceGame: public Game {
 public:
@@ -107,7 +107,7 @@ public:
 	virtual Common::String getClassName() { return "NamedObject"; }
 	virtual void synchronize(Serializer &s);
 	virtual void postInit(SceneObjectList *OwnerList = NULL);
-	virtual void startAction(CursorType action);
+	virtual void startAction(CursorType action, Event &event);
 
 	void setup(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item);
 };
@@ -137,15 +137,22 @@ public:
 	void setup(SceneObject *object, int visage, int frameNum, int yDiff);
 };
 
-enum ExitFrame { EXITFRAME_NE = 2, EXITFRAME_E = 3 };
+enum ExitFrame { EXITFRAME_N = 1, EXITFRAME_NE = 2, EXITFRAME_E = 3, EXITFRAME_SE = 4, 
+		EXITFRAME_S = 5, EXITFRAME_SW = 6, EXITFRAME_W = 7, EXITFRAME_NW = 8 };
 
 class SceneExt: public Scene {
 private:
 	void gunDisplay();
+	static void startStrip();
+	static void endStrip();
 public:
 	AObjectArray _timerList, _objArray2;
 	int _field372;
+	bool _savedPlayerEnabled;
+	bool _savedUiEnabled;
+	bool _savedCanWalk;
 	int _field37A;
+
 	EventHandler *_eventHandler;
 	Visage _cursorVisage;
 
@@ -182,46 +189,6 @@ public:
 	virtual void process(Event &event);
 };
 
-class VisualSpeaker: public Speaker {
-public:
-	NamedObject _object1;
-	CountdownObject _object2;
-	bool _removeObject1, _removeObject2;
-	int _field20C, _field20E;
-	int _numFrames;
-	Common::Point _offsetPos;
-public:
-	VisualSpeaker();
-
-	virtual Common::String getClassName() { return "VisualSpeaker"; }
-	virtual void synchronize(Serializer &s);
-	virtual void remove();
-	virtual void proc12(Action *action);
-	virtual void setText(const Common::String &msg);
-};
-
-class SpeakerSutter: public VisualSpeaker {
-public:
-	SpeakerSutter();
-
-	virtual Common::String getClassName() { return "SpeakerSutter"; }
-	virtual void setText(const Common::String &msg);
-};
-
-class SpeakerDoug: public VisualSpeaker {
-public:
-	SpeakerDoug();
-
-	virtual Common::String getClassName() { return "SpeakerDoug"; }
-};
-
-class SpeakerJakeNoHead: public VisualSpeaker {
-public:
-	SpeakerJakeNoHead();
-
-	virtual Common::String getClassName() { return "SpeakerJakeNoHead"; }
-};
-
 class BlueForceInvObjectList : public InvObjectList {
 public:
 	InvObject _none;
@@ -295,7 +262,7 @@ public:
 
 	BlueForceInvObjectList();
 	void reset();
-	void setObjectRoom(int objectNum, int sceneNumber);
+	void setObjectScene(int objectNum, int sceneNumber);
 
 	virtual Common::String getClassName() { return "BlueForceInvObjectList"; }
 };
diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp
index acb1592..3ff8296 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes1.cpp
@@ -432,7 +432,7 @@ void Scene109::signal() {
  *
  *--------------------------------------------------------------------------*/
 
-void Scene190::Object4::startAction(CursorType action) {
+void Scene190::Object4::startAction(CursorType action, Event &event) {
 	Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
 
 	switch (action) {
@@ -445,14 +445,14 @@ void Scene190::Object4::startAction(CursorType action) {
 		break;
 	}
 	default:
-		NamedObject::startAction(action);
+		NamedObject::startAction(action, event);
 		break;
 	}
 }
 
 /*--------------------------------------------------------------------------*/
 
-void Scene190::Item1::startAction(CursorType action) {
+void Scene190::Item1::startAction(CursorType action, Event &event) {
 	Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
 
 	switch (action) {
@@ -460,12 +460,12 @@ void Scene190::Item1::startAction(CursorType action) {
 		scene->setAction(&scene->_action1);
 		break;
 	default:
-		NamedHotspot::startAction(action);
+		NamedHotspot::startAction(action, event);
 		break;
 	}
 }
 
-void Scene190::Item2::startAction(CursorType action) {
+void Scene190::Item2::startAction(CursorType action, Event &event) {
 	Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
 
 	switch (action) {
@@ -473,12 +473,12 @@ void Scene190::Item2::startAction(CursorType action) {
 		scene->_stripManager.start(1900, scene);
 		break;
 	default:
-		NamedHotspot::startAction(action);
+		NamedHotspot::startAction(action, event);
 		break;
 	}
 }
 
-void Scene190::Exit::startAction(CursorType action) {
+void Scene190::Exit::startAction(CursorType action, Event &event) {
 	Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene;
 
 	Common::Point pt(316, 91);
diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h
index 3f4d1cb..6eeeff9 100644
--- a/engines/tsage/blue_force/blueforce_scenes1.h
+++ b/engines/tsage/blue_force/blueforce_scenes1.h
@@ -128,21 +128,21 @@ class Scene190: public SceneExt {
 	/* Objects */
 	class Object4: public NamedObject {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 
 	/* Items */
 	class Item1: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Item2: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Exit: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 
 	/* Actions */
diff --git a/engines/tsage/blue_force/blueforce_ui.cpp b/engines/tsage/blue_force/blueforce_ui.cpp
index 8fc6860..81411b1 100644
--- a/engines/tsage/blue_force/blueforce_ui.cpp
+++ b/engines/tsage/blue_force/blueforce_ui.cpp
@@ -30,6 +30,13 @@ namespace TsAGE {
 
 namespace BlueForce {
 
+void StripProxy::process(Event &event) {
+	if (_action)
+		_action->process(event);
+}
+
+/*--------------------------------------------------------------------------*/
+
 void UIElement::synchronize(Serializer &s) {
 	AltSceneObject::synchronize(s);
 	s.syncAsSint16LE(_field88);
@@ -85,12 +92,16 @@ void UIQuestion::setEnabled(bool flag) {
 void UIScore::postInit(SceneObjectList *OwnerList) {
 	int xp = 266;
 	_digit3.setup(1, 6, 1, xp, 180, 255);
+	_digit3.reposition();
 	xp += 7;
 	_digit2.setup(1, 6, 1, xp, 180, 255);
+	_digit2.reposition();
 	xp += 7;
 	_digit1.setup(1, 6, 1, xp, 180, 255);
+	_digit1.reposition();
 	xp += 7;
 	_digit0.setup(1, 6, 1, xp, 180, 255);
+	_digit0.reposition();
 }
 
 void UIScore::draw() {
@@ -355,7 +366,7 @@ void UIElements::updateInventory() {
 	// Loop through the inventory objects
 	SynchronizedList<InvObject *>::iterator i;
 	int objIndex = 0;
-	for (i = BLUE_INVENTORY._itemList.begin(); i != BLUE_INVENTORY._itemList.end(); ++i, ++objIndex) {
+	for (i = BF_INVENTORY._itemList.begin(); i != BF_INVENTORY._itemList.end(); ++i, ++objIndex) {
 		InvObject *obj = *i;
 
 		// Check whether the object is in any of the four inventory slots
@@ -396,6 +407,15 @@ void UIElements::updateInvList() {
 	}
 }
 
+/**
+ * Set the game score
+ */
+void UIElements::addScore(int amount) {
+	_scoreValue += amount;
+	BF_GLOBALS._sound2.play(0);
+	updateInventory();
+}
+
 } // End of namespace BlueForce
 
 } // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_ui.h b/engines/tsage/blue_force/blueforce_ui.h
index 766f7dd..8dae914 100644
--- a/engines/tsage/blue_force/blueforce_ui.h
+++ b/engines/tsage/blue_force/blueforce_ui.h
@@ -33,6 +33,11 @@ namespace BlueForce {
 
 using namespace TsAGE;
 
+class StripProxy: public EventHandler {
+public:
+	virtual void process(Event &event);
+};
+
 class UIElement: public AltSceneObject {
 public:
 	int _field88;
@@ -132,6 +137,7 @@ public:
 
 	void setup(const Common::Point &pt);
 	void updateInventory();
+	void addScore(int amount);
 };
 
 } // End of namespace BlueForce
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index af9bca2..32a4861 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -40,6 +40,7 @@ SequenceManager::SequenceManager() : Action() {
 	_field26 = 0;
 	_objectIndex = 0;
 	_keepActive = false;
+	_onCallback = NULL;
 	setup();
 }
 
@@ -295,7 +296,8 @@ void SequenceManager::signal() {
 		case 37:
 			v1 = getNextValue();
 			v2 = getNextValue();
-			warning("TODO: dword_53030(%d,%d)", v1, v2);
+			if (_onCallback)
+				_onCallback(v1, v2);
 			break;
 		case 38: {
 			int resNum = getNextValue();
@@ -558,6 +560,8 @@ void Obj44::synchronize(Serializer &s) {
 StripManager::StripManager() {
 	_callbackObject = NULL;
 	_activeSpeaker = NULL;
+	_onBegin = NULL;
+	_onEnd = NULL;
 	reset();
 }
 
@@ -565,6 +569,8 @@ StripManager::~StripManager() {
 }
 
 void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callback) {
+	if (_onBegin)
+		_onBegin();
 	reset();
 
 	_stripNum = stripNum;
@@ -678,6 +684,9 @@ void StripManager::remove() {
 		_globals->_sceneManager._scene->loadScene(_sceneNumber);
 	}
 
+	if (_onEnd)
+		_onEnd();
+
 	Action::remove();
 }
 
diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h
index e263a12..f82c07a 100644
--- a/engines/tsage/converse.h
+++ b/engines/tsage/converse.h
@@ -34,6 +34,8 @@ public:
 	virtual void stripCallback(int v) = 0;
 };
 
+typedef void (*SequenceCallback)(int v1, int v2);
+
 class SequenceManager : public Action {
 private:
 	void setup();
@@ -54,6 +56,7 @@ public:
 	SceneObject *_sceneObject;
 	SceneObject *_objectList[6];
 	ASound _soundHandler;
+	SequenceCallback _onCallback;
 public:
 	SequenceManager();
 
@@ -187,6 +190,8 @@ public:
 	virtual void synchronize(Serializer &s);
 };
 
+typedef void (*StripProc)();
+
 class StripManager : public Action {
 private:
 	void reset();
@@ -208,6 +213,8 @@ public:
 	int _field2E8;
 	Common::Array<Obj44> _obj44List;
 	Common::Array<byte> _script;
+	StripProc _onBegin;
+	StripProc _onEnd;
 public:
 	StripManager();
 	virtual ~StripManager();
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 21d5390..7dff8c0 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -106,6 +106,19 @@ int InvObjectList::indexOf(InvObject *obj) const {
 	return -1;
 }
 
+InvObject *InvObjectList::getItem(int objectNum) {
+	SynchronizedList<InvObject *>::const_iterator i = _itemList.begin();
+	while (objectNum-- > 0)
+		++i;
+
+	return *i;
+}
+
+int InvObjectList::getObjectScene(int objectNum) {
+	InvObject *obj = getItem(objectNum);
+	return obj->_sceneNumber;
+}
+
 /*--------------------------------------------------------------------------*/
 
 void EventHandler::dispatch() {
@@ -3781,7 +3794,7 @@ void SceneHandler::process(Event &event) {
 
 			if (i != _globals->_sceneItems.end()) {
 				// Pass the action to the item
-				(*i)->startAction(_globals->_events.getCursor());
+				(*i)->startAction(_globals->_events.getCursor(), event);
 				event.handled = _globals->_events.getCursor() != CURSOR_WALK;
 
 				if (_globals->_player._uiEnabled && _globals->_player._canWalk &&
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 5496087..0ea9936 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -79,6 +79,8 @@ public:
 
 	InvObjectList();
 	int indexOf(InvObject *obj) const;
+	InvObject *getItem(int objectNum);
+	int getObjectScene(int objectNum);
 
 	virtual Common::String getClassName() { return "InvObjectList"; }
 	virtual void synchronize(Serializer &s);
@@ -413,7 +415,7 @@ public:
 	virtual Common::String getClassName() { return "SceneItem"; }
 	virtual void remove();
 	virtual void destroy() {}
-	virtual void startAction(CursorType action) { doAction(action); }
+	virtual void startAction(CursorType action, Event &event) { doAction(action); }
 	virtual void doAction(int action);
 
 	bool contains(const Common::Point &pt);
@@ -820,6 +822,7 @@ public:
 		assert((idx >= 1) && (idx <= (int)_regionList.size()));
 		return _regionList[idx - 1];
 	}
+	void proc1(int v) { warning("TODO: WalkRegions::proc1"); }
 };
 
 /*--------------------------------------------------------------------------*/
diff --git a/engines/tsage/events.h b/engines/tsage/events.h
index ee77c6f..3680250 100644
--- a/engines/tsage/events.h
+++ b/engines/tsage/events.h
@@ -68,7 +68,7 @@ enum CursorType {
 	INV_NONE = 0, INV_COLT45 = 1, INV_AMMO_CLIP = 2, INV_SPARE_CLIP = 3, INV_HANDCUFFS = 4, 
 	INV_GREENS_GUN = 5,	INV_TICKET_BOOK = 6, INV_MIRANDA_CARD = 7, INV_FOREST_RAP = 8, 
 	INV_GREEN_ID = 9, INV_BASEBALL_CARD = 10, INV_BOOKING_GREEN = 11, INV_FLARE = 12, 
-	INV_COBB_RAPP = 13, INV_22_BULLET = 14, INV_AUTO_RIFLE = 15, INV_WIG = 16, INV_FRANKIE_ID = 17,
+	INV_COBB_RAP = 13, INV_22_BULLET = 14, INV_AUTO_RIFLE = 15, INV_WIG = 16, INV_FRANKIE_ID = 17,
 	INV_TYRONE_ID = 18, INV_22_SNUB = 19, INV_BOOKING_FRANKIE = 21, INV_BOOKING_GANG = 22,
 	INV_FBI_TELETYPE = 23, INV_DA_NOTE = 24, INV_PRINT_OUT = 25, INV_WHAREHOUSE_KEYS = 26,
 	INV_CENTER_PUNCH = 27, INV_TRANQ_GUN = 28, INV_HOOK = 29, INV_RAGS = 30, INV_JAR = 31,
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index c1b4285..050ad49 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -214,6 +214,7 @@ void BlueForceGlobals::reset() {
 	_v4CEA8 = 0;
 	_v4CF9E = 0;
 	_v4E238 = 0;
+	_v50696 = 0;
 	_v501FC = 0;
 	_v51C42 = 0;
 	_clip1Bullets = 8;
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index 3148225..9938802 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -173,6 +173,7 @@ public:
 	int _driveToScene;
 	int _v4CF9E;
 	int _v4E238;
+	int _v50696;
 	int _v501FC;
 	int _v51C42;
 	int _v51C44;
@@ -180,6 +181,7 @@ public:
 	Bookmark _bookmark;
 	int _mapLocationId;
 	int _clip1Bullets, _clip2Bullets;
+	StripProxy _stripProxy;
 
 	BlueForceGlobals();
 	void reset();
diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk
index ef71533..cd42b5b 100644
--- a/engines/tsage/module.mk
+++ b/engines/tsage/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS := \
 	blue_force/blueforce_scenes0.o \
 	blue_force/blueforce_scenes1.o \
 	blue_force/blueforce_scenes3.o \
+	blue_force/blueforce_speakers.o \
 	blue_force/blueforce_ui.o \
 	converse.o \
 	core.o \
@@ -27,6 +28,7 @@ MODULE_OBJS := \
 	ringworld/ringworld_scenes6.o \
 	ringworld/ringworld_scenes8.o \
 	ringworld/ringworld_scenes10.o \
+	ringworld/ringworld_speakers.o \
 	saveload.o \
 	scenes.o \
 	sound.o \


Commit: 6ef18187de22de775c5e440e57ca62648be865b2
    https://github.com/scummvm/scummvm/commit/6ef18187de22de775c5e440e57ca62648be865b2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-09-08T03:42:14-07:00

Commit Message:
TSAGE: Implemented Scene 315 (Inside Police Station)

Changed paths:
    engines/tsage/blue_force/blueforce_scenes3.cpp
    engines/tsage/blue_force/blueforce_scenes3.h



diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp
index d9d7590..f52b3b5 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.cpp
+++ b/engines/tsage/blue_force/blueforce_scenes3.cpp
@@ -36,18 +36,18 @@ namespace BlueForce {
  *
  *--------------------------------------------------------------------------*/
 
-void Scene300::Object::startAction(CursorType action) {
+void Scene300::Object::startAction(CursorType action, Event &event) {
 	if (action == CURSOR_TALK) {
 		Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
 		scene->_stripManager.start(_stripNumber, scene);
 	} else {
-		NamedObject::startAction(action);
+		NamedObject::startAction(action, event);
 	}
 }
 
-void Scene300::Object17::startAction(CursorType action) {
+void Scene300::Object17::startAction(CursorType action, Event &event) {
 	if ((action != CURSOR_USE) || !BF_GLOBALS.getFlag(3)) {
-		NamedObject::startAction(action);
+		NamedObject::startAction(action, event);
 	} else if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark >= bEndDayOne)) {
 		Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
 		setAction(&scene->_action4);
@@ -56,7 +56,7 @@ void Scene300::Object17::startAction(CursorType action) {
 	}
 }
 
-void Scene300::Item1::startAction(CursorType action) {
+void Scene300::Item1::startAction(CursorType action, Event &event) {
 	if (action == CURSOR_USE) {
 		Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
 		BF_GLOBALS._player.disableControl();
@@ -64,24 +64,24 @@ void Scene300::Item1::startAction(CursorType action) {
 		scene->setAction(&scene->_sequenceManager1, scene, 305, &BF_GLOBALS._player,
 			&scene->_object8, NULL);
 	} else {
-		NamedHotspot::startAction(action);
+		NamedHotspot::startAction(action, event);
 	}
 }
 
-void Scene300::Item2::startAction(CursorType action) {
+void Scene300::Item2::startAction(CursorType action, Event &event) {
 	if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) {
 		Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene;
 		scene->setAction(&scene->_sequenceManager1, scene, 304, &scene->_object11, NULL);
 	} else {
-		NamedHotspot::startAction(action);
+		NamedHotspot::startAction(action, event);
 	}
 }
 
-void Scene300::Item14::startAction(CursorType action) {
+void Scene300::Item14::startAction(CursorType action, Event &event) {
 	ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 151, 54);
 }
 
-void Scene300::Item15::startAction(CursorType action) {
+void Scene300::Item15::startAction(CursorType action, Event &event) {
 	ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 316, 90);
 }
 
@@ -621,6 +621,724 @@ void Scene300::setup() {
 	_field2762 = 1;
 }
 
+/*--------------------------------------------------------------------------
+ * Scene 315 - Inside Police Station
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene315::Item1::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+	scene->_currentCursor = action;
+
+	switch (action) {
+	case CURSOR_USE:
+		if (scene->_field1B60 || scene->_field1B64)
+			SceneItem::display2(320, 51);
+		else
+			NamedHotspot::startAction(action, event);
+		break;
+	case CURSOR_TALK:
+		if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._sceneManager._previousScene == 325))
+			NamedHotspot::startAction(action, event);
+		else {
+			if (!BF_GLOBALS.getFlag(onDuty))
+				scene->_stripNumber = 3172;
+			else if (BF_GLOBALS.getFlag(fTalkedToBarry))
+				scene->_stripNumber = 3166;
+			else if (BF_GLOBALS.getFlag(fTalkedToLarry))
+				scene->_stripNumber = 3164;
+			else
+				scene->_stripNumber = 3165;
+
+			scene->setAction(&scene->_action1);
+			BF_GLOBALS.setFlag(fTalkedToBarry);
+		}
+		break;
+	case INV_GREENS_GUN:
+	case INV_GREENS_KNIFE:
+		BF_GLOBALS._player.disableControl();
+		if (BF_INVENTORY._bookingGreen._sceneNumber != 390) {
+			scene->_stripNumber = 3174;
+			scene->setAction(&scene->_action1);
+		} else {
+			++scene->_field1B62;
+			scene->_stripNumber = (action == INV_GREENS_GUN) ? 3168 : 0;
+			scene->_sceneMode = 3152;
+			scene->setAction(&scene->_sequenceManager, scene, 3153, 1888, NULL);
+		} 
+	case INV_FOREST_RAP:
+		BF_GLOBALS._player.disableControl();
+		scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3178 : 3173;
+		scene->setAction(&scene->_action1);
+		break;
+	case INV_GREEN_ID:
+	case INV_FRANKIE_ID:
+	case INV_TYRONE_ID:
+		BF_GLOBALS._player.disableControl();
+		scene->_stripNumber = 3175;
+		scene->setAction(&scene->_action1);
+		break;
+	case INV_BOOKING_GREEN:
+	case INV_BOOKING_FRANKIE:
+	case INV_BOOKING_GANG:
+		BF_GLOBALS._player.disableControl();
+		scene->_stripNumber = 3167;
+		scene->setAction(&scene->_action1);
+		break;
+	case INV_COBB_RAP:
+		if (BF_INVENTORY._mugshot._sceneNumber == 1)
+			NamedHotspot::startAction(action, event);
+		else {
+			BF_GLOBALS._player.disableControl();
+			scene->_sceneMode = 3169;
+			if (BF_GLOBALS._dayNumber > 2)
+				scene->_stripNumber = 3176;
+			else if (BF_GLOBALS.getFlag(onDuty))
+				scene->_stripNumber = 3177;
+			else
+				scene->_stripNumber = 3170;
+			scene->setAction(&scene->_action1);
+		}
+		break;
+	case INV_22_BULLET:
+	case INV_AUTO_RIFLE:
+	case INV_WIG:
+	case INV_22_SNUB:
+		BF_GLOBALS._player.disableControl();
+		if ((BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingFrankie._sceneNumber == 0)) ||
+				(!BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingGang._sceneNumber == 0))) {
+			scene->_stripNumber = 3174;
+			scene->setAction(&scene->_action1);
+		} else {
+			if (!scene->_field1B6C & (scene->_field1B66 == 1)) {
+				scene->_field1B6C = 1;
+				scene->_stripNumber = 3169;
+			} else {
+				scene->_stripNumber = 0;
+			}
+
+			scene->_sceneMode = 3153;
+			scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL);
+		}
+		break;
+	default:
+		NamedHotspot::startAction(action, event);
+		break;
+	}
+}
+
+void Scene315::Item2::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case INV_GREENS_GUN:
+	case INV_22_BULLET:
+	case INV_AUTO_RIFLE:
+	case INV_WIG:
+	case INV_22_SNUB:
+		SceneItem::display2(315, 30);
+		break;
+	case INV_GREEN_ID:
+	case INV_FRANKIE_ID:
+	case INV_TYRONE_ID:
+		BF_GLOBALS._player.disableControl();
+		scene->_stripNumber = 3175;
+		scene->setAction(&scene->_action1);
+		break;
+	case INV_BOOKING_GREEN:
+	case INV_BOOKING_FRANKIE:
+	case INV_BOOKING_GANG:
+		if (action == INV_BOOKING_GREEN)
+			++scene->_field1B62;
+		else
+			++scene->_field1B66;
+
+		BF_GLOBALS._player.disableControl();
+		scene->_sceneMode = 12;
+		scene->setAction(&scene->_sequenceManager, scene, 3154, &BF_GLOBALS._player, NULL);
+		break;
+	default:
+		NamedHotspot::startAction(action, event);
+		break;
+	}
+}
+
+void Scene315::Item4::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		BF_GLOBALS._player.disableControl();
+		BF_GLOBALS._player.addMover(NULL);
+		scene->_object9.postInit();
+		scene->_object9.hide();
+		scene->_sceneMode = 3167;
+		scene->setAction(&scene->_sequenceManager, scene, 3167, &scene->_object9, this, NULL);
+	} else {
+		NamedHotspot::startAction(action, event);
+	}
+}
+
+void Scene315::Item5::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	if (action == CURSOR_LOOK) {
+		BF_GLOBALS._player.addMover(NULL);
+		scene->_stripManager.start(3154, &BF_GLOBALS._stripProxy);
+	} else {
+		NamedHotspot::startAction(action, event);
+	}
+}
+
+void Scene315::Item14::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	if ((action == INV_COLT45) && BF_GLOBALS.getFlag(onDuty)) {
+		if (!BF_GLOBALS.getFlag(onDuty))
+			SceneItem::display2(315, 27);
+		else if (BF_GLOBALS.getHasBullets()) {
+			BF_GLOBALS._player.disableControl();
+			scene->_sceneMode = 3162;
+			scene->setAction(&scene->_sequenceManager, scene, 3162, &BF_GLOBALS._player, NULL);
+		} else if (BF_GLOBALS.getFlag(fGunLoaded))
+			SceneItem::display2(315, 46);
+		else {
+			BF_GLOBALS._player.disableControl();
+			scene->_sceneMode = 3159;
+			scene->setAction(&scene->_sequenceManager, scene, 3159, &BF_GLOBALS._player, NULL);
+		}
+	} else {
+		NamedHotspot::startAction(action, event);
+	}
+}
+
+void Scene315::Item15::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	if (action != CURSOR_USE)
+		NamedHotspot::startAction(action, event);
+	else if (BF_INVENTORY._forestRap._sceneNumber == 1)
+		SceneItem::display2(315, 37);
+	else {
+		BF_GLOBALS._player.disableControl();
+		scene->_sceneMode = 3158;
+		scene->setAction(&scene->_sequenceManager, scene, 3158, &BF_GLOBALS._player, NULL);
+	}
+}
+
+void Scene315::Item16::startAction(CursorType action, Event &event) {
+	ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 190, 75);
+}
+
+void Scene315::Item17::startAction(CursorType action, Event &event) {
+	ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, event.mousePos.x, event.mousePos.y);
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene315::Object1::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_LOOK:
+		scene->_stripManager.start(3157, &BF_GLOBALS._stripProxy);
+		break;
+	case CURSOR_USE:
+		if (!BF_GLOBALS.getFlag(fGotPointsForCleaningGun)) {
+			BF_GLOBALS._uiElements.addScore(10);
+			BF_GLOBALS.setFlag(fGotPointsForCleaningGun);
+		}
+		BF_GLOBALS._player.addMover(NULL);
+		scene->_stripManager.start(3159, &BF_GLOBALS._stripProxy);
+		break;
+	default:
+		NamedObject::startAction(action, event);
+		break;
+	}
+}
+
+void Scene315::Object2::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_LOOK:
+		BF_GLOBALS._player.disableControl();
+		scene->_object9.postInit();
+		scene->_object9.hide();
+		scene->_sceneMode = 3157;
+		scene->setAction(&scene->_sequenceManager, scene, 3157, &BF_GLOBALS._player, &scene->_object9, NULL);
+		break;
+	case CURSOR_USE:
+		BF_GLOBALS._player.disableControl();
+		scene->_sceneMode = 3156;
+		scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(onDuty) ? 3156 : 3168,
+			this, NULL);
+		break;
+	default:
+		NamedObject::startAction(action, event);
+		break;
+	}
+}
+
+void Scene315::Object3::startAction(CursorType action, Event &event) {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	switch (action) {
+	case CURSOR_LOOK:
+		BF_GLOBALS._player.addMover(NULL);
+		scene->_stripManager.start(3156, &BF_GLOBALS._stripProxy);
+		break;
+	case CURSOR_USE:
+		if (!BF_GLOBALS.getFlag(fGotPointsForMemo)) {
+			BF_GLOBALS._uiElements.addScore(30);
+			BF_GLOBALS.setFlag(fGotPointsForMemo);
+		}
+
+		BF_GLOBALS._player.addMover(NULL);
+		scene->_stripManager.start(3158, &BF_GLOBALS._stripProxy);
+		break;
+	default:
+		NamedObject::startAction(action, event);
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene315::Action1::signal() {
+	Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene;
+
+	switch (_actionIndex++) {
+	case 0:
+		BF_GLOBALS._player.disableControl();
+		ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 128, 128);
+		break;
+	case 1:
+		BF_GLOBALS._player.changeAngle(315);
+		setDelay(2);
+		break;
+	case 2:
+		scene->_stripManager.start(scene->_stripNumber, this);
+		break;
+	case 3:
+		if (scene->_sceneMode == 3169) {
+			BF_GLOBALS._uiElements.addScore(30);
+			BF_INVENTORY._mugshot._sceneNumber = 1;
+		}
+
+		remove();
+		BF_GLOBALS._player.enableControl();
+		break;
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene315::Scene315() {
+	BF_GLOBALS._v51C44 = 1;
+	_field1B6C = _field139C = 0;
+	if (BF_GLOBALS._dayNumber == 0)
+		BF_GLOBALS._dayNumber = 1;
+
+	BF_GLOBALS.clearFlag(fCanDrawGun);
+	_field1B68 = true;
+	_field1B6A = false;
+	_field1B60 = _field1B62 = 0;
+	_field1B64 = _field1B66 = 0;
+}
+
+void Scene315::synchronize(Serializer &s) {
+	s.syncAsSint16LE(_field1390);
+	s.syncAsSint16LE(_stripNumber);
+	s.syncAsSint16LE(_field1398);
+	s.syncAsSint16LE(_field1B60);
+	s.syncAsSint16LE(_field1B62);
+	s.syncAsSint16LE(_field1B64);
+	s.syncAsSint16LE(_field1B66);
+	s.syncAsSint16LE(_field1B6C);
+	s.syncAsSint16LE(_field139C);
+	s.syncAsByte(_field1B68);
+	s.syncAsByte(_field1B6A);
+	s.syncAsSint16LE(_currentCursor);
+}
+
+void Scene315::postInit(SceneObjectList *OwnerList) {
+	loadScene(315);
+	
+	if (BF_GLOBALS._sceneManager._previousScene != 325)
+		BF_GLOBALS._sound1.fadeSound(11);
+
+	setZoomPercents(67, 72, 124, 100);
+
+	_stripManager.addSpeaker(&_gameTextSpeaker);
+	_stripManager.addSpeaker(&_sutterSpeaker);
+	_stripManager.addSpeaker(&_harrisonSpeaker);
+	_stripManager.addSpeaker(&_jakeJacketSpeaker);
+	_stripManager.addSpeaker(&_jakeUniformSpeaker);
+	_stripManager.addSpeaker(&_jailerSpeaker);
+
+	_object8.postInit();
+	_object8.setVisage(315);
+	_object8.setPosition(Common::Point(272, 69));
+
+	if (BF_GLOBALS._bookmark >= bLauraToParamedics) {
+		_object3.postInit();
+		_object3.setVisage(315);
+		_object3.setPosition(Common::Point(167, 53));
+		_object3.setStrip(4);
+		_object3.setFrame(4);
+		_object3.fixPriority(82);
+		_object3.setup(315, -1, -1, -1, 1, NULL);
+	}
+
+	if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark >= bLauraToParamedics)) {
+		_object1.postInit();
+		_object1.setVisage(315);
+		_object1.setPosition(Common::Point(156, 51));
+		_object1.setStrip(4);
+		_object1.setFrame(2);
+		_object1.fixPriority(82);
+		_object1.setup(315, -1, -1, -1, 1, NULL);
+	} else if ((BF_INVENTORY._daNote._sceneNumber != 1) && (BF_GLOBALS._dayNumber < 3)) {
+		_object2.postInit();
+		_object2.setVisage(315);
+		_object2.setStrip(3);
+		_object2.setFrame(2);
+		_object2.setPosition(Common::Point(304, 31));
+		_object2.fixPriority(70);
+		_object2.setup(315, 3, 4, -1, 1, NULL);
+	}
+
+	_item2.setup(12, 315, 35, -1, 36, 1);
+	_item5.setup(3, 315, -1, -1, -1, 1);
+	_item1.setup(4, 315, 10, 11, 12, 1);
+	_item3.setup(2, 315, 0, 1, 2, 1);
+	_item4.setup(Rect(190, 17, 208, 30), 315, -1, -1, -1, 1, NULL);
+	_item16.setup(Rect(184, 31, 211, 80), 315, -1, -1, -1, 1, NULL);
+	_item17.setup(Rect(0, 157, 190, 167), 315, -1, -1, -1, 1, NULL);
+	
+	if (!BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._bookmark == bNone) || (BF_GLOBALS._bookmark == bLyleStoppedBy))) {
+		_field1398 = 1;
+		BF_GLOBALS.setFlag(onDuty);
+	} else {
+		_field1398 = 0;
+	}
+	
+	BF_GLOBALS._player.postInit();
+	BF_GLOBALS._player.changeZoom(-1);
+	BF_GLOBALS._player.disableControl();
+
+	if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._sceneManager._previousScene != 325)) {
+		_object4.postInit();
+		_object4.setVisage(316);
+		_object4.setPosition(Common::Point(99, 82));
+		_object4.fixPriority(95);
+
+		_object5.postInit();
+		_object5.setVisage(395);
+		_object5.setStrip(2);
+		_object5.setPosition(Common::Point(96, 86));
+	}
+
+	// Set up evidence objects in inventory
+	if (BF_INVENTORY._bookingGreen.inInventory())
+		++_field1B60;
+	if (BF_INVENTORY._greensGun.inInventory())
+		++_field1B60;
+	if (BF_INVENTORY._greensKnife.inInventory())
+		++_field1B60;
+
+	if (BF_INVENTORY._bullet22.inInventory())
+		++_field1B64;
+	if (BF_INVENTORY._autoRifle.inInventory())
+		++_field1B64;
+	if (BF_INVENTORY._wig.inInventory())
+		++_field1B64;
+	if (BF_INVENTORY._bookingFrankie.inInventory())
+		++_field1B64;
+	if (BF_INVENTORY._bookingGang.inInventory())
+		++_field1B64;
+	if (BF_INVENTORY._snub22.inInventory())
+		++_field1B64;
+
+	switch (BF_GLOBALS._sceneManager._previousScene) {
+	case 190:
+		if (_field1398)
+			_field1B6A = true;
+		_sceneMode = BF_GLOBALS.getFlag(onDuty) ? 3150 : 3165;
+		setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
+		break;
+	case 325:
+		BF_GLOBALS._uiElements._active = false;
+		_object6.postInit();
+		_object7.postInit();
+		_object8.setFrame(8);
+		_sceneMode = (BF_GLOBALS._dayNumber == 1) ? 3152 : 3155;
+		setAction(&_sequenceManager, this, _sceneMode, &_object6, &_object7, &_object8, NULL);
+		break;
+	case 300:
+	default:
+		if (_field1398)
+			_field1B6A = true;
+		if (!BF_GLOBALS.getFlag(onDuty))
+			_sceneMode = 3166;
+		else if (!_field1398)
+			_sceneMode = 3164;
+		else
+			_sceneMode = 3163;
+
+		setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL);
+		break;
+	}
+
+	if (_field1B6A) {
+		_object8.setFrame(8);
+	} else {
+		BF_GLOBALS._walkRegions.proc1(4);
+	}
+
+	_item15.setup(24, 315, 38, 39, 40, 1);
+	_item14.setup(14, 315, 24, 25, 26, 1);
+	_item7.setup(5, 315, 8, 9, -1, 1);
+	_item6.setup(6, 315, 5, 6, 7, 1);
+	_item10.setup(8, 315, 13, -1, -1, 1);
+	_item11.setup(9, 315, 14, -1, -1, 1);
+	_item8.setup(7, 315, 15, 16, 17, 1);
+	_item9.setup(10, 315, 18, 19, 20, 1);
+}
+
+void Scene315::signal() {
+	int ctr = 0;
+
+	switch (_sceneMode) {
+	case 0:
+		BF_GLOBALS._player.enableControl();
+		break;
+	case 10:
+		if (_field1B62) {
+			if (_field1B62 >= _field1B60)
+				BF_GLOBALS.setFlag(fLeftTraceIn910);
+			else
+				++ctr;
+		}
+
+		if (_field1B66) {
+			if (_field1B66 < _field1B64)
+				++ctr;
+			else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence)
+				BF_GLOBALS._bookmark = bBookedFrankieEvidence;
+		}
+
+		if (ctr) {
+			BF_GLOBALS._v4CEA8 = 20;
+			BF_GLOBALS._sceneManager.changeScene(666);
+		} else {
+			BF_GLOBALS._sceneManager.changeScene(300);
+		}
+		BF_GLOBALS._sound1.fadeOut2(NULL);
+		break;
+	case 11:
+		if (_field1B62) {
+			if (_field1B62 >= _field1B60)
+				BF_GLOBALS.setFlag(fLeftTraceIn910);
+			else
+				++ctr;
+		}
+
+		if (_field1B66) {
+			if (_field1B66 < _field1B64)
+				++ctr;
+			else if (BF_GLOBALS._bookmark < bBookedFrankie)
+				BF_GLOBALS._bookmark = bBookedFrankie;
+			else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence)
+				BF_GLOBALS._bookmark = bBookedFrankie;
+		}
+
+		if (ctr == 1) {
+			BF_GLOBALS._v4CEA8 = 20;
+			BF_GLOBALS._sound1.fadeOut2(NULL);
+		} else if ((BF_GLOBALS._bookmark != bBookedFrankie) || !BF_GLOBALS.getFlag(onDuty)) {
+			BF_GLOBALS._sound1.fadeOut2(NULL);
+			BF_GLOBALS._sceneManager.changeScene(190);
+		} else {
+			BF_GLOBALS._bookmark = bBookedFrankieEvidence;
+			_field139C = 0;
+			BF_GLOBALS.clearFlag(onDuty);
+			BF_INVENTORY._ticketBook._sceneNumber = 60;
+			BF_INVENTORY._mirandaCard._sceneNumber = 60;
+			_sceneMode = 3165;
+			setAction(&_sequenceManager, this, 3165, &BF_GLOBALS._player, NULL);
+		}
+		break;
+	case 12:
+		BF_GLOBALS._uiElements.addScore(30);
+		BF_INVENTORY.setObjectScene((int)_currentCursor, 315);
+
+		if (!_field1B64 || (_field1B66 != _field1B64))
+			BF_GLOBALS._player.enableControl();
+		else {
+			_field139C = 1;
+			_stripNumber = 3171;
+			setAction(&_action1);
+		}
+		break;
+	case 3150:
+	case 3164:
+	case 3165:
+	case 3166:
+		BF_GLOBALS._player.enableControl();
+		_field1B68 = false;
+		break;
+	case 3151:
+		BF_GLOBALS._sceneManager.changeScene(325);
+		break;
+	case 3152:
+		BF_GLOBALS._walkRegions.proc1(4);
+		_object7.remove();
+		_object6.remove();
+
+		BF_GLOBALS._player.enableControl();
+		_field1B68 = false;
+		BF_GLOBALS._walkRegions.proc1(4);
+		BF_GLOBALS._uiElements._active = true;
+		BF_GLOBALS._uiElements.show();
+		break;
+	case 3153:
+		BF_GLOBALS._uiElements.addScore(30);
+		BF_INVENTORY.setObjectScene((int)_currentCursor, 315);
+		
+		if (_stripNumber != 0)
+			setAction(&_action1);
+		else if (!_field1B64 || (_field1B66 != _field1B64))
+			BF_GLOBALS._player.enableControl();
+		else {
+			_stripNumber = 3171;
+			setAction(&_action1);
+			_field139C = 1;
+		}
+		break;
+	case 3155:
+		BF_GLOBALS._player.enableControl();
+		_field1B68 = false;
+		BF_GLOBALS._walkRegions.proc1(4);
+		BF_GLOBALS._uiElements._active = true;
+		BF_GLOBALS._uiElements.show();
+		break;
+	case 3156:
+		BF_GLOBALS._uiElements.addScore(10);
+		BF_INVENTORY._daNote._sceneNumber = 1;
+		_object2.remove();
+		BF_GLOBALS._player.enableControl();
+		break;
+	case 3157:
+		BF_GLOBALS._player.enableControl();
+		_object9.remove();
+		break;
+	case 3158:
+		BF_GLOBALS._player.enableControl();
+		BF_GLOBALS._uiElements.addScore(10);
+		BF_INVENTORY._forestRap._sceneNumber = 1;
+		break;
+	case 3159:
+		if (!BF_GLOBALS.getFlag(fBookedGreenEvidence)) {
+			BF_GLOBALS._uiElements.addScore(30);
+			BF_GLOBALS.setFlag(fBookedGreenEvidence);
+		}
+		BF_GLOBALS.setFlag(gunClean);
+		BF_GLOBALS._player.enableControl();
+		break;
+	case 3161:
+		BF_GLOBALS._v4CEA8 = 21;
+		BF_GLOBALS._sound1.fadeOut2(NULL);
+		BF_GLOBALS._sceneManager.changeScene(666);
+		break;
+	case 3162:
+		BF_GLOBALS._player.disableControl();
+		_sceneMode = 3161;
+		setAction(&_sequenceManager, this, 3161, &BF_GLOBALS._player, NULL);
+		BF_GLOBALS.setFlag(fShotSuttersDesk);
+		break;
+	case 3163:
+		_sceneMode = 3150;
+		setAction(&_sequenceManager, this, 3150, &BF_GLOBALS._player, NULL);
+		break;
+	case 3167:
+		BF_GLOBALS._player.enableControl();
+		_object9.remove();
+		break;
+	case 3154:
+	default:
+		break;
+	}
+}
+
+void Scene315::process(Event &event) {
+	SceneExt::process(event);
+
+	if (BF_GLOBALS._player._enabled && !_eventHandler && (event.mousePos.y < (BF_INTERFACE_Y - 1))) {
+		// Check if the cursor is on an exit
+		if (_item17.contains(event.mousePos)) {
+			GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW);
+			BF_GLOBALS._events.setCursor(surface);
+		} else if ((BF_GLOBALS._bookmark != bBookedFrankie) && _item16.contains(event.mousePos)) {
+			GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W);
+			BF_GLOBALS._events.setCursor(surface);
+		} else {
+			// In case an exit cursor was being shown, restore the previously selected cursor
+			CursorType cursorId = BF_GLOBALS._events.getCursor();
+			BF_GLOBALS._events.setCursor(cursorId);
+		}
+	}
+}
+
+void Scene315::dispatch() {
+	SceneExt::dispatch();
+
+	if (_field1B68)
+		return;
+	
+	if (_field1B6A) {
+		if (BF_GLOBALS._player._position.y < 69) {
+			BF_GLOBALS._player.disableControl();
+			_field1B68 = true;
+			_sceneMode = 3151;
+			setAction(&_sequenceManager, this, 3151, &BF_GLOBALS._player, NULL);
+		} else if (BF_GLOBALS._player.getRegionIndex() == 1) {
+			BF_GLOBALS._player.disableControl();
+			_field1B68 = true;
+			SceneItem::display2(315, 28);
+			_sceneMode = 3150;
+			ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30, 
+				BF_GLOBALS._player._position.y + 15);
+		} else if (BF_GLOBALS._player._position.y > 156) {
+			BF_GLOBALS._player.disableControl();
+			_field1B68 = true;
+			SceneItem::display2(315, 28);
+			_sceneMode = 3150;
+			ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30,
+				BF_GLOBALS._player._position.y - 24);
+		}	
+	}  else if (BF_GLOBALS._player.getRegionIndex() == 1) {
+		BF_GLOBALS._player.disableControl();
+		_field1B68 = true;
+		_sceneMode = 11;
+		ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 30,
+			BF_GLOBALS._player._position.y - 5);
+	} else if (BF_GLOBALS._player._position.y > 156) {
+		BF_GLOBALS._player.disableControl();
+		_field1B68 = true;
+
+		if (_field139C) {
+			SceneItem::display2(315, 45);
+			_sceneMode = 3150;
+			ADD_MOVER(BF_GLOBALS._player, 112, 152);
+		} else {
+			_sceneMode = 10;
+			ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 150,
+				BF_GLOBALS._player._position.y + 120);
+		}
+	}
+}
+
 } // End of namespace BlueForce
 
 } // End of namespace TsAGE
diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h
index fba2d04..e0e7d78 100644
--- a/engines/tsage/blue_force/blueforce_scenes3.h
+++ b/engines/tsage/blue_force/blueforce_scenes3.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "tsage/blue_force/blueforce_logic.h"
+#include "tsage/blue_force/blueforce_speakers.h"
 #include "tsage/converse.h"
 #include "tsage/events.h"
 #include "tsage/core.h"
@@ -46,29 +47,29 @@ class Scene300: public SceneExt {
 	public:
 		Object(int stripNumber) { _stripNumber = stripNumber; }
 
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Object17: public NamedObject {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 
 	/* Items */
 	class Item1: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Item2: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Item14: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 	class Item15: public NamedHotspot {
 	public:
-		virtual void startAction(CursorType action);
+		virtual void startAction(CursorType action, Event &event);
 	};
 
 	/* Actions */
@@ -130,6 +131,101 @@ public:
 	virtual void dispatch();
 };
 
+class Scene315: public SceneExt {
+	/* Objects */
+	class Object1: public NamedObject {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Object2: public NamedObject {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Object3: public NamedObject {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+
+	/* Items */
+	class Item1: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item2: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item4: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item5: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item14: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item15: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item16: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+	class Item17: public NamedHotspot {
+	public:
+		virtual void startAction(CursorType action, Event &event);
+	};
+
+	/* Actions */
+	class Action1: public Action {
+	public:
+		virtual void signal();
+	};
+public:
+	SequenceManager _sequenceManager;
+	SpeakerGameText _gameTextSpeaker;
+	SpeakerSutter _sutterSpeaker;
+	SpeakerHarrison _harrisonSpeaker;
+	SpeakerJakeJacket _jakeJacketSpeaker;
+	SpeakerJakeUniform _jakeUniformSpeaker;
+	SpeakerJailer _jailerSpeaker;
+	Item1 _item1;
+	Item2 _item2;
+	NamedHotspot _item3;
+	Item4 _item4;
+	Item5 _item5;
+	Object1 _object1;
+	Object2 _object2;
+	Object3 _object3;
+	SceneObject _object4, _object5, _object6;
+	SceneObject _object7, _object8, _object9;
+	NamedHotspot _item6, _item7, _item8, _item9;
+	NamedHotspot _item10, _item11, _item12, _item13;
+	Item14 _item14;
+	Item15 _item15;
+	Item16 _item16;
+	Item17 _item17;
+	Action1 _action1;
+	int _field1390;
+	int _stripNumber;
+	int _field1398;
+	int _field1B60, _field1B62, _field1B64;
+	int _field1B66, _field1B6C, _field139C;
+	bool _field1B68, _field1B6A;
+	CursorType _currentCursor;
+
+	Scene315();
+	virtual void synchronize(Serializer &s);
+	virtual void postInit(SceneObjectList *OwnerList = NULL);
+	virtual void signal();
+	virtual void process(Event &event);
+	virtual void dispatch();
+};
+
 } // End of namespace BlueForce
 
 } // End of namespace TsAGE






More information about the Scummvm-git-logs mailing list