aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp2
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.cpp383
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes2.h41
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.cpp124
-rw-r--r--engines/tsage/ringworld2/ringworld2_speakers.h24
5 files changed, 574 insertions, 0 deletions
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index 201b44eeef..3854a37384 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -162,6 +162,8 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Forest Maze
return new Scene2750();
case 2800:
+ // Exiting Forest
+ return new Scene2800();
case 2900:
error("Missing scene %d from group 2", sceneNumber);
/* Scene group #3 */
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
index 107d7bad04..a61ff6ac9a 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp
@@ -4162,5 +4162,388 @@ void Scene2750::process(Event &event) {
Scene::process(event);
}
+/*--------------------------------------------------------------------------
+ * Scene 2800 - Exiting forest
+ *
+ *--------------------------------------------------------------------------*/
+Scene2800::Scene2800(): SceneExt() {
+ _field412 = 0;
+}
+
+void Scene2800::synchronize(Serializer &s) {
+ SceneExt::synchronize(s);
+
+ s.syncAsSint16LE(_field412);
+}
+
+bool Scene2800::Item2::startAction(CursorType action, Event &event) {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == CURSOR_USE) && (R2_GLOBALS.getFlag(47))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 2805;
+ scene->setAction(&scene->_sequenceManager, scene, 2805, &R2_GLOBALS._player, NULL);
+ return true;
+ } else
+ return SceneHotspot::startAction(action, event);
+}
+
+bool Scene2800::Actor1::startAction(CursorType action, Event &event) {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_TALK) {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ R2_GLOBALS.setFlag(47);
+ scene->_field412 = 1205;
+ scene->_sceneMode = 2803;
+ scene->_stripManager.start(scene->_field412, scene);
+ return true;
+ } else if (action == R2_7) {
+ R2_GLOBALS._events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS.setFlag(47);
+ scene->_sceneMode = 10;
+ scene->setAction(&scene->_sequenceManager, scene, 2802, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor1, NULL);
+ return true;
+ } else
+ return SceneActor::startAction(action, event);
+}
+
+void Scene2800::Action1::signal() {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ if (R2_GLOBALS._player._position.x <= 320) {
+ setDelay(120);
+ Common::Point pt(330, 25);
+ NpcMover *mover = new NpcMover();
+ scene->_object1.addMover(mover, &pt, NULL);
+ } else {
+ setDelay(1800 + R2_GLOBALS._randomSource.getRandomNumber(600));
+ scene->_object1.setPosition(Common::Point(-10, 45));
+ }
+}
+
+void Scene2800::Action2::signal() {
+ Scene2800 *scene = (Scene2800 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (_actionIndex++) {
+ case 0:
+ setDelay(240);
+ R2_GLOBALS._sound1.changeSound(240);
+ R2_GLOBALS._sound2.stop();
+ break;
+ case 1:
+ scene->_object2.postInit();
+ scene->_object2.setVisage(2800);
+ scene->_object2.setStrip(1);
+ scene->_object2._numFrames = 8;
+ scene->_object2._moveRate = 8;
+ scene->_object2.changeZoom(100);
+ scene->_object2.setPosition(Common::Point(1, 1));
+ scene->_object2.show();
+ scene->_object2.animate(ANIM_MODE_5, this);
+ break;
+ case 2:
+ R2_GLOBALS._sound2.play(130);
+ scene->_object2.setVisage(2800);
+ scene->_object2.setStrip(7);
+
+ scene->_object3.postInit();
+ scene->_object3.setVisage(2800);
+ scene->_object3.setStrip(3);
+ scene->_object3._numFrames = 8;
+ scene->_object3._moveRate = 8;
+ scene->_object3.changeZoom(100);
+ scene->_object3.setPosition(Common::Point(300, 104));
+ scene->_object3.show();
+ scene->_object3.animate(ANIM_MODE_5, this);
+ break;
+ case 3:
+ R2_GLOBALS._sound1.play(241);
+ scene->_object4.postInit();
+ scene->_object4.setVisage(2800);
+ scene->_object4.setStrip(2);
+ scene->_object4._numFrames = 4;
+ scene->_object4._moveRate = 4;
+ scene->_object4.changeZoom(100);
+ scene->_object4.setPosition(Common::Point(300, 104));
+ scene->_object4.fixPriority(105);
+ scene->_object4.show();
+ scene->_object4.animate(ANIM_MODE_5, this);
+ break;
+ case 4:
+ setDelay(18);
+ scene->_object4.setStrip(4);
+ scene->_actor1.setVisage(2800);
+ scene->_actor1.setStrip(5);
+ scene->_actor1.setFrame(1);
+ scene->_actor1._numFrames = 5;
+ scene->_actor1._moveRate = 5;
+ scene->_actor1.setPosition(Common::Point(300, 104));
+ scene->_actor1.fixPriority(110);
+ scene->_actor1.changeZoom(100);
+ scene->_actor1.show();
+ break;
+ case 5:
+ scene->_actor1.animate(ANIM_MODE_5, this);
+ break;
+ case 6: {
+ scene->_actor1.changeZoom(-1);
+ scene->_actor1.setVisage(3107);
+ scene->_actor1.animate(ANIM_MODE_1, NULL);
+ scene->_actor1.setStrip(3);
+ scene->_actor1.setPosition(Common::Point(297, 140));
+ scene->_actor1._numFrames = 10;
+ scene->_actor1._moveRate = 10;
+ scene->_actor1._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(297, 160);
+ NpcMover *mover = new NpcMover();
+ scene->_actor1.addMover(mover, &pt, this);
+ break;
+ }
+ case 7: {
+ scene->_actor1.changeZoom(75);
+ scene->_actor1.updateAngle(R2_GLOBALS._player._position);
+
+ Common::Point pt(105, 82);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 8: {
+ R2_GLOBALS._player._numFrames = 8;
+ R2_GLOBALS._player._moveRate = 8;
+ R2_GLOBALS._player.animate(ANIM_MODE_2, NULL);
+ R2_GLOBALS._player.setObjectWrapper(NULL);
+ R2_GLOBALS._player.setStrip(2);
+ R2_GLOBALS._player.changeZoom(-1);
+
+ Common::Point pt(79, 100);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 9: {
+ R2_GLOBALS._player._numFrames = 10;
+ R2_GLOBALS._player._moveRate = 10;
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper());
+
+ Common::Point pt(100, 64);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 10: {
+ R2_GLOBALS._player.fixPriority(124);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(160, 124);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 11: {
+ R2_GLOBALS._player.fixPriority(-1);
+
+ Common::Point pt(160, 160);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 12: {
+ Common::Point pt(270, 160);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 13:
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ scene->_field412 = 1207;
+ scene->_stripManager.start(scene->_field412, this);
+ break;
+ case 14: {
+ R2_GLOBALS._player.disableControl();
+ R2_GLOBALS._player.fixPriority(110);
+
+ Common::Point pt(288, 140);
+ PlayerMover *mover = new PlayerMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ case 15:
+ setDelay(18);
+ scene->_actor1.updateAngle(R2_GLOBALS._player._position);
+ R2_GLOBALS._player.setVisage(2800);
+ R2_GLOBALS._player.setStrip(6);
+ R2_GLOBALS._player.setFrame(1);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player.setPosition(Common::Point(300, 104));
+ R2_GLOBALS._player._numFrames = 5;
+ R2_GLOBALS._player._moveRate = 5;
+ break;
+ case 16:
+ R2_GLOBALS._player.animate(ANIM_MODE_5, this);
+ break;
+ case 17:
+ setDelay(6);
+ scene->_object4.setStrip(2);
+ scene->_object4.setFrame(11);
+ R2_GLOBALS._player.hide();
+ // No break on purpose
+ case 18:
+ R2_GLOBALS._sound1.play(241);
+ scene->_object4.animate(ANIM_MODE_6, this);
+ break;
+ case 19:
+ scene->_object4.remove();
+ scene->_object3.animate(ANIM_MODE_6, this);
+ break;
+ case 20:
+ setDelay(6);
+ scene->_object3.remove();
+ scene->_object2.setStrip(1);
+ scene->_object2.setFrame(19);
+ break;
+ case 21:
+ setDelay(150);
+ R2_GLOBALS._sound1.play(269);
+ R2_GLOBALS._sound2.stop();
+ break;
+ case 22:
+ scene->_sceneMode = 12;
+ scene->_object2.animate(ANIM_MODE_6, scene);
+ break;
+ default:
+ break;
+ }
+}
+
+void Scene2800::postInit(SceneObjectList *OwnerList) {
+ loadScene(2800);
+ setZoomPercents(100, 50, 124, 75);
+ R2_GLOBALS._sound1.stop();
+ R2_GLOBALS._sound2.stop();
+ SceneExt::postInit();
+
+ _object1.postInit();
+ _object1.setup(2750, 4, 1);
+ _object1.setPosition(Common::Point(-10, 25));
+ _object1.animate(ANIM_MODE_1, NULL);
+ _object1.setStrip2(4);
+ _object1._moveRate = 20;
+ _object1.setAction(&_action1);
+
+ _actor3.postInit();
+ _actor3.setup(2802, 1, 1);
+ _actor3.setPosition(Common::Point(116, 80));
+ _actor3.fixPriority(111);
+ _actor3.animate(ANIM_MODE_2, NULL);
+ _actor3._numFrames = 6;
+
+ if (!R2_GLOBALS.getFlag(47)) {
+ _actor1.postInit();
+ _actor1.setVisage(3105);
+ _actor1.setStrip(3);
+ _actor1.setFrame(1);
+ _actor1.setZoom(50);
+ _actor1._moveDiff = Common::Point(2, 1);
+ _actor1.setPosition(Common::Point(122, 82));
+ _actor1.animate(ANIM_MODE_NONE, NULL);
+ _actor1.setDetails(2800, -1, -1, -1, 1, NULL);
+ }
+
+ _item1.setDetails(Rect(0, 0, 320, 200), 2800, -1, -1, -1, 1, NULL);
+
+ _stripManager.setColors(60, 255);
+ _stripManager.setFontNumber(3);
+ _stripManager.addSpeaker(&_quinnSpeaker);
+ _stripManager.addSpeaker(&_nejSpeaker);
+ _stripManager.addSpeaker(&_guardSpeaker);
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._sound1.fadeSound(237);
+ if (R2_GLOBALS.getFlag(47)) {
+ _item2.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
+ } else {
+ _actor2.postInit();
+ _actor2.setup(2752, 5, 1);
+ _actor2.animate(ANIM_MODE_NONE, NULL);
+ _actor2.changeZoom(100);
+ _actor2._moveDiff = Common::Point(2, 1);
+ _actor2.setPosition(Common::Point(101, 148));
+ }
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.setVisage(19);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.changeZoom(100);
+ R2_GLOBALS._player._moveDiff = Common::Point(2, 2);
+ R2_GLOBALS._player.disableControl();
+
+ if (R2_INVENTORY.getObjectScene(36) == 0) {
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2800, &R2_GLOBALS._player, NULL);
+ } else if (R2_GLOBALS.getFlag(47)) {
+ R2_GLOBALS._player.setVisage(3110);
+ R2_GLOBALS._player.changeZoom(-1);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.setPosition(Common::Point(160, 124));
+ R2_GLOBALS._player.enableControl();
+ } else {
+ _sceneMode = 2801;
+ R2_GLOBALS._player.setAction(&_sequenceManager, this, 2801, &R2_GLOBALS._player, &_actor2, &_actor1, NULL);
+ }
+}
+
+void Scene2800::signal() {
+ switch (_sceneMode) {
+ case 10:
+ R2_GLOBALS._sound1.play(238);
+ R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS);
+ _field412 = 1206;
+ _sceneMode = 2804;
+ _stripManager.start(_field412, this);
+ break;
+ case 11:
+ _actor2.remove();
+ _object1.setAction(NULL);
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ _item2.setDetails(Rect(76, 45, 155, 90), 2800, 3, -1, -1, 2, NULL);
+ break;
+ case 12:
+ R2_GLOBALS._sound1.fadeOut2(NULL);
+ R2_GLOBALS._sound2.fadeOut2(NULL);
+ g_globals->_sceneManager.changeScene(1000);
+ break;
+ case 2800:
+ g_globals->_sceneManager.changeScene(2750);
+ break;
+ case 2801:
+ R2_GLOBALS._player.enableControl(CURSOR_ARROW);
+ R2_GLOBALS._player._canWalk = false;
+ break;
+ case 2803:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 10;
+ setAction(&_sequenceManager, this, 2803, &R2_GLOBALS._player, &_actor2, &_actor1, NULL);
+ break;
+ case 2804:
+ R2_GLOBALS._player.disableControl();
+ _sceneMode = 11;
+ setAction(&_sequenceManager, this, 2804, &R2_GLOBALS._player, &_actor2, NULL);
+ break;
+ case 2805:
+ _object1.remove();
+ setAction(&_action2);
+ break;
+ default:
+ break;
+ }
+}
+
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h
index 9b2a8685fc..2097465a48 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes2.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes2.h
@@ -624,6 +624,47 @@ public:
virtual void process(Event &event);
};
+class Scene2800 : public SceneExt {
+ class Item2 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Actor1 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Action1: public Action {
+ public:
+ void signal();
+ };
+ class Action2: public Action {
+ public:
+ void signal();
+ };
+public:
+ SpeakerQuinn2800 _quinnSpeaker;
+ SpeakerNej2800 _nejSpeaker;
+ SpeakerGuard2800 _guardSpeaker;
+ NamedHotspot _item1;
+ Item2 _item2;
+ Actor1 _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ SceneObject _object1;
+ Action1 _action1;
+ Action2 _action2;
+ SceneObject _object2;
+ SceneObject _object3;
+ SceneObject _object4;
+ SequenceManager _sequenceManager;
+ int _field412;
+
+ Scene2800();
+ virtual void synchronize(Serializer &s);
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+};
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp
index 7a3871f9ac..35de45d8e6 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.cpp
+++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp
@@ -915,5 +915,129 @@ void SpeakerNej2750::proc15() {
_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 SpeakerNej2800::proc15() {
+ int v = _fieldF6;
+ Scene2750 *scene = (Scene2750 *)R2_GLOBALS._sceneManager._scene;
+
+ 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 {
+ ((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.animate(ANIM_MODE_5, this);
+ }
+}
+
+SpeakerGuard2800::SpeakerGuard2800() {
+ _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) {
+ _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.setZoom(75);
+ _object1.setup(4060, 3, 1);
+ _object1.animate(ANIM_MODE_5, this);
+ }
+}
} // End of namespace Ringworld2
} // End of namespace TsAGE
diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h
index 115ad580ce..31eda2431c 100644
--- a/engines/tsage/ringworld2/ringworld2_speakers.h
+++ b/engines/tsage/ringworld2/ringworld2_speakers.h
@@ -237,6 +237,30 @@ public:
virtual Common::String getClassName() { return "SpeakerNej2750"; }
virtual void proc15();
};
+
+class SpeakerQuinn2800 : public VisualSpeaker {
+public:
+ SpeakerQuinn2800();
+
+ virtual Common::String getClassName() { return "SpeakerQuinn2800"; }
+ virtual void proc15();
+};
+
+class SpeakerNej2800 : public VisualSpeaker {
+public:
+ SpeakerNej2800();
+
+ virtual Common::String getClassName() { return "SpeakerNej2800"; }
+ virtual void proc15();
+};
+
+class SpeakerGuard2800 : public VisualSpeaker {
+public:
+ SpeakerGuard2800();
+
+ virtual Common::String getClassName() { return "SpeakerGuard2800"; }
+ virtual void proc15();
+};
} // End of namespace Ringworld2
} // End of namespace TsAGE