[Scummvm-cvs-logs] scummvm master -> 211eb00e8725e36b8c802a9b7b9b9812e9c3053e

Strangerke Strangerke at scummvm.org
Fri Dec 30 16:56:57 CET 2011


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

Summary:
211eb00e87 TSAGE: R2R - Cleanup: reorganise speakers, add ancestor classes where speaker declaration is common to several speakers.


Commit: 211eb00e8725e36b8c802a9b7b9b9812e9c3053e
    https://github.com/scummvm/scummvm/commit/211eb00e8725e36b8c802a9b7b9b9812e9c3053e
Author: Strangerke (strangerke at scummvm.org)
Date: 2011-12-30T07:56:18-08:00

Commit Message:
TSAGE: R2R - Cleanup: reorganise speakers, add ancestor classes where speaker declaration is common to several speakers.

Changed paths:
    engines/tsage/ringworld2/ringworld2_scenes2.h
    engines/tsage/ringworld2/ringworld2_scenes3.h
    engines/tsage/ringworld2/ringworld2_speakers.cpp
    engines/tsage/ringworld2/ringworld2_speakers.h



diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h
index d007f7e..281d1da 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.h
@@ -106,8 +106,8 @@ class Scene2350 : public SceneExt {
 	};
 public:
 
-	SpeakerQuinn2350 _quinnSpeaker;
-	SpeakerPharisha2350 _pharishaSpeaker;
+	SpeakerQuinn _quinnSpeaker;
+	SpeakerPharisha _pharishaSpeaker;
 	NamedHotspot _item1;
 	SceneActor _actor1;
 	Actor2 _actor2;
@@ -368,9 +368,9 @@ class Scene2500 : public SceneExt {
 		virtual void changeScene();
 	};
 public:
-	SpeakerQuinn2500 _quinnSpeaker;
-	SpeakerSeeker2500 _seekerSpeaker;
-	SpeakerMiranda2500 _mirandaSpeaker;
+	SpeakerQuinn _quinnSpeaker;
+	SpeakerSeeker _seekerSpeaker;
+	SpeakerMiranda _mirandaSpeaker;
 	SpeakerWebbster2500 _webbsterSpeaker;
 	NamedHotspot _item1;
 	SceneActor _actor1;
@@ -665,6 +665,7 @@ public:
 	virtual void postInit(SceneObjectList *OwnerList = NULL);
 	virtual void signal();
 };
+
 } // End of namespace Ringworld2
 } // End of namespace TsAGE
 
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.h b/engines/tsage/ringworld2/ringworld2_scenes3.h
index 558acf6..812ab80 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes3.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.h
@@ -47,7 +47,7 @@ class Scene3100 : public SceneExt {
 public:
 
 	int _field412;
-	SpeakerGuard3100 _guardSpeaker;
+	SpeakerGuard _guardSpeaker;
 	NamedHotspot _item1;
 	NamedHotspot _item2;
 	SceneActor _actor1;
@@ -241,7 +241,7 @@ class Scene3240 : public SceneExt {
 public:
 	SpeakerTeal3240 _tealSpeaker;
 	SpeakerWebbster3240 _webbsterSpeaker;
-	SpeakerMiranda2500 _mirandaSpeaker;
+	SpeakerMiranda _mirandaSpeaker;
 	SceneActor _actor1;
 	SceneActor _actor2;
 	SequenceManager _sequenceManager;
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp
index b877319..7f5cdc1 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.cpp
+++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp
@@ -191,11 +191,13 @@ void VisualSpeaker::setDelay(int delay) {
 	_frameNumber = R2_GLOBALS._events.getFrameNumber();
 }
 
-/*--------------------------------------------------------------------------*/
+//----------------------------------------------------------------------------
+// Classes related to CAPTAIN
+//----------------------------------------------------------------------------
 
-SpeakerMiranda300::SpeakerMiranda300(): VisualSpeaker() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
+SpeakerCaptain3210::SpeakerCaptain3210() {
+	_speakerName = "Captain";
+	_color1 = 5;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -205,17 +207,12 @@ SpeakerMiranda300::SpeakerMiranda300(): VisualSpeaker() {
 	_numFrames = 0;
 }
 
-void SpeakerMiranda300::proc15() {
+void SpeakerCaptain3210::proc15() {
 	int v = _fieldF6;
+	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_miranda;
-		}
-
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -226,30 +223,20 @@ void SpeakerMiranda300::proc15() {
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else if (v == 100) {
-		_numFrames = 0;
-		((SceneItem *)_action)->_sceneRegionId = 0;
-
-		_object1.setStrip(_object1._strip - 1);
-		_object1.setFrame(_object1.getFrameCount());
-		_object1.animate(ANIM_MODE_6, this);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-
-		if (v == 4) {
-			_object1.setup(304, 5, 1);
-		} else {
-			_object1.setup(305, v * 2 - 1, 1);
-		}
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-/*--------------------------------------------------------------------------*/
+//----------------------------------------------------------------------------
+// Classes related to CARETAKER
+//----------------------------------------------------------------------------
 
-SpeakerSeeker300::SpeakerSeeker300(): VisualSpeaker() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
+SpeakerCaretaker2450::SpeakerCaretaker2450() {
+	_speakerName = "CARETAKER";
+	_color1 = 43;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -259,20 +246,30 @@ SpeakerSeeker300::SpeakerSeeker300(): VisualSpeaker() {
 	_numFrames = 0;
 }
 
-void SpeakerSeeker300::proc15() {
+//----------------------------------------------------------------------------
+// Classes related to GUARD
+//----------------------------------------------------------------------------
+
+SpeakerGuard::SpeakerGuard() {
+	_speakerName = "GUARD";
+	_color1 = 5;
+	_color2 = 0;
+	_fieldF6 = 0;
+	_textWidth = 300;
+	_hideObjects = false;
+	_object2 = NULL;
+	_displayMode = 1;
+	_numFrames = 0;
+}
+
+void SpeakerGuard2800::proc15() {
 	int v = _fieldF6;
+	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_seeker;
-		}
-
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
-		_object1.fixPriority(140);
 		_object1.setPosition(_object2->_position);
 
 		if (_object2->_mover) 
@@ -281,55 +278,21 @@ void SpeakerSeeker300::proc15() {
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else if (v == 100) {
-		_numFrames = 0;
-		((SceneItem *)_action)->_sceneRegionId = 0;
-
-		_object1.setStrip(_object1._strip - 1);
-		_object1.setFrame(_object1.getFrameCount());
-		_object1.animate(ANIM_MODE_6, this);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(306, v * 2 - 1, 1);
+		_object1.setZoom(75);
+		_object1.setup(4060, 3, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-/*--------------------------------------------------------------------------*/
-
-SpeakerSeekerL::SpeakerSeekerL(): VisualSpeaker() {
-	_speakerName = "SEEKERL";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-	_fontNumber = 10;
-}
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerQuinnL::SpeakerQuinnL(): VisualSpeaker() {
-	_speakerName = "QUINNL";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-	_fontNumber = 10;
-}
-
-/*--------------------------------------------------------------------------*/
+//----------------------------------------------------------------------------
+// Classes related to JOCKO
+//----------------------------------------------------------------------------
 
-SpeakerQuinn300::SpeakerQuinn300(): VisualSpeaker() {
-	_speakerName = "QUINN";
-	_color1 = 60;
+SpeakerJocko::SpeakerJocko() {
+	_speakerName = "Jocko";
+	_color1 = 45;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -339,17 +302,12 @@ SpeakerQuinn300::SpeakerQuinn300(): VisualSpeaker() {
 	_numFrames = 0;
 }
 
-void SpeakerQuinn300::proc15() {
+void SpeakerJocko3200::proc15() {
 	int v = _fieldF6;
+	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_quinn;
-		}
-
+		_object2 = &scene->_actor2;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -360,54 +318,20 @@ void SpeakerQuinn300::proc15() {
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else if (v == 100) {
-		_numFrames = 0;
-		((SceneItem *)_action)->_sceneRegionId = 0;
-
-		_object1.setStrip(_object1._strip - 1);
-		_object1.setFrame(_object1.getFrameCount());
-		_object1.animate(ANIM_MODE_6, this);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		
-		switch (_object2->_visage) {
-		case 10:
-			_object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1);
-			break;
-		case 302:
-			_object1.setup(308, (v - 1) % 8 + 1, 1);
-			break;
-		case 308:
-			_object1.setup(308, 5, 1);
-			break;
-		}
-
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-/*--------------------------------------------------------------------------*/
-
-SpeakerTeal300::SpeakerTeal300(): VisualSpeaker() {
-	_speakerName = "TEAL";
-	_color1 = 22;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerTeal300::proc15() {
+void SpeakerJocko3220::proc15() {
 	int v = _fieldF6;
+	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-		_object2 = &scene->_teal;
+		_object2 = &scene->_actor2;
 		_object2->hide();
-
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
 
@@ -419,34 +343,18 @@ void SpeakerTeal300::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(303, 1, 1);
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerSoldier300::SpeakerSoldier300(): VisualSpeaker() {
-	_speakerName = "SOLDIER";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerSoldier300::proc15() {
+void SpeakerJocko3230::proc15() {
 	int v = _fieldF6;
+	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
-		_object2 = &scene->_teal;
+		_object2 = &scene->_actor2;
 		_object2->hide();
-
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
 
@@ -458,28 +366,18 @@ void SpeakerSoldier300::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(303, 3, 1);
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-/*--------------------------------------------------------------------------*/
-
-SpeakerQuinn2350::SpeakerQuinn2350(): VisualSpeaker() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+//----------------------------------------------------------------------------
+// Classes related to MIRANDA 
+//----------------------------------------------------------------------------
 
-SpeakerPharisha2350::SpeakerPharisha2350(): VisualSpeaker() {
-	_speakerName = "PHARISHA";
-	_color1 = 151;
+SpeakerMiranda::SpeakerMiranda(): VisualSpeaker() {
+	_speakerName = "MIRANDA";
+	_color1 = 154;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -489,70 +387,55 @@ SpeakerPharisha2350::SpeakerPharisha2350(): VisualSpeaker() {
 	_numFrames = 0;
 }
 
-/*--------------------------------------------------------------------------*/
-
-SpeakerQuinn2435::SpeakerQuinn2435() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-void SpeakerQuinn2435::proc15() {
+void SpeakerMiranda300::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 1) {
+		if (R2_GLOBALS._player._characterIndex == 3) {
 			_object2 = &R2_GLOBALS._player;
 		} else {
-			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_actor1;
+			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_miranda;
 		}
 
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
 	}
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
+	} else if (v == 100) {
+		_numFrames = 0;
+		((SceneItem *)_action)->_sceneRegionId = 0;
+
+		_object1.setStrip(_object1._strip - 1);
+		_object1.setFrame(_object1.getFrameCount());
+		_object1.animate(ANIM_MODE_6, this);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object2->setStrip(7);
-		_object1.setup(2020, 5, 1);
+
+		if (v == 4) {
+			_object1.setup(304, 5, 1);
+		} else {
+			_object1.setup(305, v * 2 - 1, 1);
+		}
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerSeeker2435::SpeakerSeeker2435() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerSeeker2435::proc15() {
+void SpeakerMiranda3255::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 2) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_actor1;
-		}
-
+		_object2 = &R2_GLOBALS._player;
 		_object2->hide();
 		_object1.postInit();
+		_object1._effect = _object2->_effect;
+		_object1._shade = _object2->_shade;
 		_object1.setPosition(_object2->_position);
 	}
 
@@ -560,572 +443,213 @@ void SpeakerSeeker2435::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object2->setStrip(7);
-		_object1.setup(4099, 1, 1);
+		_object1.setup(3257, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerPharisha2435::SpeakerPharisha2435() {
-	_speakerName = "PHARISHA";
-	_color1 = 151;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerPharisha2435::proc15() {
-	int v = _fieldF6;
-	Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
-
-	if (!_object2) {
-		_object2 = &scene->_actor2;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4098, 5, 1);
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerQuinn2450::SpeakerQuinn2450() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-void SpeakerQuinn2450::proc15() {
-	int v = _fieldF6;
-
-	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 1) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_actor1;
-		}
-
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		if (R2_GLOBALS.getFlag(61))
-			_object1.setup(2020, 3, 1);
-		else
-			_object1.setup(2020, 1, 1);
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerSeeker2450::SpeakerSeeker2450() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerSeeker2450::proc15() {
-	int v = _fieldF6;
-
-	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 2) {
-			_object2 = &R2_GLOBALS._player;
-		} else {
-			Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
-			_object2 = &scene->_actor1;
-		}
-
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4099, 3, 1);
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerCaretaker2450::SpeakerCaretaker2450() {
-	_speakerName = "CARETAKER";
-	_color1 = 43;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-/*--------------------------------------------------------------------------*/
-
-SpeakerQuinn2500::SpeakerQuinn2500() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-SpeakerSeeker2500::SpeakerSeeker2500() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-SpeakerMiranda2500::SpeakerMiranda2500() {
-	// Not in uppercase in the original
-	_speakerName = "Miranda";
-	_color1 = 154;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-SpeakerWebbster2500::SpeakerWebbster2500() {
-	// Not in uppercase in the original
-	_speakerName = "Webbster";
-	_color1 = 27;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-SpeakerQuinn2700::SpeakerQuinn2700() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerQuinn2700::proc15() {
-	int v = _fieldF6;
-
-	if (!_object2) {
-		_object2 = &R2_GLOBALS._player;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		switch (_object2->_visage) {
-		case 19:
-			_object1.setup(4022, 5, 1);
-			break;
-		case 2701:
-			_object1.setup(4022, 1, 1);
-			break;
-		default:
-			break;
-		}
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerNej2700::SpeakerNej2700() {
-	_speakerName = "NEJ";
-	_color1 = 171;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerNej2700::proc15() {
-	int v = _fieldF6;
-	Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
-
-	if (!_object2) {
-		_object2 = &scene->_actor1;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		switch (_object2->_visage) {
-		case 2701:
-			_object1.setup(4022, 3, 1);
-			_object1.setPosition(Common::Point(164, 163));
-			_object2->setPosition(Common::Point(-10, -10));
-			break;
-		case 2705:
-			_object1.setup(4022, 7, 1);
-			_object1.fixPriority(162);
-			break;
-		default:
-			break;
-		}
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerQuinn2750::SpeakerQuinn2750() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerQuinn2750::proc15() {
-	int v = _fieldF6;
-
-	if (!_object2) {
-		_object2 = &R2_GLOBALS._player;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		switch (_object2->_visage) {
-		case 19:
-			_object1.setup(4022, 5, 1);
-			break;
-		case 2752:
-			_object1.setup(2752, 1, 1);
-			break;
-		default:
-			break;
-		}
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerNej2750::SpeakerNej2750() {
-	_speakerName = "NEJ";
-	_color1 = 171;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerNej2750::proc15() {
-	int v = _fieldF6;
-	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
-
-	if (!_object2) {
-		_object2 = &scene->_actor1;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		switch (_object2->_visage) {
-		case 2705:
-			_object1.setup(4022, 7, 1);
-			break;
-		case 2752:
-			_object1.setup(2752, 1, 1);
-			break;
-		default:
-			break;
-		}
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerQuinn2800::SpeakerQuinn2800() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerQuinn2800::proc15() {
-	int v = _fieldF6;
-
-	if (!_object2) {
-		_object2 = &R2_GLOBALS._player;
-		_object2->hide();
-		_object1.postInit();
-		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
-	}
-
-	if (v == 0) {
-		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		switch (_object2->_visage) {
-		case 16:
-			_object1.setZoom(75);
-			_object1.setup(4023, 5, 1);
-			break;
-		case 19:
-			_object1.setup(4023, 1, 1);
-			break;
-		case 3110:
-			_object1.setZoom(75);
-			if (_object2->_strip == 1)
-				_object1.setup(4061	, 1, 1);
-			else
-				_object1.setup(4061	, 3, 1);
-			break;
-		default:
-			break;
-		}
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerNej2800::SpeakerNej2800() {
-	_speakerName = "NEJ";
-	_color1 = 171;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+void SpeakerMiranda3375::proc15() {
+	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
 
-void SpeakerNej2800::proc15() {
 	int v = _fieldF6;
-	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		if (R2_GLOBALS._player._characterIndex == 3) 
+			_object2 = &R2_GLOBALS._player;
+		else
+			_object2 = &scene->_actor2;
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		
+		if (scene->_actor1._position.y != 163)
+			R2_GLOBALS._player.setStrip(8);
+		else
+			R2_GLOBALS._player.setStrip(2);
 
-		if (_object2->_mover) 
+		R2_GLOBALS._player.disableControl();
+
+		if (R2_GLOBALS._player._mover)
+			R2_GLOBALS._player.addMover(NULL);
+
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
+	
 
-	if (v == 0) {
+	switch (v) {
+	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
+		break;
+	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4023, 3, 1);
-		if (_object2->_visage == 2801)
-			_object1.setPosition(Common::Point(R2_GLOBALS._player._position.x - 12, R2_GLOBALS._player._position.y));
+		_object1.setup(4051, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
+		break;
+	default:
+		signal();
+		break;
 	}
 }
 
-SpeakerGuard2800::SpeakerGuard2800() {
-	_speakerName = "GUARD";
-	_color1 = 5;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+void SpeakerMiranda3385::proc15() {
+	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
 
-void SpeakerGuard2800::proc15() {
 	int v = _fieldF6;
-	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		if (R2_GLOBALS._player._characterIndex == 3) 
+			_object2 = &R2_GLOBALS._player;
+		else
+			_object2 = &scene->_actor2;
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		
+		if (R2_GLOBALS._sceneManager._previousScene == 3375)
+			R2_GLOBALS._player.setStrip(4);
+		else
+			R2_GLOBALS._player.setStrip(3);
 
-		if (_object2->_mover) 
+		if (R2_GLOBALS._player._mover)
+			R2_GLOBALS._player.addMover(NULL);
+
+		R2_GLOBALS._player.disableControl(CURSOR_TALK);
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
+	
 
-	if (v == 0) {
+	switch (v) {
+	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
+		break;
+	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setZoom(75);
-		_object1.setup(4060, 3, 1);
+		_object1.setup(4051, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
+		break;
+	default:
+		signal();
+		break;
 	}
 }
 
-SpeakerGuard3100::SpeakerGuard3100() {
-	_speakerName = "GUARD";
-	_color1 = 5;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-SpeakerRocko3200::SpeakerRocko3200() {
-	_speakerName = "Rocko";
-	_color1 = 5;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+void SpeakerMiranda3400::proc15() {
+	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
 
-void SpeakerRocko3200::proc15() {
 	int v = _fieldF6;
-	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		if (R2_GLOBALS._player._characterIndex == 3) 
+			_object2 = &R2_GLOBALS._player;
+		else
+			_object2 = &scene->_actor2;
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover) 
+		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
 
-	if (v == 0) {
+	switch (v) {
+	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
+		break;
+	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
-		_object1.animate(ANIM_MODE_5, this);
+		_object1.setup(4051, 5, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 2:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4050, 3, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	default:
+		signal();
+		break;
 	}
 }
 
-SpeakerJocko3200::SpeakerJocko3200() {
-	_speakerName = "Jocko";
-	_color1 = 45;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+void SpeakerMiranda3700::proc15() {
+	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
 
-void SpeakerJocko3200::proc15() {
 	int v = _fieldF6;
-	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		_object2 = &scene->_actor3;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover) 
+		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
 
-	if (v == 0) {
+	_object1.setPosition(_object2->_position);
+
+	switch (v) {
+	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
+		break;
+	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
-		_object1.animate(ANIM_MODE_5, this);
+		scene->_actor1.setup(10, 6, 1);
+		scene->_actor2.setup(20, 5, 1);
+		_object2->setup(30, 1, 1);
+		scene->_actor4.setup(40, 1, 1);
+		_object1.setup(4050, 5, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 2:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		scene->_actor3.setup(30, 8, 1);
+		_object1.setup(4052, 3, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 3:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		scene->_actor2.setup(20, 1, 1);
+		scene->_actor3.setup(30, 1, 1);
+		_object1.setup(4051, 7, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	default:
+		signal();
+		break;
 	}
 }
 
-SpeakerSocko3200::SpeakerSocko3200() {
-	_speakerName = "Socko";
-	_color1 = 10;
+//----------------------------------------------------------------------------
+// Classes related to NEJ
+//----------------------------------------------------------------------------
+
+SpeakerNej::SpeakerNej() {
+	_speakerName = "NEJ";
+	_color1 = 171;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -1135,12 +659,12 @@ SpeakerSocko3200::SpeakerSocko3200() {
 	_numFrames = 0;
 }
 
-void SpeakerSocko3200::proc15() {
+void SpeakerNej2700::proc15() {
 	int v = _fieldF6;
-	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
+	Scene2700 *scene = (Scene2700 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor3;
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -1153,26 +677,26 @@ void SpeakerSocko3200::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		switch (_object2->_visage) {
+		case 2701:
+			_object1.setup(4022, 3, 1);
+			_object1.setPosition(Common::Point(164, 163));
+			_object2->setPosition(Common::Point(-10, -10));
+			break;
+		case 2705:
+			_object1.setup(4022, 7, 1);
+			_object1.fixPriority(162);
+			break;
+		default:
+			break;
+		}
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerCaptain3210::SpeakerCaptain3210() {
-	_speakerName = "Captain";
-	_color1 = 5;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerCaptain3210::proc15() {
+void SpeakerNej2750::proc15() {
 	int v = _fieldF6;
-	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
+	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
 		_object2 = &scene->_actor1;
@@ -1188,26 +712,23 @@ void SpeakerCaptain3210::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		switch (_object2->_visage) {
+		case 2705:
+			_object1.setup(4022, 7, 1);
+			break;
+		case 2752:
+			_object1.setup(2752, 1, 1);
+			break;
+		default:
+			break;
+		}
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerPrivate3210::SpeakerPrivate3210() {
-	_speakerName = "Private";
-	_color1 = 45;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerPrivate3210::proc15() {
+void SpeakerNej2800::proc15() {
 	int v = _fieldF6;
-	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
+	Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
 		_object2 = &scene->_actor2;
@@ -1223,14 +744,20 @@ void SpeakerPrivate3210::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		_object1.setup(4023, 3, 1);
+		if (_object2->_visage == 2801)
+			_object1.setPosition(Common::Point(R2_GLOBALS._player._position.x - 12, R2_GLOBALS._player._position.y));
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerRocko3220::SpeakerRocko3220() {
-	_speakerName = "Rocko";
-	_color1 = 5;
+//----------------------------------------------------------------------------
+// Classes related to PHARISHA
+//----------------------------------------------------------------------------
+
+SpeakerPharisha::SpeakerPharisha(): VisualSpeaker() {
+	_speakerName = "PHARISHA";
+	_color1 = 151;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -1240,31 +767,32 @@ SpeakerRocko3220::SpeakerRocko3220() {
 	_numFrames = 0;
 }
 
-void SpeakerRocko3220::proc15() {
+void SpeakerPharisha2435::proc15() {
 	int v = _fieldF6;
-	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
+	Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		_object2 = &scene->_actor2;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
 	}
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		_object1.setup(4098, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerJocko3220::SpeakerJocko3220() {
-	_speakerName = "Jocko";
+//----------------------------------------------------------------------------
+// Classes related to PRIVATE
+//----------------------------------------------------------------------------
+
+SpeakerPrivate3210::SpeakerPrivate3210() {
+	_speakerName = "Private";
 	_color1 = 45;
 	_color2 = 0;
 	_fieldF6 = 0;
@@ -1275,9 +803,9 @@ SpeakerJocko3220::SpeakerJocko3220() {
 	_numFrames = 0;
 }
 
-void SpeakerJocko3220::proc15() {
+void SpeakerPrivate3210::proc15() {
 	int v = _fieldF6;
-	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
+	Scene3210 *scene = (Scene3210 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
 		_object2 = &scene->_actor2;
@@ -1298,9 +826,13 @@ void SpeakerJocko3220::proc15() {
 	}
 }
 
-SpeakerRocko3230::SpeakerRocko3230() {
-	_speakerName = "Rocko";
-	_color1 = 5;
+//----------------------------------------------------------------------------
+// Classes related to QUINN
+//----------------------------------------------------------------------------
+
+SpeakerQuinn::SpeakerQuinn(): VisualSpeaker() {
+	_speakerName = "QUINN";
+	_color1 = 60;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -1310,12 +842,17 @@ SpeakerRocko3230::SpeakerRocko3230() {
 	_numFrames = 0;
 }
 
-void SpeakerRocko3230::proc15() {
+void SpeakerQuinn300::proc15() {
 	int v = _fieldF6;
-	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		if (R2_GLOBALS._player._characterIndex == 3) {
+			_object2 = &R2_GLOBALS._player;
+		} else {
+			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_quinn;
+		}
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -1326,101 +863,91 @@ void SpeakerRocko3230::proc15() {
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
+	} else if (v == 100) {
+		_numFrames = 0;
+		((SceneItem *)_action)->_sceneRegionId = 0;
+
+		_object1.setStrip(_object1._strip - 1);
+		_object1.setFrame(_object1.getFrameCount());
+		_object1.animate(ANIM_MODE_6, this);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4111, (_object2->_strip * 2) - 1, 1);
+		
+		switch (_object2->_visage) {
+		case 10:
+			_object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1);
+			break;
+		case 302:
+			_object1.setup(308, (v - 1) % 8 + 1, 1);
+			break;
+		case 308:
+			_object1.setup(308, 5, 1);
+			break;
+		}
+
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerJocko3230::SpeakerJocko3230() {
-	_speakerName = "Jocko";
-	_color1 = 45;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerJocko3230::proc15() {
+void SpeakerQuinn2435::proc15() {
 	int v = _fieldF6;
-	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		if (R2_GLOBALS._player._characterIndex == 1) {
+			_object2 = &R2_GLOBALS._player;
+		} else {
+			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_actor1;
+		}
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
 	}
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		_object2->setStrip(7);
+		_object1.setup(2020, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerTeal3240::SpeakerTeal3240() {
-	_speakerName = "Teal";
-	_color1 = 22;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerTeal3240::proc15() {
+void SpeakerQuinn2450::proc15() {
 	int v = _fieldF6;
-	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		if (R2_GLOBALS._player._characterIndex == 1) {
+			_object2 = &R2_GLOBALS._player;
+		} else {
+			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_actor1;
+		}
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-
-		if (_object2->_mover) 
-			_object2->addMover(NULL);
 	}
 
 	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4070, (_object2->_strip * 2) - 1, 1);
+		if (R2_GLOBALS.getFlag(61))
+			_object1.setup(2020, 3, 1);
+		else
+			_object1.setup(2020, 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerWebbster3240::SpeakerWebbster3240() {
-	_speakerName = "Webbster";
-	_color1 = 10;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerWebbster3240::proc15() {
+void SpeakerQuinn2700::proc15() {
 	int v = _fieldF6;
-	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		_object2 = &R2_GLOBALS._player;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -1433,29 +960,25 @@ void SpeakerWebbster3240::proc15() {
 		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 5, 1);
+		switch (_object2->_visage) {
+		case 19:
+			_object1.setup(4022, 5, 1);
+			break;
+		case 2701:
+			_object1.setup(4022, 1, 1);
+			break;
+		default:
+			break;
+		}
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerRalf3245::SpeakerRalf3245() {
-	_speakerName = "Ralf";
-	_color1 = 5;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerRalf3245::proc15() {
+void SpeakerQuinn2750::proc15() {
 	int v = _fieldF6;
-	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		_object2 = &R2_GLOBALS._player;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -1469,41 +992,24 @@ void SpeakerRalf3245::proc15() {
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
 		switch (_object2->_visage) {
-		case 3100:
-			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
-			break;
-		case 3101:
-			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+		case 19:
+			_object1.setup(4022, 5, 1);
 			break;
-		case 3102:
-			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+		case 2752:
+			_object1.setup(2752, 1, 1);
 			break;
 		default:
 			break;
 		}
-
 		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerTomko3245::SpeakerTomko3245() {
-	_speakerName = "Tomko";
-	_color1 = 10;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerTomko3245::proc15() {
+void SpeakerQuinn2800::proc15() {
 	int v = _fieldF6;
-	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		_object2 = &R2_GLOBALS._player;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -1517,33 +1023,25 @@ void SpeakerTomko3245::proc15() {
 	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
 		switch (_object2->_visage) {
-		case 3100:
-			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
+		case 16:
+			_object1.setZoom(75);
+			_object1.setup(4023, 5, 1);
 			break;
-		case 3101:
-			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+		case 19:
+			_object1.setup(4023, 1, 1);
 			break;
-		case 3102:
-			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+		case 3110:
+			_object1.setZoom(75);
+			if (_object2->_strip == 1)
+				_object1.setup(4061	, 1, 1);
+			else
+				_object1.setup(4061	, 3, 1);
 			break;
 		default:
 			break;
-		}
-
-		_object1.animate(ANIM_MODE_5, this);
-	}
-}
-
-SpeakerQuinn3255::SpeakerQuinn3255() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
+		}
+		_object1.animate(ANIM_MODE_5, this);
+	}
 }
 
 void SpeakerQuinn3255::proc15() {
@@ -1569,53 +1067,59 @@ void SpeakerQuinn3255::proc15() {
 	}
 }
 
-SpeakerMiranda3255::SpeakerMiranda3255() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
+void SpeakerQuinn3375::proc15() {
+	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
 
-void SpeakerMiranda3255::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		_object2 = &R2_GLOBALS._player;
+		if (R2_GLOBALS._player._characterIndex == 1) 
+			_object2 = &R2_GLOBALS._player;
+		else if (R2_GLOBALS._player._characterIndex == 2) 
+			_object2 = &scene->_actor1;
+		else
+			_object2 = &scene->_actor2;
+
 		_object2->hide();
 		_object1.postInit();
-		_object1._effect = _object2->_effect;
-		_object1._shade = _object2->_shade;
 		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		
+		if (scene->_actor1._position.y != 163)
+			R2_GLOBALS._player.setStrip(8);
+		else
+			R2_GLOBALS._player.setStrip(2);
+
+		if (R2_GLOBALS._player._mover)
+			R2_GLOBALS._player.addMover(NULL);
+
+		R2_GLOBALS._player.disableControl(CURSOR_TALK);
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+		if (_object2->_mover)
+			_object2->addMover(NULL);
 	}
+	
 
-	if (v == 0) {
+	switch (v) {
+	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
-	} else {
+		break;
+	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(3257, 5, 1);
+		_object1.setup(4010, 5, 1);
 		_object1.animate(ANIM_MODE_5, this);
+		break;
+	default:
+		signal();
+		break;
 	}
 }
 
-SpeakerQuinn3375::SpeakerQuinn3375() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerQuinn3375::proc15() {
-	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerQuinn3385::proc15() {
+	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
@@ -1634,10 +1138,10 @@ void SpeakerQuinn3375::proc15() {
 		_object1._effect = 1;
 		_object1.changeZoom(-1);
 		
-		if (scene->_actor1._position.y != 163)
-			R2_GLOBALS._player.setStrip(8);
+		if (R2_GLOBALS._sceneManager._previousScene == 3375)
+			R2_GLOBALS._player.setStrip(4);
 		else
-			R2_GLOBALS._player.setStrip(2);
+			R2_GLOBALS._player.setStrip(3);
 
 		if (R2_GLOBALS._player._mover)
 			R2_GLOBALS._player.addMover(NULL);
@@ -1656,7 +1160,11 @@ void SpeakerQuinn3375::proc15() {
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4010, 5, 1);
+		if (R2_GLOBALS._player._characterIndex == 2)
+			_object1.setup(4010, 3, 1);
+		else
+			_object1.setup(4010, 5, 1);
+
 		_object1.animate(ANIM_MODE_5, this);
 		break;
 	default:
@@ -1665,28 +1173,18 @@ void SpeakerQuinn3375::proc15() {
 	}
 }
 
-SpeakerSeeker3375::SpeakerSeeker3375() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerSeeker3375::proc15() {
-	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerQuinn3400::proc15() {
+	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 2) 
+		if (R2_GLOBALS._player._characterIndex == 1) 
 			_object2 = &R2_GLOBALS._player;
-		else
+		else if (R2_GLOBALS._player._characterIndex == 2) 
 			_object2 = &scene->_actor1;
+		else
+			_object2 = &scene->_actor2;
 
 		_object2->hide();
 		_object1.postInit();
@@ -1694,22 +1192,73 @@ void SpeakerSeeker3375::proc15() {
 		_object1._numFrames = 7;
 		_object1._effect = 1;
 		_object1.changeZoom(-1);
-		
-		if (scene->_actor1._position.y != 163)
-			R2_GLOBALS._player.setStrip(8);
-		else
-			R2_GLOBALS._player.setStrip(2);
+		R2_GLOBALS._player.disableControl();
+		if (_object2->_mover)
+			_object2->addMover(NULL);
+	}
 
-		if (R2_GLOBALS._player._mover)
-			R2_GLOBALS._player.addMover(NULL);
+	switch (v) {
+	case 0:
+		_object1.animate(ANIM_MODE_2, NULL);
+		break;
+	case 1:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4010, 5, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 2:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4010, 3, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 3:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4012, 3, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	default:
+		signal();
+		break;
+	}
+}
 
-		R2_GLOBALS._player.disableControl(CURSOR_TALK);
+void SpeakerQuinn3700::setText(const Common::String &msg) {
+	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+	switch (_fieldF6) {
+	case 2:
+		scene->_actor3.setup(30, 1, 1);
+		R2_GLOBALS._sound2.play(44);
+		break;
+	case 3:
+		scene->_actor3.setup(30, 1, 1);
+		break;
+	default:
+		scene->_actor3.setup(30, 7, 1);
+		break;
+	}
+	VisualSpeaker::setText(msg);
+}
+
+void SpeakerQuinn3700::proc15() {
+	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+	int v = _fieldF6;
+
+	if (!_object2) {
+		_object2 = &scene->_actor1;
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		R2_GLOBALS._player.disableControl();
 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
 		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
-	
+
+	_object1.setPosition(_object2->_position);
 
 	switch (v) {
 	case 0:
@@ -1717,8 +1266,25 @@ void SpeakerSeeker3375::proc15() {
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4031, 1, 1);
-		_object1.animate(ANIM_MODE_5, this);
+		R2_GLOBALS._sound2.stop();
+		scene->_actor1.setup(10, 4, 1);
+		scene->_actor3.setup(30, 7, 1);
+		_object1.setup(3701, 1, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 2:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		scene->_actor2.setup(20, 1, 1);
+		scene->_actor3.setup(30, 1, 1);
+		_object1.setup(3701, 2, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 3:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		scene->_actor1.setup(10, 2, 1);
+		scene->_actor3.setup(30, 1, 1);
+		_object1.setup(4011, 1, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	default:
 		signal();
@@ -1726,9 +1292,82 @@ void SpeakerSeeker3375::proc15() {
 	}
 }
 
-SpeakerMiranda3375::SpeakerMiranda3375() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
+//----------------------------------------------------------------------------
+// Classes related to QUINNL
+//----------------------------------------------------------------------------
+
+SpeakerQuinnL::SpeakerQuinnL(): VisualSpeaker() {
+	_speakerName = "QUINNL";
+	_color1 = 35;
+	_color2 = 0;
+	_fieldF6 = 0;
+	_textWidth = 300;
+	_hideObjects = false;
+	_object2 = NULL;
+	_displayMode = 1;
+	_numFrames = 0;
+	_fontNumber = 10;
+}
+
+//----------------------------------------------------------------------------
+// Classes related to RALF
+//----------------------------------------------------------------------------
+
+SpeakerRalf3245::SpeakerRalf3245() {
+	_speakerName = "Ralf";
+	_color1 = 5;
+	_color2 = 0;
+	_fieldF6 = 0;
+	_textWidth = 300;
+	_hideObjects = false;
+	_object2 = NULL;
+	_displayMode = 1;
+	_numFrames = 0;
+}
+
+void SpeakerRalf3245::proc15() {
+	int v = _fieldF6;
+	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
+
+	if (!_object2) {
+		_object2 = &scene->_actor1;
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
+	}
+
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		switch (_object2->_visage) {
+		case 3100:
+			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
+			break;
+		case 3101:
+			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+			break;
+		case 3102:
+			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+			break;
+		default:
+			break;
+		}
+
+		_object1.animate(ANIM_MODE_5, this);
+	}
+}
+
+//----------------------------------------------------------------------------
+// Classes related to ROCKO
+//----------------------------------------------------------------------------
+
+SpeakerRocko::SpeakerRocko() {
+	_speakerName = "Rocko";
+	_color1 = 5;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -1738,116 +1377,82 @@ SpeakerMiranda3375::SpeakerMiranda3375() {
 	_numFrames = 0;
 }
 
-void SpeakerMiranda3375::proc15() {
-	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
+void SpeakerRocko3200::proc15() {
 	int v = _fieldF6;
+	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) 
-			_object2 = &R2_GLOBALS._player;
-		else
-			_object2 = &scene->_actor2;
-
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		
-		if (scene->_actor1._position.y != 163)
-			R2_GLOBALS._player.setStrip(8);
-		else
-			R2_GLOBALS._player.setStrip(2);
 
-		R2_GLOBALS._player.disableControl();
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
+	}
 
-		if (R2_GLOBALS._player._mover)
-			R2_GLOBALS._player.addMover(NULL);
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		_object1.animate(ANIM_MODE_5, this);
+	}
+}
 
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+void SpeakerRocko3220::proc15() {
+	int v = _fieldF6;
+	Scene3220 *scene = (Scene3220 *)R2_GLOBALS._sceneManager._scene;
 
-		if (_object2->_mover)
+	if (!_object2) {
+		_object2 = &scene->_actor1;
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
-	
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4051, 5, 1);
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
-		break;
-	default:
-		signal();
-		break;
 	}
 }
 
-SpeakerWebbster3375::SpeakerWebbster3375() {
-	_speakerName = "WEBBSTER";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerWebbster3375::proc15() {
-	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
-
+void SpeakerRocko3230::proc15() {
 	int v = _fieldF6;
+	Scene3230 *scene = (Scene3230 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor3;
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		
-		if (scene->_actor1._position.y != 163)
-			R2_GLOBALS._player.setStrip(8);
-		else
-			R2_GLOBALS._player.setStrip(2);
-
-		if (R2_GLOBALS._player._mover)
-			R2_GLOBALS._player.addMover(NULL);
-
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover)
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
-	
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 5, 1);
+		_object1.setup(4111, (_object2->_strip * 2) - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
-		break;
-	default:
-		signal();
-		break;
 	}
 }
 
-SpeakerQuinn3385::SpeakerQuinn3385() {
-	_speakerName = "QUINN";
-	_color1 = 60;
+//----------------------------------------------------------------------------
+// Classes related to SEEKER
+//----------------------------------------------------------------------------
+
+SpeakerSeeker::SpeakerSeeker(): VisualSpeaker() {
+	_speakerName = "SEEKER";
+	_color1 = 35;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -1856,144 +1461,104 @@ SpeakerQuinn3385::SpeakerQuinn3385() {
 	_displayMode = 1;
 	_numFrames = 0;
 }
-void SpeakerQuinn3385::proc15() {
-	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
 
+void SpeakerSeeker300::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 1) 
+		if (R2_GLOBALS._player._characterIndex == 3) {
 			_object2 = &R2_GLOBALS._player;
-		else if (R2_GLOBALS._player._characterIndex == 2) 
-			_object2 = &scene->_actor1;
-		else
-			_object2 = &scene->_actor2;
+		} else {
+			Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_seeker;
+		}
 
 		_object2->hide();
 		_object1.postInit();
+		_object1.fixPriority(140);
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		
-		if (R2_GLOBALS._sceneManager._previousScene == 3375)
-			R2_GLOBALS._player.setStrip(4);
-		else
-			R2_GLOBALS._player.setStrip(3);
-
-		if (R2_GLOBALS._player._mover)
-			R2_GLOBALS._player.addMover(NULL);
-
-		R2_GLOBALS._player.disableControl(CURSOR_TALK);
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover)
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
-	
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
+	} else if (v == 100) {
+		_numFrames = 0;
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		if (R2_GLOBALS._player._characterIndex == 2)
-			_object1.setup(4010, 3, 1);
-		else
-			_object1.setup(4010, 5, 1);
 
+		_object1.setStrip(_object1._strip - 1);
+		_object1.setFrame(_object1.getFrameCount());
+		_object1.animate(ANIM_MODE_6, this);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(306, v * 2 - 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
-		break;
-	default:
-		signal();
-		break;
 	}
 }
 
-SpeakerSeeker3385::SpeakerSeeker3385() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerSeeker3385::proc15() {
-	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
-
+void SpeakerSeeker2435::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 2) 
+		if (R2_GLOBALS._player._characterIndex == 2) {
 			_object2 = &R2_GLOBALS._player;
-		else
+		} else {
+			Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene;
 			_object2 = &scene->_actor1;
+		}
 
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		
-		if (R2_GLOBALS._sceneManager._previousScene == 3375)
-			R2_GLOBALS._player.setStrip(4);
-		else
-			R2_GLOBALS._player.setStrip(3);
+	}
 
-		if (R2_GLOBALS._player._mover)
-			R2_GLOBALS._player.addMover(NULL);
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object2->setStrip(7);
+		_object1.setup(4099, 1, 1);
+		_object1.animate(ANIM_MODE_5, this);
+	}
+}
 
-		R2_GLOBALS._player.disableControl(CURSOR_TALK);
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+void SpeakerSeeker2450::proc15() {
+	int v = _fieldF6;
 
-		if (_object2->_mover)
-			_object2->addMover(NULL);
+	if (!_object2) {
+		if (R2_GLOBALS._player._characterIndex == 2) {
+			_object2 = &R2_GLOBALS._player;
+		} else {
+			Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene;
+			_object2 = &scene->_actor1;
+		}
+
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
 	}
-	
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4031, 3, 1);
+		_object1.setup(4099, 3, 1);
 		_object1.animate(ANIM_MODE_5, this);
-		break;
-	default:
-		signal();
-		break;
 	}
 }
 
-SpeakerMiranda3385::SpeakerMiranda3385() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerMiranda3385::proc15() {
-	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerSeeker3375::proc15() {
+	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) 
+		if (R2_GLOBALS._player._characterIndex == 2) 
 			_object2 = &R2_GLOBALS._player;
 		else
-			_object2 = &scene->_actor2;
+			_object2 = &scene->_actor1;
 
 		_object2->hide();
 		_object1.postInit();
@@ -2002,10 +1567,10 @@ void SpeakerMiranda3385::proc15() {
 		_object1._effect = 1;
 		_object1.changeZoom(-1);
 		
-		if (R2_GLOBALS._sceneManager._previousScene == 3375)
-			R2_GLOBALS._player.setStrip(4);
+		if (scene->_actor1._position.y != 163)
+			R2_GLOBALS._player.setStrip(8);
 		else
-			R2_GLOBALS._player.setStrip(3);
+			R2_GLOBALS._player.setStrip(2);
 
 		if (R2_GLOBALS._player._mover)
 			R2_GLOBALS._player.addMover(NULL);
@@ -2024,7 +1589,7 @@ void SpeakerMiranda3385::proc15() {
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4051, 5, 1);
+		_object1.setup(4031, 1, 1);
 		_object1.animate(ANIM_MODE_5, this);
 		break;
 	default:
@@ -2033,25 +1598,17 @@ void SpeakerMiranda3385::proc15() {
 	}
 }
 
-SpeakerWebbster3385::SpeakerWebbster3385() {
-	_speakerName = "WEBBSTER";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
-void SpeakerWebbster3385::proc15() {
+void SpeakerSeeker3385::proc15() {
 	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		_object2 = &scene->_actor3;
+		if (R2_GLOBALS._player._characterIndex == 2) 
+			_object2 = &R2_GLOBALS._player;
+		else
+			_object2 = &scene->_actor1;
+
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
@@ -2073,6 +1630,7 @@ void SpeakerWebbster3385::proc15() {
 		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
+	
 
 	switch (v) {
 	case 0:
@@ -2080,7 +1638,7 @@ void SpeakerWebbster3385::proc15() {
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 5, 1);
+		_object1.setup(4031, 3, 1);
 		_object1.animate(ANIM_MODE_5, this);
 		break;
 	default:
@@ -2089,29 +1647,16 @@ void SpeakerWebbster3385::proc15() {
 	}
 }
 
-SpeakerQuinn3400::SpeakerQuinn3400() {
-	_speakerName = "QUINN";
-	_color1 = 60;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-void SpeakerQuinn3400::proc15() {
+void SpeakerSeeker3400::proc15() {
 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 1) 
+		if (R2_GLOBALS._player._characterIndex == 2) 
 			_object2 = &R2_GLOBALS._player;
-		else if (R2_GLOBALS._player._characterIndex == 2) 
-			_object2 = &scene->_actor1;
 		else
-			_object2 = &scene->_actor2;
+			_object2 = &scene->_actor1;
 
 		_object2->hide();
 		_object1.postInit();
@@ -2120,6 +1665,8 @@ void SpeakerQuinn3400::proc15() {
 		_object1._effect = 1;
 		_object1.changeZoom(-1);
 		R2_GLOBALS._player.disableControl();
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
 		if (_object2->_mover)
 			_object2->addMover(NULL);
 	}
@@ -2130,17 +1677,27 @@ void SpeakerQuinn3400::proc15() {
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4010, 5, 1);
+		_object1.setup(4031, 1, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	case 2:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4010, 3, 1);
+		_object1.setup(4031, 3, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	case 3:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4012, 3, 1);
+		_object1.setup(4030, 3, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 4:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4031, 7, 1);
+		_object1.animate(ANIM_MODE_5, NULL);
+		break;
+	case 5:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4033, 1, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	default:
@@ -2149,35 +1706,29 @@ void SpeakerQuinn3400::proc15() {
 	}
 }
 
-SpeakerSeeker3400::SpeakerSeeker3400() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
+void SpeakerSeeker3700::setText(const Common::String &msg) {
+	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+
+	if (_fieldF6 == 1) {
+		R2_GLOBALS._sound2.play(44);
+		scene->_actor3.setup(30, 8, 1);
+	} else {
+		scene->_actor3.setup(30, 2, 1);
+	}
+	VisualSpeaker::setText(msg);
 }
 
-void SpeakerSeeker3400::proc15() {
-	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerSeeker3700::proc15() {
+	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 2) 
-			_object2 = &R2_GLOBALS._player;
-		else
-			_object2 = &scene->_actor1;
-
+		_object2 = &scene->_actor2;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
 		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
 		R2_GLOBALS._player.disableControl();
 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
@@ -2185,33 +1736,27 @@ void SpeakerSeeker3400::proc15() {
 			_object2->addMover(NULL);
 	}
 
+	_object1.setPosition(_object2->_position);
+
 	switch (v) {
 	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4031, 1, 1);
+		R2_GLOBALS._sound2.stop();
+		scene->_actor1.setup(10, 8, 1);
+		scene->_actor2.setup(20, 7, 1);
+		scene->_actor3.setup(30, 8, 1);
+		_object1.setup(3701, 3, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	case 2:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4031, 3, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 3:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4030, 3, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 4:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4031, 7, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 5:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4033, 1, 1);
+		scene->_actor1.setup(10, 2, 1);
+		scene->_actor2.setup(20, 1, 1);
+		scene->_actor3.setup(30, 1, 1);
+		_object1.setup(4031, 1, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	default:
@@ -2220,9 +1765,13 @@ void SpeakerSeeker3400::proc15() {
 	}
 }
 
-SpeakerMiranda3400::SpeakerMiranda3400() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
+//----------------------------------------------------------------------------
+// Classes related to SEEKERL
+//----------------------------------------------------------------------------
+
+SpeakerSeekerL::SpeakerSeekerL(): VisualSpeaker() {
+	_speakerName = "SEEKERL";
+	_color1 = 35;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -2230,55 +1779,55 @@ SpeakerMiranda3400::SpeakerMiranda3400() {
 	_object2 = NULL;
 	_displayMode = 1;
 	_numFrames = 0;
+	_fontNumber = 10;
 }
 
-void SpeakerMiranda3400::proc15() {
-	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+//----------------------------------------------------------------------------
+// Classes related to SOCKO
+//----------------------------------------------------------------------------
+
+SpeakerSocko3200::SpeakerSocko3200() {
+	_speakerName = "Socko";
+	_color1 = 10;
+	_color2 = 0;
+	_fieldF6 = 0;
+	_textWidth = 300;
+	_hideObjects = false;
+	_object2 = NULL;
+	_displayMode = 1;
+	_numFrames = 0;
+}
 
+void SpeakerSocko3200::proc15() {
 	int v = _fieldF6;
+	Scene3200 *scene = (Scene3200 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		if (R2_GLOBALS._player._characterIndex == 3) 
-			_object2 = &R2_GLOBALS._player;
-		else
-			_object2 = &scene->_actor2;
-
+		_object2 = &scene->_actor3;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover)
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4051, 5, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 2:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4050, 3, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	default:
-		signal();
-		break;
+		_object1.setup(4060, (_object2->_strip * 2) - 1, 1);
+		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerWebbster3400::SpeakerWebbster3400() {
-	_speakerName = "WEBBSTER";
-	_color1 = 27;
+//----------------------------------------------------------------------------
+// Classes related to SOLDIER
+//----------------------------------------------------------------------------
+
+SpeakerSoldier300::SpeakerSoldier300(): VisualSpeaker() {
+	_speakerName = "SOLDIER";
+	_color1 = 60;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -2288,63 +1837,93 @@ SpeakerWebbster3400::SpeakerWebbster3400() {
 	_numFrames = 0;
 }
 
-void SpeakerWebbster3400::proc15() {
-	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerSoldier300::proc15() {
+	int v = _fieldF6;
+
+	if (!_object2) {
+		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+		_object2 = &scene->_teal;
+		_object2->hide();
+
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
+	}
+
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(303, 3, 1);
+		_object1.animate(ANIM_MODE_5, this);
+	}
+}
+
+//----------------------------------------------------------------------------
+// Classes related to TEAL
+//----------------------------------------------------------------------------
+
+SpeakerTeal::SpeakerTeal(): VisualSpeaker() {
+	_speakerName = "TEAL";
+	_color1 = 22;
+	_color2 = 0;
+	_fieldF6 = 0;
+	_textWidth = 300;
+	_hideObjects = false;
+	_object2 = NULL;
+	_displayMode = 1;
+	_numFrames = 0;
+}
 
+void SpeakerTeal300::proc15() {
 	int v = _fieldF6;
 
 	if (!_object2) {
-		_object2 = &scene->_actor3;
+		Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene;
+		_object2 = &scene->_teal;
+		_object2->hide();
+
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
+	}
+
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
+	} else {
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(303, 1, 1);
+		_object1.animate(ANIM_MODE_5, this);
+	}
+}
+
+void SpeakerTeal3240::proc15() {
+	int v = _fieldF6;
+	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
+
+	if (!_object2) {
+		_object2 = &scene->_actor1;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		_object1._effect = 1;
-		_object1.changeZoom(-1);
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover)
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
 
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 5, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 2:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 7, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 3:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		_object1.setup(4110, 3, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	default:
-		signal();
-		break;
+		_object1.setup(4070, (_object2->_strip * 2) - 1, 1);
+		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerTeal3400::SpeakerTeal3400() {
-	_speakerName = "TEAL";
-	_color1 = 22;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
-}
-
 void SpeakerTeal3400::proc15() {
 	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
 
@@ -2402,9 +1981,13 @@ void SpeakerTeal3400::proc15() {
 	}
 }
 
-SpeakerQuinn3700::SpeakerQuinn3700() {
-	_speakerName = "QUINN";
-	_color1 = 60;
+//----------------------------------------------------------------------------
+// Classes related to TOMKO
+//----------------------------------------------------------------------------
+
+SpeakerTomko3245::SpeakerTomko3245() {
+	_speakerName = "Tomko";
+	_color1 = 10;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -2414,79 +1997,49 @@ SpeakerQuinn3700::SpeakerQuinn3700() {
 	_numFrames = 0;
 }
 
-void SpeakerQuinn3700::setText(const Common::String &msg) {
-	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
-
-	switch (_fieldF6) {
-	case 2:
-		scene->_actor3.setup(30, 1, 1);
-		R2_GLOBALS._sound2.play(44);
-		break;
-	case 3:
-		scene->_actor3.setup(30, 1, 1);
-		break;
-	default:
-		scene->_actor3.setup(30, 7, 1);
-		break;
-	}
-	VisualSpeaker::setText(msg);
-}
-
-void SpeakerQuinn3700::proc15() {
-	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
-
+void SpeakerTomko3245::proc15() {
 	int v = _fieldF6;
+	Scene3245 *scene = (Scene3245 *)R2_GLOBALS._sceneManager._scene;
 
 	if (!_object2) {
-		_object2 = &scene->_actor1;
+		_object2 = &scene->_actor2;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
-		_object1._numFrames = 7;
-		R2_GLOBALS._player.disableControl();
-		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
-		if (_object2->_mover)
+		if (_object2->_mover) 
 			_object2->addMover(NULL);
 	}
 
-	_object1.setPosition(_object2->_position);
-
-	switch (v) {
-	case 0:
+	if (v == 0) {
 		_object1.animate(ANIM_MODE_2, NULL);
-		break;
-	case 1:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		R2_GLOBALS._sound2.stop();
-		scene->_actor1.setup(10, 4, 1);
-		scene->_actor3.setup(30, 7, 1);
-		_object1.setup(3701, 1, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 2:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor2.setup(20, 1, 1);
-		scene->_actor3.setup(30, 1, 1);
-		_object1.setup(3701, 2, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 3:
+	} else {
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor1.setup(10, 2, 1);
-		scene->_actor3.setup(30, 1, 1);
-		_object1.setup(4011, 1, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	default:
-		signal();
-		break;
+		switch (_object2->_visage) {
+		case 3100:
+			_object1.setup(4105, (_object2->_strip * 2) - 1, 1);
+			break;
+		case 3101:
+			_object1.setup(4108, (_object2->_strip * 2) - 1, 1);
+			break;
+		case 3102:
+			_object1.setup(4109, (_object2->_strip * 2) - 1, 1);
+			break;
+		default:
+			break;
+		}
+
+		_object1.animate(ANIM_MODE_5, this);
 	}
 }
 
-SpeakerSeeker3700::SpeakerSeeker3700() {
-	_speakerName = "SEEKER";
-	_color1 = 35;
+//----------------------------------------------------------------------------
+// Classes related to WEBBSTER
+//----------------------------------------------------------------------------
+
+SpeakerWebbster::SpeakerWebbster(int colour) {
+	_speakerName = "WEBBSTER";
+	_color1 = colour;
 	_color2 = 0;
 	_fieldF6 = 0;
 	_textWidth = 300;
@@ -2496,29 +2049,51 @@ SpeakerSeeker3700::SpeakerSeeker3700() {
 	_numFrames = 0;
 }
 
-void SpeakerSeeker3700::setText(const Common::String &msg) {
-	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerWebbster3240::proc15() {
+	int v = _fieldF6;
+	Scene3240 *scene = (Scene3240 *)R2_GLOBALS._sceneManager._scene;
 
-	if (_fieldF6 == 1) {
-		R2_GLOBALS._sound2.play(44);
-		scene->_actor3.setup(30, 8, 1);
+	if (!_object2) {
+		_object2 = &scene->_actor2;
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+
+		if (_object2->_mover) 
+			_object2->addMover(NULL);
+	}
+
+	if (v == 0) {
+		_object1.animate(ANIM_MODE_2, NULL);
 	} else {
-		scene->_actor3.setup(30, 2, 1);
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4110, 5, 1);
+		_object1.animate(ANIM_MODE_5, this);
 	}
-	VisualSpeaker::setText(msg);
 }
 
-void SpeakerSeeker3700::proc15() {
-	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerWebbster3375::proc15() {
+	Scene3375 *scene = (Scene3375 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
 	if (!_object2) {
-		_object2 = &scene->_actor2;
+		_object2 = &scene->_actor3;
 		_object2->hide();
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
 		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		
+		if (scene->_actor1._position.y != 163)
+			R2_GLOBALS._player.setStrip(8);
+		else
+			R2_GLOBALS._player.setStrip(2);
+
+		if (R2_GLOBALS._player._mover)
+			R2_GLOBALS._player.addMover(NULL);
+
 		R2_GLOBALS._player.disableControl();
 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
@@ -2526,28 +2101,14 @@ void SpeakerSeeker3700::proc15() {
 			_object2->addMover(NULL);
 	}
 
-	_object1.setPosition(_object2->_position);
-
 	switch (v) {
 	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		R2_GLOBALS._sound2.stop();
-		scene->_actor1.setup(10, 8, 1);
-		scene->_actor2.setup(20, 7, 1);
-		scene->_actor3.setup(30, 8, 1);
-		_object1.setup(3701, 3, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
-		break;
-	case 2:
-		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor1.setup(10, 2, 1);
-		scene->_actor2.setup(20, 1, 1);
-		scene->_actor3.setup(30, 1, 1);
-		_object1.setup(4031, 1, 1);
-		_object1.animate(ANIM_MODE_5, NULL);
+		_object1.setup(4110, 5, 1);
+		_object1.animate(ANIM_MODE_5, this);
 		break;
 	default:
 		signal();
@@ -2555,20 +2116,52 @@ void SpeakerSeeker3700::proc15() {
 	}
 }
 
-SpeakerMiranda3700::SpeakerMiranda3700() {
-	_speakerName = "MIRANDA";
-	_color1 = 154;
-	_color2 = 0;
-	_fieldF6 = 0;
-	_textWidth = 300;
-	_hideObjects = false;
-	_object2 = NULL;
-	_displayMode = 1;
-	_numFrames = 0;
+void SpeakerWebbster3385::proc15() {
+	Scene3385 *scene = (Scene3385 *)R2_GLOBALS._sceneManager._scene;
+
+	int v = _fieldF6;
+
+	if (!_object2) {
+		_object2 = &scene->_actor3;
+		_object2->hide();
+		_object1.postInit();
+		_object1.setPosition(_object2->_position);
+		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
+		
+		if (R2_GLOBALS._sceneManager._previousScene == 3375)
+			R2_GLOBALS._player.setStrip(4);
+		else
+			R2_GLOBALS._player.setStrip(3);
+
+		if (R2_GLOBALS._player._mover)
+			R2_GLOBALS._player.addMover(NULL);
+
+		R2_GLOBALS._player.disableControl(CURSOR_TALK);
+		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+
+		if (_object2->_mover)
+			_object2->addMover(NULL);
+	}
+
+	switch (v) {
+	case 0:
+		_object1.animate(ANIM_MODE_2, NULL);
+		break;
+	case 1:
+		((SceneItem *)_action)->_sceneRegionId = 0;
+		_object1.setup(4110, 5, 1);
+		_object1.animate(ANIM_MODE_5, this);
+		break;
+	default:
+		signal();
+		break;
+	}
 }
 
-void SpeakerMiranda3700::proc15() {
-	Scene3700 *scene = (Scene3700 *)R2_GLOBALS._sceneManager._scene;
+void SpeakerWebbster3400::proc15() {
+	Scene3400 *scene = (Scene3400 *)R2_GLOBALS._sceneManager._scene;
 
 	int v = _fieldF6;
 
@@ -2578,6 +2171,8 @@ void SpeakerMiranda3700::proc15() {
 		_object1.postInit();
 		_object1.setPosition(_object2->_position);
 		_object1._numFrames = 7;
+		_object1._effect = 1;
+		_object1.changeZoom(-1);
 		R2_GLOBALS._player.disableControl();
 		R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
 
@@ -2585,32 +2180,23 @@ void SpeakerMiranda3700::proc15() {
 			_object2->addMover(NULL);
 	}
 
-	_object1.setPosition(_object2->_position);
-
 	switch (v) {
 	case 0:
 		_object1.animate(ANIM_MODE_2, NULL);
 		break;
 	case 1:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor1.setup(10, 6, 1);
-		scene->_actor2.setup(20, 5, 1);
-		_object2->setup(30, 1, 1);
-		scene->_actor4.setup(40, 1, 1);
-		_object1.setup(4050, 5, 1);
+		_object1.setup(4110, 5, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	case 2:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor3.setup(30, 8, 1);
-		_object1.setup(4052, 3, 1);
+		_object1.setup(4110, 7, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	case 3:
 		((SceneItem *)_action)->_sceneRegionId = 0;
-		scene->_actor2.setup(20, 1, 1);
-		scene->_actor3.setup(30, 1, 1);
-		_object1.setup(4051, 7, 1);
+		_object1.setup(4110, 3, 1);
 		_object1.animate(ANIM_MODE_5, NULL);
 		break;
 	default:
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h
index c3de6a6..3020b19 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.h
+++ b/engines/tsage/ringworld2/ringworld2_speakers.h
@@ -63,461 +63,442 @@ public:
 	void setDelay(int delay);
 };
 
-class SpeakerMiranda300 : public VisualSpeaker {
+// Classes related to Captain
+
+class SpeakerCaptain3210 : public VisualSpeaker {
 public:
-	SpeakerMiranda300();
+	SpeakerCaptain3210();
 
-	virtual Common::String getClassName() { return "SpeakerMiranda300"; }
+	virtual Common::String getClassName() { return "SpeakerCaptain3210"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker300 : public VisualSpeaker {
+// Classes related to Caretaker
+
+class SpeakerCaretaker2450 : public VisualSpeaker {
 public:
-	SpeakerSeeker300();
+	SpeakerCaretaker2450();
 
-	virtual Common::String getClassName() { return "SpeakerSeeker300"; }
-	virtual void proc15();
+	virtual Common::String getClassName() { return "SpeakerCaretaker2450"; }
 };
 
-class SpeakerSeekerL : public VisualSpeaker {
-public:
-	SpeakerSeekerL();
+// Classes related to Guard
 
-	virtual Common::String getClassName() { return "SpeakerSeekerL"; }
+class SpeakerGuard : public VisualSpeaker {
+public:
+	SpeakerGuard();
+	virtual Common::String getClassName() { return "SpeakerGuard"; }
 };
 
-class SpeakerQuinnL : public VisualSpeaker {
+class SpeakerGuard2800 : public SpeakerGuard {
 public:
-	SpeakerQuinnL();
-
-	virtual Common::String getClassName() { return "SpeakerQuinnL"; }
+	virtual Common::String getClassName() { return "SpeakerGuard2800"; }
+	virtual void proc15();
 };
 
-class SpeakerQuinn300 : public VisualSpeaker {
+// Classes related to Jocko
+
+class SpeakerJocko : public VisualSpeaker {
 public:
-	SpeakerQuinn300();
+	SpeakerJocko();
+	virtual Common::String getClassName() { return "SpeakerJocko"; }
+};
 
-	virtual Common::String getClassName() { return "SpeakerQuinn300"; }
+class SpeakerJocko3200 : public SpeakerJocko {
+public:
+	virtual Common::String getClassName() { return "SpeakerJocko3200"; }
 	virtual void proc15();
 };
 
-class SpeakerTeal300 : public VisualSpeaker {
+class SpeakerJocko3220 : public SpeakerJocko {
 public:
-	SpeakerTeal300();
-
-	virtual Common::String getClassName() { return "SpeakerTeal300"; }
+	virtual Common::String getClassName() { return "SpeakerJocko3220"; }
 	virtual void proc15();
 };
 
-class SpeakerSoldier300 : public VisualSpeaker {
+class SpeakerJocko3230 : public SpeakerJocko {
 public:
-	SpeakerSoldier300();
-
-	virtual Common::String getClassName() { return "SpeakerSoldier300"; }
+	virtual Common::String getClassName() { return "SpeakerJocko3230"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn2350 : public VisualSpeaker {
-public:
-	SpeakerQuinn2350();
+// Classes related to Miranda
 
-	virtual Common::String getClassName() { return "SpeakerQuinn2350"; }
+class SpeakerMiranda : public VisualSpeaker {
+public:
+	SpeakerMiranda();
+	virtual Common::String getClassName() { return "SpeakerMiranda"; }
 };
 
-class SpeakerPharisha2350 : public VisualSpeaker {
+class SpeakerMiranda300 : public SpeakerMiranda {
 public:
-	SpeakerPharisha2350();
-
-	virtual Common::String getClassName() { return "SpeakerPharisha2350"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda300"; }
+	virtual void proc15();
 };
 
-class SpeakerQuinn2435 : public VisualSpeaker {
+class SpeakerMiranda3255 : public SpeakerMiranda {
 public:
-	SpeakerQuinn2435();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn2435"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda3255"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker2435 : public VisualSpeaker {
+class SpeakerMiranda3375 : public SpeakerMiranda {
 public:
-	SpeakerSeeker2435();
-
-	virtual Common::String getClassName() { return "SpeakerSeeker2435"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda3375"; }
 	virtual void proc15();
 };
 
-class SpeakerPharisha2435 : public VisualSpeaker {
+class SpeakerMiranda3385 : public SpeakerMiranda {
 public:
-	SpeakerPharisha2435();
-
-	virtual Common::String getClassName() { return "SpeakerPharisha2435"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda3385"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn2450 : public VisualSpeaker {
+class SpeakerMiranda3400 : public SpeakerMiranda {
 public:
-	SpeakerQuinn2450();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn2450"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda3400"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker2450 : public VisualSpeaker {
+class SpeakerMiranda3700 : public SpeakerMiranda {
 public:
-	SpeakerSeeker2450();
-
-	virtual Common::String getClassName() { return "SpeakerSeeker2450"; }
+	virtual Common::String getClassName() { return "SpeakerMiranda3700"; }
 	virtual void proc15();
 };
 
-class SpeakerCaretaker2450 : public VisualSpeaker {
-public:
-	SpeakerCaretaker2450();
+// Classes related to Nej
 
-	virtual Common::String getClassName() { return "SpeakerCaretaker2450"; }
+class SpeakerNej : public VisualSpeaker {
+public:
+	SpeakerNej();
+	virtual Common::String getClassName() { return "SpeakerNej"; }
 };
 
-class SpeakerQuinn2500 : public VisualSpeaker {
+class SpeakerNej2700 : public SpeakerNej {
 public:
-	SpeakerQuinn2500();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn2500"; }
+	virtual Common::String getClassName() { return "SpeakerNej2700"; }
+	virtual void proc15();
 };
 
-class SpeakerSeeker2500 : public VisualSpeaker {
+class SpeakerNej2750 : public SpeakerNej {
 public:
-	SpeakerSeeker2500();
-
-	virtual Common::String getClassName() { return "SpeakerSeeker2500"; }
+	virtual Common::String getClassName() { return "SpeakerNej2750"; }
+	virtual void proc15();
 };
 
-class SpeakerMiranda2500 : public VisualSpeaker {
+class SpeakerNej2800 : public SpeakerNej {
 public:
-	SpeakerMiranda2500();
-
-	virtual Common::String getClassName() { return "SpeakerMiranda2500"; }
+	virtual Common::String getClassName() { return "SpeakerNej2800"; }
+	virtual void proc15();
 };
 
-class SpeakerWebbster2500 : public VisualSpeaker {
+// Classes related to Pharisha
+
+class SpeakerPharisha : public VisualSpeaker {
 public:
-	SpeakerWebbster2500();
+	SpeakerPharisha();
 
-	virtual Common::String getClassName() { return "SpeakerWebbster2500"; }
+	virtual Common::String getClassName() { return "SpeakerPharisha"; }
 };
 
-class SpeakerQuinn2700 : public VisualSpeaker {
+class SpeakerPharisha2435 : public SpeakerPharisha {
 public:
-	SpeakerQuinn2700();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn2700"; }
+	virtual Common::String getClassName() { return "SpeakerPharisha2435"; }
 	virtual void proc15();
 };
 
-class SpeakerNej2700 : public VisualSpeaker {
+// Classes related to Private
+
+class SpeakerPrivate3210 : public VisualSpeaker {
 public:
-	SpeakerNej2700();
+	SpeakerPrivate3210();
 
-	virtual Common::String getClassName() { return "SpeakerNej2700"; }
+	virtual Common::String getClassName() { return "SpeakerPrivate3210"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn2750 : public VisualSpeaker {
-public:
-	SpeakerQuinn2750();
+// Classes related to Quinn
 
-	virtual Common::String getClassName() { return "SpeakerQuinn2750"; }
-	virtual void proc15();
+class SpeakerQuinn : public VisualSpeaker {
+public:
+	SpeakerQuinn();
+	virtual Common::String getClassName() { return "SpeakerQuinn"; }
 };
 
-class SpeakerNej2750 : public VisualSpeaker {
+class SpeakerQuinn300 : public SpeakerQuinn {
 public:
-	SpeakerNej2750();
-
-	virtual Common::String getClassName() { return "SpeakerNej2750"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn300"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn2800 : public VisualSpeaker {
+class SpeakerQuinn2435 : public SpeakerQuinn {
 public:
-	SpeakerQuinn2800();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn2800"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn2435"; }
 	virtual void proc15();
 };
 
-class SpeakerNej2800 : public VisualSpeaker {
+class SpeakerQuinn2450 : public SpeakerQuinn {
 public:
-	SpeakerNej2800();
-
-	virtual Common::String getClassName() { return "SpeakerNej2800"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn2450"; }
 	virtual void proc15();
 };
 
-class SpeakerGuard2800 : public VisualSpeaker {
+class SpeakerQuinn2700 : public SpeakerQuinn {
 public:
-	SpeakerGuard2800();
-
-	virtual Common::String getClassName() { return "SpeakerGuard2800"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn2700"; }
 	virtual void proc15();
 };
 
-class SpeakerGuard3100 : public VisualSpeaker {
+class SpeakerQuinn2750 : public SpeakerQuinn {
 public:
-	SpeakerGuard3100();
-
-	virtual Common::String getClassName() { return "SpeakerGuard3100"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn2750"; }
+	virtual void proc15();
 };
 
-class SpeakerRocko3200 : public VisualSpeaker {
+class SpeakerQuinn2800 : public SpeakerQuinn {
 public:
-	SpeakerRocko3200();
-
-	virtual Common::String getClassName() { return "SpeakerRocko3200"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn2800"; }
 	virtual void proc15();
 };
 
-class SpeakerJocko3200 : public VisualSpeaker {
+class SpeakerQuinn3255 : public SpeakerQuinn {
 public:
-	SpeakerJocko3200();
-
-	virtual Common::String getClassName() { return "SpeakerJocko3200"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn3255"; }
 	virtual void proc15();
 };
 
-class SpeakerSocko3200 : public VisualSpeaker {
+class SpeakerQuinn3375 : public SpeakerQuinn {
 public:
-	SpeakerSocko3200();
-
-	virtual Common::String getClassName() { return "SpeakerSocko3200"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn3375"; }
 	virtual void proc15();
 };
 
-class SpeakerCaptain3210 : public VisualSpeaker {
+class SpeakerQuinn3385 : public SpeakerQuinn {
 public:
-	SpeakerCaptain3210();
-
-	virtual Common::String getClassName() { return "SpeakerCaptain3210"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn3385"; }
 	virtual void proc15();
 };
 
-class SpeakerPrivate3210 : public VisualSpeaker {
+class SpeakerQuinn3400 : public SpeakerQuinn {
 public:
-	SpeakerPrivate3210();
-
-	virtual Common::String getClassName() { return "SpeakerPrivate3210"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn3400"; }
 	virtual void proc15();
 };
 
-class SpeakerRocko3220 : public VisualSpeaker {
+class SpeakerQuinn3700 : public SpeakerQuinn {
 public:
-	SpeakerRocko3220();
-
-	virtual Common::String getClassName() { return "SpeakerRocko3220"; }
+	virtual Common::String getClassName() { return "SpeakerQuinn3700"; }
+	virtual void setText(const Common::String &msg);
 	virtual void proc15();
 };
 
-class SpeakerJocko3220 : public VisualSpeaker {
+// Classes related to QuinnL
+
+class SpeakerQuinnL : public VisualSpeaker {
 public:
-	SpeakerJocko3220();
+	SpeakerQuinnL();
 
-	virtual Common::String getClassName() { return "SpeakerJocko3220"; }
-	virtual void proc15();
+	virtual Common::String getClassName() { return "SpeakerQuinnL"; }
 };
 
-class SpeakerRocko3230 : public VisualSpeaker {
+// Classes related to Ralf
+
+class SpeakerRalf3245 : public VisualSpeaker {
 public:
-	SpeakerRocko3230();
+	SpeakerRalf3245();
 
-	virtual Common::String getClassName() { return "SpeakerRocko3230"; }
+	virtual Common::String getClassName() { return "SpeakerRalf3245"; }
 	virtual void proc15();
 };
 
-class SpeakerJocko3230 : public VisualSpeaker {
-public:
-	SpeakerJocko3230();
+// Classes related to Rocko
 
-	virtual Common::String getClassName() { return "SpeakerJocko3230"; }
-	virtual void proc15();
+class SpeakerRocko : public VisualSpeaker {
+public:
+	SpeakerRocko();
+	virtual Common::String getClassName() { return "SpeakerRocko"; }
 };
 
-class SpeakerTeal3240 : public VisualSpeaker {
+class SpeakerRocko3200 : public SpeakerRocko {
 public:
-	SpeakerTeal3240();
-
-	virtual Common::String getClassName() { return "SpeakerTeal3240"; }
+	virtual Common::String getClassName() { return "SpeakerRocko3200"; }
 	virtual void proc15();
 };
 
-class SpeakerWebbster3240 : public VisualSpeaker {
+class SpeakerRocko3220 : public SpeakerRocko {
 public:
-	SpeakerWebbster3240();
-
-	virtual Common::String getClassName() { return "SpeakerWebbster3240"; }
+	virtual Common::String getClassName() { return "SpeakerRocko3220"; }
 	virtual void proc15();
 };
 
-class SpeakerRalf3245 : public VisualSpeaker {
+class SpeakerRocko3230 : public SpeakerRocko {
 public:
-	SpeakerRalf3245();
-
-	virtual Common::String getClassName() { return "SpeakerRalf3245"; }
+	virtual Common::String getClassName() { return "SpeakerRocko3230"; }
 	virtual void proc15();
 };
 
-class SpeakerTomko3245 : public VisualSpeaker {
-public:
-	SpeakerTomko3245();
+// Classes related to Seeker
 
-	virtual Common::String getClassName() { return "SpeakerTomko3245"; }
-	virtual void proc15();
+class SpeakerSeeker : public VisualSpeaker {
+public:
+	SpeakerSeeker();
+	virtual Common::String getClassName() { return "SpeakerSeeker"; }
 };
 
-class SpeakerQuinn3255 : public VisualSpeaker {
+class SpeakerSeeker300 : public SpeakerSeeker {
 public:
-	SpeakerQuinn3255();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn3255"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker300"; }
 	virtual void proc15();
 };
 
-class SpeakerMiranda3255 : public VisualSpeaker {
+class SpeakerSeeker2435 : public SpeakerSeeker {
 public:
-	SpeakerMiranda3255();
-
-	virtual Common::String getClassName() { return "SpeakerMiranda3255"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker2435"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn3375 : public VisualSpeaker {
+class SpeakerSeeker2450 : public SpeakerSeeker {
 public:
-	SpeakerQuinn3375();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn3375"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker2450"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker3375 : public VisualSpeaker {
+class SpeakerSeeker3375 : public SpeakerSeeker {
 public:
-	SpeakerSeeker3375();
-
 	virtual Common::String getClassName() { return "SpeakerSeeker3375"; }
 	virtual void proc15();
 };
 
-class SpeakerMiranda3375 : public VisualSpeaker {
+class SpeakerSeeker3385 : public SpeakerSeeker {
 public:
-	SpeakerMiranda3375();
-
-	virtual Common::String getClassName() { return "SpeakerMiranda3375"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker3385"; }
 	virtual void proc15();
 };
 
-class SpeakerWebbster3375 : public VisualSpeaker {
+class SpeakerSeeker3400 : public SpeakerSeeker {
 public:
-	SpeakerWebbster3375();
-
-	virtual Common::String getClassName() { return "SpeakerWebbster3375"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker3400"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn3385 : public VisualSpeaker {
+class SpeakerSeeker3700 : public SpeakerSeeker {
 public:
-	SpeakerQuinn3385();
-
-	virtual Common::String getClassName() { return "SpeakerQuinn3385"; }
+	virtual Common::String getClassName() { return "SpeakerSeeker3700"; }
+	virtual void setText(const Common::String &msg);
 	virtual void proc15();
 };
 
-class SpeakerSeeker3385 : public VisualSpeaker {
+// Classes related to SeekerL
+
+class SpeakerSeekerL : public VisualSpeaker {
 public:
-	SpeakerSeeker3385();
+	SpeakerSeekerL();
 
-	virtual Common::String getClassName() { return "SpeakerSeeker3385"; }
-	virtual void proc15();
+	virtual Common::String getClassName() { return "SpeakerSeekerL"; }
 };
 
-class SpeakerMiranda3385 : public VisualSpeaker {
+// Classes related to Socko
+
+class SpeakerSocko3200 : public VisualSpeaker {
 public:
-	SpeakerMiranda3385();
+	SpeakerSocko3200();
 
-	virtual Common::String getClassName() { return "SpeakerMiranda3385"; }
+	virtual Common::String getClassName() { return "SpeakerSocko3200"; }
 	virtual void proc15();
 };
 
-class SpeakerWebbster3385 : public VisualSpeaker {
+// Classes related to Soldier
+
+class SpeakerSoldier300 : public VisualSpeaker {
 public:
-	SpeakerWebbster3385();
+	SpeakerSoldier300();
 
-	virtual Common::String getClassName() { return "SpeakerWebbster3385"; }
+	virtual Common::String getClassName() { return "SpeakerSoldier300"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn3400 : public VisualSpeaker {
+// Classes related to Teal
+
+class SpeakerTeal : public VisualSpeaker {
 public:
-	SpeakerQuinn3400();
+	SpeakerTeal();
+	virtual Common::String getClassName() { return "SpeakerTeal"; }
+};
 
-	virtual Common::String getClassName() { return "SpeakerQuinn3400"; }
+class SpeakerTeal300 : public SpeakerTeal {
+public:
+	virtual Common::String getClassName() { return "SpeakerTeal300"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker3400 : public VisualSpeaker {
+class SpeakerTeal3240 : public SpeakerTeal {
 public:
-	SpeakerSeeker3400();
+	virtual Common::String getClassName() { return "SpeakerTeal3240"; }
+	virtual void proc15();
+};
 
-	virtual Common::String getClassName() { return "SpeakerSeeker3400"; }
+class SpeakerTeal3400 : public SpeakerTeal {
+public:
+	virtual Common::String getClassName() { return "SpeakerTeal3400"; }
 	virtual void proc15();
 };
 
-class SpeakerMiranda3400 : public VisualSpeaker {
+// Classes related to Tomko
+
+class SpeakerTomko3245 : public VisualSpeaker {
 public:
-	SpeakerMiranda3400();
+	SpeakerTomko3245();
 
-	virtual Common::String getClassName() { return "SpeakerMiranda3400"; }
+	virtual Common::String getClassName() { return "SpeakerTomko3245"; }
 	virtual void proc15();
 };
 
-class SpeakerWebbster3400 : public VisualSpeaker {
+// Classes related to Webbster
+
+class SpeakerWebbster : public VisualSpeaker {
 public:
-	SpeakerWebbster3400();
+	SpeakerWebbster(int colour);
+	virtual Common::String getClassName() { return "SpeakerWebbster"; }
+};
 
-	virtual Common::String getClassName() { return "SpeakerWebbster3400"; }
-	virtual void proc15();
+class SpeakerWebbster2500 : public SpeakerWebbster {
+public:
+	SpeakerWebbster2500() : SpeakerWebbster(27) {}
+	virtual Common::String getClassName() { return "SpeakerWebbster2500"; }
 };
 
-class SpeakerTeal3400 : public VisualSpeaker {
+class SpeakerWebbster3240 : public SpeakerWebbster {
 public:
-	SpeakerTeal3400();
+	SpeakerWebbster3240() : SpeakerWebbster(10) {};
 
-	virtual Common::String getClassName() { return "SpeakerTeal3400"; }
+	virtual Common::String getClassName() { return "SpeakerWebbster3240"; }
 	virtual void proc15();
 };
 
-class SpeakerQuinn3700 : public VisualSpeaker {
+class SpeakerWebbster3375 : public SpeakerWebbster {
 public:
-	SpeakerQuinn3700();
+	SpeakerWebbster3375() : SpeakerWebbster(60) {};
 
-	virtual Common::String getClassName() { return "SpeakerQuinn3700"; }
-	virtual void setText(const Common::String &msg);
+	virtual Common::String getClassName() { return "SpeakerWebbster3375"; }
 	virtual void proc15();
 };
 
-class SpeakerSeeker3700 : public VisualSpeaker {
+class SpeakerWebbster3385 : public SpeakerWebbster {
 public:
-	SpeakerSeeker3700();
+	SpeakerWebbster3385() : SpeakerWebbster(60) {};
 
-	virtual Common::String getClassName() { return "SpeakerSeeker3700"; }
-	virtual void setText(const Common::String &msg);
+	virtual Common::String getClassName() { return "SpeakerWebbster3385"; }
 	virtual void proc15();
 };
 
-class SpeakerMiranda3700 : public VisualSpeaker {
+class SpeakerWebbster3400 : public SpeakerWebbster {
 public:
-	SpeakerMiranda3700();
+	SpeakerWebbster3400() : SpeakerWebbster(27) {};
 
-	virtual Common::String getClassName() { return "SpeakerMiranda3700"; }
+	virtual Common::String getClassName() { return "SpeakerWebbster3400"; }
 	virtual void proc15();
 };
+
 } // End of namespace Ringworld2
 } // End of namespace TsAGE
 






More information about the Scummvm-git-logs mailing list