aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/tsage/core.cpp5
-rw-r--r--engines/tsage/core.h5
-rw-r--r--engines/tsage/ringworld_logic.cpp33
-rw-r--r--engines/tsage/ringworld_logic.h8
-rw-r--r--engines/tsage/ringworld_scenes1.cpp104
-rw-r--r--engines/tsage/ringworld_scenes1.h6
-rw-r--r--engines/tsage/ringworld_scenes10.cpp4
-rw-r--r--engines/tsage/ringworld_scenes6.cpp443
-rw-r--r--engines/tsage/ringworld_scenes6.h74
-rw-r--r--engines/tsage/scenes.cpp43
-rw-r--r--engines/tsage/scenes.h4
11 files changed, 691 insertions, 38 deletions
diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp
index 06df34ee20..cbe9fd37b2 100644
--- a/engines/tsage/core.cpp
+++ b/engines/tsage/core.cpp
@@ -412,6 +412,7 @@ void ObjectMover2::dispatch() {
if (area > _maxArea) {
// Setup again for the new destination
setup(_destObject->_position);
+ ObjectMover::dispatch();
} else if (area >= _minArea) {
// Keep dispatching
ObjectMover::dispatch();
@@ -3498,7 +3499,7 @@ void SceneHandler::dispatch() {
_globals->_scenePalette.signalListeners();
// Dispatch to any objects registered in the scene
- _globals->_sceneObjects->recurse(SceneHandler::handleListener);
+ _globals->_sceneObjects->recurse(SceneHandler::dispatchObject);
// If a scene is active, then dispatch to it
if (_globals->_sceneManager._scene)
@@ -3520,7 +3521,7 @@ void SceneHandler::dispatch() {
_globals->_events.delay(_delayTicks);
}
-void SceneHandler::handleListener(EventHandler *obj) {
+void SceneHandler::dispatchObject(EventHandler *obj) {
obj->dispatch();
}
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index d55eacb911..a65cec06b9 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -712,12 +712,12 @@ public:
class SceneObjectList: public SavedObject {
private:
void checkIntersection(Common::Array<SceneObject *> &ObjList, uint ObjIndex, int PaneNum);
- void sortList(Common::Array<SceneObject *> &ObjList);
List<SceneObject *> _objList;
bool _listAltered;
public:
SceneObjectList() { _listAltered = false; }
+ void sortList(Common::Array<SceneObject *> &ObjList);
virtual Common::String getClassName() { return "SceneObjectList"; }
virtual void synchronise(Serialiser &s);
@@ -904,6 +904,7 @@ class FloatSet {
public:
double _float1, _float2, _float3, _float4;
+ FloatSet() { _float1 = _float2 = _float3 = _float4 = 0; }
void add(double v1, double v2, double v3);
void proc1(double v);
double sqrt(FloatSet &floatSet);
@@ -943,7 +944,7 @@ public:
virtual void process(Event &event);
virtual void dispatch();
- static void handleListener(EventHandler *obj);
+ static void dispatchObject(EventHandler *obj);
static void saveListener(Serialiser &ser);
};
diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp
index 9c1fcfa890..640a5aabf7 100644
--- a/engines/tsage/ringworld_logic.cpp
+++ b/engines/tsage/ringworld_logic.cpp
@@ -137,6 +137,8 @@ Scene *SceneFactory::createScene(int sceneNumber) {
case 5100: return new Scene5100();
// Caverns - Throne-room
case 5200: return new Scene5200();
+ // Caverns - Pit
+ case 5300: return new Scene5300();
/* Scene group 8 */
// Scene 7000: Landing
@@ -1122,4 +1124,35 @@ void SpeakerFLL::setText(const Common::String &msg) {
Speaker::setText(msg);
}
+/*--------------------------------------------------------------------------*/
+
+SpeakerBatR::SpeakerBatR() {
+ _speakerName = "BATR";
+ _newSceneNumber = 5360;
+ _textPos = Common::Point(140, 40);
+ _colour1 = 3;
+}
+
+void SpeakerBatR::setText(const Common::String &msg) {
+ _object1.postInit(&_objectList);
+ _object1.setVisage(5361);
+ _object1.setStrip2(2);
+ _object1.setPriority2(255);
+ _object1.changeZoom(100);
+ _object1._frame = 1;
+ _object1.setPosition(Common::Point(137, 122));
+ _object1.animate(ANIM_MODE_7, 0, NULL);
+
+ _object2.postInit(&_objectList);
+ _object2.setVisage(5361);
+ _object2.setStrip2(1);
+ _object2.setPriority2(255);
+ _object2.changeZoom(100);
+ _object2._frame = 1;
+ _object2.setPosition(Common::Point(137, 104));
+ _object2.setAction(&_speakerAction, NULL);
+
+ Speaker::setText(msg);
+}
+
} // End of namespace tSage
diff --git a/engines/tsage/ringworld_logic.h b/engines/tsage/ringworld_logic.h
index 281833fc38..fd3264e403 100644
--- a/engines/tsage/ringworld_logic.h
+++ b/engines/tsage/ringworld_logic.h
@@ -389,6 +389,14 @@ public:
virtual void setText(const Common::String &msg);
};
+class SpeakerBatR: public AnimatedSpeaker {
+public:
+ SpeakerBatR();
+
+ virtual Common::String getClassName() { return "SpeakerBatR"; }
+ virtual void setText(const Common::String &msg);
+};
+
} // End of namespace tSage
#endif
diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp
index 23cbad9994..65a574c912 100644
--- a/engines/tsage/ringworld_scenes1.cpp
+++ b/engines/tsage/ringworld_scenes1.cpp
@@ -2846,7 +2846,7 @@ void Scene6100::Action3::signal() {
break;
case 1:
_globals->_scenePalette.clearListeners();
- scene->_field_310 = 0;
+ scene->_fadePercent = 0;
_globals->_scenePalette.refresh();
scene->loadScene(9997);
scene->_object1.flag100();
@@ -2900,17 +2900,15 @@ void Scene6100::Action5::dispatch() {
FloatSet floatSet = _globals->_floatSet;
const double MULTIPLY_FACTOR = 0.01744;
- // TODO: Method backs up 32 bytes at dseg:195Ah
-
- if (scene->_field_30A) {
- scene->_field_30C = scene->_field_30A % 360;
+ if (scene->_turnAmount) {
+ scene->_angle = (scene->_turnAmount + scene->_angle) % 360;
for (int objIndex = 1; objIndex <= 3; ++objIndex) {
SceneObject *obj = &scene->_object1;
if (objIndex == 2) obj = &scene->_object2;
if (objIndex == 3) obj = &scene->_object3;
- obj->_position.x += scene->_field_30A * 2;
+ obj->_position.x += scene->_turnAmount * 2;
if (obj->_position.x >= 320)
obj->_position.x -= 480;
if (obj->_position.x < -160)
@@ -2924,11 +2922,11 @@ void Scene6100::Action5::dispatch() {
double v2, v3;
v2 = scene->_field_30E;
- v3 = scene->_field_30C * MULTIPLY_FACTOR;
+ v3 = (double)scene->_angle * MULTIPLY_FACTOR;
scene->_object5._floats._float1 += sin(v3) * v2;
v2 = scene->_field_30E;
- v3 = scene->_field_30C * MULTIPLY_FACTOR;
+ v3 = scene->_angle * MULTIPLY_FACTOR;
scene->_object5._floats._float2 += cos(v3) * v2;
for (int idx = 0; idx < 4; ++idx) {
@@ -2936,7 +2934,7 @@ void Scene6100::Action5::dispatch() {
tempSet.add(scene->_object5._floats._float1, scene->_object5._floats._float2,
scene->_object5._floats._float3);
- tempSet.proc1(scene->_field_30C * MULTIPLY_FACTOR);
+ tempSet.proc1(scene->_angle * MULTIPLY_FACTOR);
double sqrtVal = tempSet.sqrt(floatSet);
if (sqrtVal != 0.0) {
@@ -2947,7 +2945,7 @@ void Scene6100::Action5::dispatch() {
scene->_objList[idx]->_position.x = static_cast<int>(
(tempSet._float2 + 330.0) / 330.0 * tempSet._float1 - 160.0);
- if (tempSet._float2 >= 0) {
+ if (tempSet._float2 < 0) {
scene->_objList[idx]->_position.y = 300;
if (idx != 3) {
@@ -2957,7 +2955,7 @@ void Scene6100::Action5::dispatch() {
_globals->_randomSource.getRandomNumber(999) + 750.0;
scene->_objList[idx]->_floats.proc1(
- -(scene->_field_30A * 10 + scene->_field_30C) * MULTIPLY_FACTOR);
+ -(scene->_turnAmount * 10 + scene->_angle) * MULTIPLY_FACTOR);
scene->_objList[idx]->_floats.add(scene->_object5._floats._float1,
scene->_object5._floats._float2, scene->_object5._floats._float3);
@@ -2973,7 +2971,7 @@ void Scene6100::Action5::dispatch() {
scene->_objList[idx]->_flags |= OBJFLAG_PANES;
- if ((idx != 3) && (scene->_field_310 == 100) &&
+ if ((idx != 3) && (scene->_fadePercent == 100) &&
(tempSet.sqrt(floatSet) < 150.0)) {
switch (scene->_field_312++) {
case 1:
@@ -3002,7 +3000,7 @@ void Scene6100::Action5::dispatch() {
}
_globals->_scenePalette.clearListeners();
- scene->_field_310 = 0;
+ scene->_fadePercent = 0;
}
}
}
@@ -3012,7 +3010,7 @@ void Scene6100::Action6::signal() {
switch (_actionIndex++) {
case 0: {
- scene->_field_30A = 0;
+ scene->_turnAmount = 0;
Common::Point pt(scene->_object4._position.x, scene->_object4._position.y + 10);
NpcMover *mover = new NpcMover();
scene->_object5.addMover(mover, &pt, NULL);
@@ -3146,11 +3144,12 @@ void Scene6100::postInit(SceneObjectList *OwnerList) {
}
_field_30E = 30;
- _field_310 = 100;
+ _fadePercent = 100;
_field_314 = 0;
_field_312 = 0;
- _field_30A = 0;
- _field_30C = 0;
+ _turnAmount = 0;
+ _angle = 0;
+ _msgActive = false;
setAction(&_action5);
_globals->_scenePalette.addRotation(96, 143, -1);
@@ -3161,15 +3160,78 @@ void Scene6100::postInit(SceneObjectList *OwnerList) {
_globals->_soundHandler.startSound(231);
}
-void Scene6100::showMessage(const Common::String &msg, int colour, Action *action) {
- static bool msgActive = false;
+void Scene6100::remove() {
+ _globals->_player.disableControl();
+ _globals->_scenePalette.clearListeners();
+ Scene::remove();
+}
+
+void Scene6100::process(Event &event) {
+ Scene::process(event);
+
+ if (event.eventType == EVENT_KEYPRESS) {
+ // Handle incremental turning speeds with arrow keys
+ if ((event.kbd.keycode == Common::KEYCODE_LEFT) || (event.kbd.keycode == Common::KEYCODE_KP4)) {
+ _turnAmount = MAX(_turnAmount - 1, -8);
+ } else if ((event.kbd.keycode == Common::KEYCODE_RIGHT) || (event.kbd.keycode == Common::KEYCODE_KP6)) {
+ _turnAmount = MIN(_turnAmount + 1, -8);
+ }
+ }
+
+ if (_object5._action)
+ _object5._action->process(event);
+}
+
+void Scene6100::dispatch() {
+ Scene::dispatch();
+
+ if (_object5._action)
+ _object5._action->dispatch();
- if (msgActive) {
- msgActive = false;
+ // Handle mouse controlling the turning
+ int changeAmount = (_globals->_events._mousePos.x - 160) / -20;
+ _turnAmount += (changeAmount - _turnAmount) / 2;
+
+ if (_fadePercent < 100) {
+ _fadePercent += 10;
+ if (_fadePercent >= 100) {
+ _globals->_scenePalette.addRotation(96, 143, -1);
+ _fadePercent = 100;
+ }
+
+ byte adjustData[] = {0xff, 0xff, 0xff, 0};
+ _globals->_scenePalette.fade(adjustData, false, _fadePercent);
+ }
+
+ if (_action != &_action3) {
+ // Display the distance remaining to the target
+ int distance = _object5._floats.sqrt(_object4._floats);
+ Common::String s = Common::String::format("%06lu", distance);
+
+ _sceneText.setPosition(Common::Point(24, 160));
+ _sceneText._fontNumber = 0;
+ _sceneText._colour1 = 35;
+ _sceneText.setup(s);
+ }
+
+ if (_field_314) {
+ if (_action == &_action5) {
+ double distance = _object5._floats.sqrt(_object4._floats);
+
+ if ((distance >= 300.0) && (distance <= 500.0))
+ setAction(&_action6);
+ }
+ }
+}
+
+void Scene6100::showMessage(const Common::String &msg, int colour, Action *action) {
+ if (_msgActive) {
+ _msgActive = false;
_speaker1.removeText();
}
if (!msg.empty()) {
+ _msgActive = true;
_speaker1._textPos.x = 20;
_speaker1._textWidth = 280;
_speaker1._colour1 = colour;
diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld_scenes1.h
index 01b7fcf5c1..95cf603728 100644
--- a/engines/tsage/ringworld_scenes1.h
+++ b/engines/tsage/ringworld_scenes1.h
@@ -538,11 +538,15 @@ public:
SceneText _sceneText;
SceneItem _item1;
- int _field_30A, _field_30C, _field_30E, _field_310;
+ int _turnAmount, _angle, _field_30E, _fadePercent;
int _field_312, _field_314;
Object *_objList[4];
+ bool _msgActive;
virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void remove();
+ virtual void process(Event &event);
+ virtual void dispatch();
void showMessage(const Common::String &msg, int colour, Action *action);
};
diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp
index 0db015c8d6..4985d3f78d 100644
--- a/engines/tsage/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld_scenes10.cpp
@@ -37,12 +37,10 @@ Scene2::Scene2() {
}
void Object9350::postInit(SceneObjectList *OwnerList) {
- warning("Object9350::postInit - Weird cast to be verified");
- SceneObject::postInit((SceneObjectList*) &_globals->_sceneManager._sceneChangeListeners);
+ _globals->_sceneManager.postInit(&_globals->_sceneManager._altSceneObjects);
}
void Object9350::draw() {
- warning("Scene9350::Object1::draw - TODO");
reposition();
Rect destRect = _bounds;
destRect.translate(-_globals->_sceneOffset.x, -_globals->_sceneOffset.y);
diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp
index a630a9486c..a39f5d84b3 100644
--- a/engines/tsage/ringworld_scenes6.cpp
+++ b/engines/tsage/ringworld_scenes6.cpp
@@ -1727,4 +1727,447 @@ void Scene5200::dispatch() {
}
}
+/*--------------------------------------------------------------------------
+ * Scene 5300 - Caverns - Pit
+ *
+ *--------------------------------------------------------------------------*/
+
+void Scene5300::Action1::signal() {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(3);
+ break;
+ case 1:
+ scene->_hotspot2._numFrames = 4;
+ scene->_hotspot2.animate(ANIM_MODE_8, 1, NULL);
+ setDelay(120);
+ break;
+ case 2:
+ scene->_hotspot2.animate(ANIM_MODE_NONE, NULL);
+
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.setStrip2(-1);
+ _globals->_player.setObjectWrapper(new SceneObjectWrapper());
+ ADD_MOVER(_globals->_player, 85, 170);
+ break;
+ case 3:
+ scene->_hotspot2.setPriority2(-1);
+ _globals->_player.checkAngle(&scene->_hotspot2);
+ setAction(&scene->_sequenceManager, this, 5305, &scene->_hotspot2, NULL);
+ break;
+ case 4:
+ scene->_stripManager.start(5316, this);
+ break;
+ case 5:
+ if (!_globals->getFlag(106) || !_globals->getFlag(107) || (_globals->_inventory._stasisBox._sceneNumber != 1)) {
+ _globals->_player.enableControl();
+ remove();
+ } else {
+ _globals->getFlag(60);
+
+ if (_globals->getFlag(67)) {
+ scene->_sceneMode = 5310;
+ scene->setAction(&scene->_sequenceManager, scene, 5310, &_globals->_player, &scene->_hotspot2, NULL);
+ } else {
+ scene->_sceneMode = 5347;
+ scene->setAction(&scene->_sequenceManager, scene, 5347, NULL);
+ }
+ }
+ break;
+ }
+}
+
+void Scene5300::Action2::signal() {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(60);
+ break;
+ case 1:
+ _globals->setFlag(60);
+ scene->_stripManager.start(5328, this);
+ break;
+ case 2:
+ if (_globals->_inventory._stasisBox._sceneNumber == 1) {
+ _globals->_stripNum = 5303;
+ setDelay(5);
+ } else {
+ _globals->_stripNum = 5302;
+ scene->_stripManager.start(5329, this);
+ }
+ break;
+ case 3:
+ _globals->_sceneManager.changeScene(5100);
+ remove();
+ break;
+ }
+}
+
+void Scene5300::Action3::signal() {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ _globals->_player.disableControl();
+ setDelay(30);
+ break;
+ case 1:
+ scene->_stripManager.start(_globals->_stripNum, this);
+ break;
+ case 2:
+ _globals->_player.enableControl();
+ remove();
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+void Scene5300::Hotspot1::doAction(int action) {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 24);
+ break;
+ case CURSOR_TALK:
+ _globals->_stripNum = 5312;
+ scene->setAction(&scene->_action3);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot2::doAction(int action) {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 23);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(106)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5302;
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
+ } else {
+ SceneItem::display2(5300, _globals->getFlag(107) ? 25 : 20);
+ }
+ break;
+ case CURSOR_TALK:
+ if (!_globals->getFlag(106)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5302;
+ scene->setAction(&scene->_sequenceManager, scene, 5302, &_globals->_player, NULL);
+ } else if (!_globals->getFlag(107)) {
+ SceneItem::display2(5300, 11);
+ } else {
+ _globals->_player.disableControl();
+
+ if (_globals->_inventory._stasisBox._sceneNumber != 1) {
+ scene->setAction(&scene->_sequenceManager, scene, 5316, NULL);
+ } else {
+ _globals->setFlag(60);
+ scene->_sceneMode = _globals->getFlag(67) ? 5315 : 5347;
+ scene->setAction(&scene->_sequenceManager, scene, 5315, this);
+ }
+ }
+ break;
+ case OBJECT_SCANNER:
+ SceneItem::display2(5300, _globals->getFlag(107) ? 10 : 9);
+ break;
+ case OBJECT_MEDKIT:
+ if (_globals->getFlag(106))
+ SceneItem::display2(5300, 7);
+ else {
+ _globals->setFlag(106);
+ _globals->_player.disableControl();
+
+ scene->_sceneMode = 5303;
+ scene->setAction(&scene->_sequenceManager, scene, 5303, &_globals->_player, NULL);
+ }
+ break;
+ case OBJECT_VIAL:
+ if (_globals->getFlag(107)) {
+ SceneItem::display2(5300, 8);
+ } else {
+ _globals->_inventory._vial._sceneNumber = 5300;
+ _globals->setFlag(107);
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5304;
+
+ scene->setAction(&scene->_sequenceManager, scene, 5304, &_globals->_player, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot5::doAction(int action) {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, 27);
+ break;
+ case CURSOR_USE:
+ _globals->_inventory._bone._sceneNumber = 1;
+ _globals->_player.disableControl();
+
+ scene->_sceneMode = 5309;
+ scene->setAction(&scene->_sequenceManager, scene, 5309, &_globals->_player, this, NULL);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot6::doAction(int action) {
+ Scene5300 *scene = (Scene5300 *)_globals->_sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_LOOK:
+ if (!_globals->getFlag(105) || (_globals->_inventory._vial._sceneNumber == 1))
+ SceneItem::display2(5300, 4);
+ else
+ SceneItem::display2(5300, 26);
+ break;
+ case CURSOR_USE:
+ if (!_globals->getFlag(105) || (_globals->_inventory._vial._sceneNumber != 5100)) {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5301;
+ scene->setAction(&scene->_sequenceManager, scene, 5301, &_globals->_player, NULL);
+ } else {
+ _globals->_player.disableControl();
+ scene->_sceneMode = 5307;
+ _globals->_inventory._vial._sceneNumber = 1;
+
+ scene->setAction(&scene->_sequenceManager, scene, 5307, &scene->_hotspot1, &_globals->_player,
+ &scene->_hotspot4, NULL);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot7::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ if (_globals->getFlag(63))
+ SceneItem::display2(5300, 2);
+ else {
+ _globals->setFlag(63);
+ SceneItem::display2(5300, 0);
+ SceneItem::display2(5300, 1);
+ }
+ break;
+ case CURSOR_USE:
+ if (_globals->getFlag(64))
+ SceneItem::display2(5300, 15);
+ else {
+ _globals->setFlag(64);
+ SceneItem::display2(5300, 14);
+ }
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+void Scene5300::Hotspot8::doAction(int action) {
+ switch (action) {
+ case CURSOR_LOOK:
+ SceneItem::display2(5300, _globals->getFlag(65) ? 6 : 5);
+ break;
+ case CURSOR_USE:
+ SceneItem::display2(5300, 18);
+ break;
+ default:
+ SceneHotspot::doAction(action);
+ break;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+Scene5300::Scene5300():
+ _hotspot3(0, CURSOR_LOOK, 5300, 3, CURSOR_USE, 5300, 16, LIST_END) {
+}
+
+void Scene5300::postInit(SceneObjectList *OwnerList) {
+ Scene::postInit();
+ loadScene(5300);
+ setZoomPercents(0, 100, 199, 100);
+
+ _stripManager.addSpeaker(&_speakerQR);
+ _stripManager.addSpeaker(&_speakerQL);
+ _stripManager.addSpeaker(&_speakerBatR);
+ _stripManager.addSpeaker(&_speakerSR);
+ _stripManager.addSpeaker(&_speakerSL);
+ _stripManager.addSpeaker(&_speakerQText);
+ _stripManager.addSpeaker(&_speakerBatText);
+ _stripManager.addSpeaker(&_speakerSText);
+ _stripManager.addSpeaker(&_speakerGameText);
+
+ if (_globals->getFlag(106) && _globals->getFlag(107)) {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(2806);
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot2.setPosition(Common::Point(63, 170));
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ } else {
+ _hotspot2.postInit();
+ _hotspot2.setVisage(5310);
+ _hotspot2.setPosition(Common::Point(63, 170));
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+ _hotspot2.setPriority2(98);
+ }
+
+ _hotspot1.postInit();
+ _hotspot1.setVisage(5362);
+ _hotspot1.setStrip2(3);
+ _hotspot1.setFrame2(5);
+ _hotspot1.setPosition(Common::Point(76, 48));
+
+ _hotspot4.postInit();
+ _hotspot4.setVisage(5316);
+ _hotspot4.setStrip(2);
+ _hotspot4.setPosition(Common::Point(89, 65));
+ _hotspot4.animate(ANIM_MODE_2, NULL);
+ _hotspot4.flag100();
+
+ if (_globals->getFlag(67)) {
+ _globals->_player.postInit();
+ _globals->_player.setVisage(5316);
+ _globals->_player.setPosition(Common::Point(191, 27));
+ _globals->_player.disableControl();
+
+ if (_globals->getFlag(107) && _globals->getFlag(106)) {
+ _hotspot2.postInit();
+ _hotspot2.setObjectWrapper(new SceneObjectWrapper());
+ _hotspot2.animate(ANIM_MODE_1, NULL);
+
+ setAction(&_action2);
+ } else {
+ _globals->_player.setVisage(5315);
+ _globals->_player.setPosition(Common::Point(204, 86));
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.setStrip2(1);
+ _globals->_player._moveDiff.y = 12;
+
+ _sceneMode = 5308;
+ setAction(&_sequenceManager, this, 5308, &_globals->_player, NULL);
+ }
+ } else {
+ _hotspot3.postInit();
+ _hotspot3.setVisage(5301);
+ _hotspot3.setPosition(Common::Point(172, 32));
+ _hotspot3.setPriority2(1);
+ _hotspot3.animate(ANIM_MODE_NONE, NULL);
+
+ _globals->_player.postInit();
+ _globals->_player.setVisage(5315);
+ _globals->_player.setPosition(Common::Point(204, 86));
+ _globals->_player.animate(ANIM_MODE_2, NULL);
+ _globals->_player.setStrip2(1);
+ _globals->_player._moveDiff.y = 12;
+ _globals->_player.disableControl();
+
+ _sceneMode = 5306;
+ setAction(&_sequenceManager, this, 5306, &_globals->_player, &_hotspot3, NULL);
+ }
+
+ _field1B0A = 1;
+ if (_globals->_inventory._bone._sceneNumber == 5300) {
+ _hotspot5.postInit();
+ _hotspot5.setVisage(5301);
+ _hotspot5.setStrip(2);
+ _hotspot5.setPosition(Common::Point(190, 147));
+ _globals->_sceneItems.push_back(&_hotspot5);
+ }
+
+ _hotspot6.setBounds(Rect(74, 51, 114, 69));
+ _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+ _hotspot8._sceneRegionId = 8;
+
+ _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL);
+ _globals->_soundHandler.startSound(212);
+}
+
+void Scene5300::signal() {
+ switch (_sceneMode) {
+ case 5301:
+ _globals->_stripNum = 5300;
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ case 5302:
+ case 5308:
+ case 5316:
+ case 5347:
+ _globals->_player.setStrip2(-1);
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+ break;
+ case 5303:
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+
+ if (_globals->getFlag(107))
+ setAction(&_action1);
+ else
+ SceneItem::display2(5300, 28);
+ break;
+ case 5304:
+ _globals->_player.animate(ANIM_MODE_1, NULL);
+ _globals->_player.enableControl();
+
+ if (_globals->getFlag(106))
+ setAction(&_action1);
+ else
+ SceneItem::display2(5300, 28);
+ break;
+ case 5306:
+ _globals->clearFlag(67);
+ _globals->_player.setStrip2(-1);
+
+ if ((_globals->_inventory._vial._sceneNumber == 1) || (_globals->_inventory._vial._sceneNumber == 5300))
+ _stripManager.start(5303, this);
+ else
+ _stripManager.start(5302, this);
+ _sceneMode = 5302;
+ break;
+ case 5307:
+ _soundHandler.proc1(NULL);
+ break;
+ case 5309:
+ _hotspot5.remove();
+ _globals->_player.enableControl();
+ break;
+ case 5310:
+ _hotspot2.setPriority2(41);
+ _sceneMode = 5315;
+
+ setAction(&_sequenceManager, this, 5315, &_hotspot2, NULL);
+ break;
+ case 5315:
+ _globals->_stripNum = 5315;
+ _globals->_sceneManager.changeScene(5100);
+ break;
+ }
+}
+
+
} // End of namespace tSage
diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld_scenes6.h
index f9d519f4ce..9ab446f712 100644
--- a/engines/tsage/ringworld_scenes6.h
+++ b/engines/tsage/ringworld_scenes6.h
@@ -253,6 +253,80 @@ public:
virtual void dispatch();
};
+class Scene5300: public Scene {
+ /* Actions */
+ class Action1: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action2: public Action {
+ public:
+ virtual void signal();
+ };
+ class Action3: public Action {
+ public:
+ virtual void signal();
+ };
+
+ /* Hotspots */
+ class Hotspot1: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot2: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot5: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot6: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot7: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+ class Hotspot8: public SceneObject {
+ public:
+ virtual void doAction(int action);
+ };
+public:
+ SoundHandler _soundHandler;
+ SequenceManager _sequenceManager;
+ SpeakerQR _speakerQR;
+ SpeakerQL _speakerQL;
+ SpeakerQText _speakerQText;
+ SpeakerBatR _speakerBatR;
+ SpeakerBatText _speakerBatText;
+ SpeakerSR _speakerSR;
+ SpeakerSL _speakerSL;
+ SpeakerSText _speakerSText;
+ SpeakerGameText _speakerGameText;
+ Action1 _action1;
+ Action2 _action2;
+ Action3 _action3;
+ Hotspot1 _hotspot1;
+ Hotspot2 _hotspot2;
+ DisplayHotspot _hotspot3;
+ SceneObject _hotspot4;
+ Hotspot5 _hotspot5;
+ Hotspot6 _hotspot6;
+ Hotspot7 _hotspot7;
+ Hotspot8 _hotspot8;
+ int _field1B0A;
+
+ Scene5300();
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void synchronise(Serialiser &s) {
+ Scene::synchronise(s);
+ s.syncAsSint16LE(_field1B0A);
+ }
+};
+
} // End of namespace tSage
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index de5fe1e5cb..ad6d1f9620 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -54,7 +54,7 @@ void SceneManager::checkScene() {
_nextSceneNumber = -1;
}
- _globals->_sceneListeners.forEach(SceneHandler::handleListener);
+ _globals->_sceneListeners.forEach(SceneHandler::dispatchObject);
}
void SceneManager::sceneChange() {
@@ -70,8 +70,13 @@ void SceneManager::sceneChange() {
sceneObj->removeObject();
}
- // Clear the scene change listeners
- _globals->_sceneManager._sceneChangeListeners.clear();
+ // Clear the secondary scene object list
+ io = _globals->_sceneManager._altSceneObjects.begin();
+ while (io != _globals->_sceneManager._altSceneObjects.end()) {
+ SceneObject *sceneObj = *io;
+ ++io;
+ sceneObj->removeObject();
+ }
// Clear the hotspot list
List<SceneItem *>::iterator ii = _globals->_sceneItems.begin();
@@ -204,7 +209,7 @@ void SceneManager::setBgOffset(const Common::Point &pt, int loadCount) {
void SceneManager::listenerSynchronise(Serialiser &s) {
s.validate("SceneManager");
- _sceneChangeListeners.synchronise(s);
+ _altSceneObjects.synchronise(s);
s.syncAsSint32LE(_sceneNumber);
if (s.isLoading()) {
@@ -398,12 +403,36 @@ void Scene::refreshBackground(int xAmount, int yAmount) {
}
if (changedFlag) {
- signalListeners();
+ drawAltObjects();
}
}
-void Scene::signalListeners() {
- // TODO: Figure out method
+void Scene::drawAltObjects() {
+ Common::Array<SceneObject *> objList;
+
+ // Initial loop to set the priority for entries in the list
+ for (List<SceneObject *>::iterator i = _globals->_sceneManager._altSceneObjects.begin();
+ i != _globals->_sceneManager._altSceneObjects.end(); ++i) {
+ SceneObject *obj = *i;
+ objList.push_back(obj);
+
+ // Handle updating object priority
+ if (!(obj->_flags & OBJFLAG_FIXED_PRIORITY)) {
+ obj->_priority = MIN((int)obj->_position.y - 1,
+ (int)_globals->_sceneManager._scene->_backgroundBounds.bottom);
+ }
+ }
+
+ // Sort the list by priority
+ _globals->_sceneManager._altSceneObjects.sortList(objList);
+
+ // Drawing loop
+ for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) {
+ SceneObject *obj = objList[objIndex];
+
+ obj->reposition();
+ obj->draw();
+ }
}
void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent) {
diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h
index 85e7c7251e..9d969c906b 100644
--- a/engines/tsage/scenes.h
+++ b/engines/tsage/scenes.h
@@ -36,7 +36,7 @@ namespace tSage {
class Scene: public StripCallback {
private:
- void signalListeners();
+ void drawAltObjects();
public:
int _field12;
int _sceneNumber;
@@ -87,7 +87,7 @@ public:
Common::Point _sceneBgOffset;
int _sceneLoadCount;
Rect _scrollerRect;
- List<EventHandler *> _sceneChangeListeners;
+ SceneObjectList _altSceneObjects;
public:
SceneManager();
virtual ~SceneManager();