aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStrangerke2011-12-20 23:56:26 +0100
committerStrangerke2011-12-20 23:56:26 +0100
commit62f4bb6ac1c8910381ef5579f718b692e93b9770 (patch)
tree66a2e6db635bcbb656fd399372785b6ae86f5b7a
parent341a2d68742d4c7dce9229c1da4c8e6b13e2087c (diff)
downloadscummvm-rg350-62f4bb6ac1c8910381ef5579f718b692e93b9770.tar.gz
scummvm-rg350-62f4bb6ac1c8910381ef5579f718b692e93b9770.tar.bz2
scummvm-rg350-62f4bb6ac1c8910381ef5579f718b692e93b9770.zip
TSAGE: R2R - Implement scene 3150
-rw-r--r--engines/tsage/globals.cpp3
-rw-r--r--engines/tsage/globals.h1
-rw-r--r--engines/tsage/ringworld2/ringworld2_logic.cpp2
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.cpp422
-rw-r--r--engines/tsage/ringworld2/ringworld2_scenes3.h54
5 files changed, 481 insertions, 1 deletions
diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp
index 1d0e37d071..da40485617 100644
--- a/engines/tsage/globals.cpp
+++ b/engines/tsage/globals.cpp
@@ -386,6 +386,7 @@ void Ringworld2Globals::reset() {
_v565AE = 0;
for (int i = 0; i < 14; i++)
_v56605[i] = 0;
+ _v56AA0 = 0;
_v57C2C = 0;
_v58CE2 = 0;
Common::fill(&_v565F1[0], &_v565F1[MAX_CHARACTERS], 0);
@@ -426,7 +427,7 @@ void Ringworld2Globals::synchronize(Serializer &s) {
s.syncAsSint16LE(_v565F1[i]);
s.syncAsByte(_v565AE);
-
+ s.syncAsByte(_v56AA0);
for (i = 0; i < 14; ++i)
s.syncAsByte(_v56605[i]);
diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h
index 9048899953..7e40276fcf 100644
--- a/engines/tsage/globals.h
+++ b/engines/tsage/globals.h
@@ -252,6 +252,7 @@ public:
int _v5657C;
byte _v565AE;
byte _v56605[14];
+ byte _v56AA0;
int _v57C2C;
int _v58CE2;
int _speechSubtitles;
diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp
index e5a3919c05..0248a3c32d 100644
--- a/engines/tsage/ringworld2/ringworld2_logic.cpp
+++ b/engines/tsage/ringworld2/ringworld2_logic.cpp
@@ -178,6 +178,8 @@ Scene *Ringworld2Game::createScene(int sceneNumber) {
// Ghouls dormitory
return new Scene3125();
case 3150:
+ // Jail
+ return new Scene3150();
case 3175:
case 3200:
case 3210:
diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
index 488fda5d59..2c2530f833 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp
@@ -371,5 +371,427 @@ void Scene3125::dispatch() {
Scene::dispatch();
}
+/*--------------------------------------------------------------------------
+ * Scene 3150 - Jail
+ *
+ *--------------------------------------------------------------------------*/
+bool Scene3150::Item5::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_INVENTORY.getObjectScene(47) != 3150)
+ return SceneHotspot::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3154;
+ scene->setAction(&scene->_sequenceManager, scene, 3154, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ return true;
+ case R2_40:
+ if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_GLOBALS.getFlag(75))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_actor3.postInit();
+ scene->_actor3._effect = 3;
+ scene->_actor3._shade = 5;
+ scene->_sceneMode = 3155;
+ scene->setAction(&scene->_sequenceManager, scene, 3155, &R2_GLOBALS._player, &scene->_actor3, NULL);
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ return true;
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Item6::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case R2_41:
+ R2_GLOBALS._player.disableControl();
+ scene->_actor4.postInit();
+ scene->_actor4._effect = 6;
+ scene->_actor4._shade = 3;
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3158;
+ scene->setAction(&scene->_sequenceManager, scene, 3158, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ return true;
+ case R2_42:
+ if ((R2_INVENTORY.getObjectScene(47) != 3150) && (R2_INVENTORY.getObjectScene(40) == 3150) && (R2_GLOBALS.getFlag(75))) {
+ scene->_actor5.postInit();
+ scene->_actor5._effect = 6;
+ scene->_actor5._shade = 3;
+ scene->_actor5.setDetails(3150, 30, -1, -1, 2, NULL);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3159;
+ scene->setAction(&scene->_sequenceManager, scene, 3159, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ default:
+ return SceneHotspot::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Actor4::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ switch (action) {
+ case CURSOR_USE:
+ if (R2_GLOBALS.getFlag(75))
+ return SceneActor::startAction(action, event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3151;
+ scene->setAction(&scene->_sequenceManager, scene, 3151, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ return true;
+ case R2_42:
+ return false;
+ default:
+ return SceneActor::startAction(action, event);
+ break;
+ }
+}
+
+bool Scene3150::Actor5::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action != CURSOR_USE) || (R2_GLOBALS.getFlag(77)))
+ return SceneActor::startAction(action ,event);
+
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3157;
+ scene->setAction(&scene->_sequenceManager, scene, 3157, &R2_GLOBALS._player, &scene->_actor5, NULL);
+ return true;
+}
+
+bool Scene3150::Actor6::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if (action == CURSOR_USE) {
+ if (R2_GLOBALS.getFlag(75)) {
+ if (R2_GLOBALS.getFlag(77)) {
+ R2_GLOBALS._player.disableControl();
+ if (R2_GLOBALS.getFlag(76)) {
+ scene->_sceneMode = 3152;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
+ } else {
+ scene->_sceneMode = 3153;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, &scene->_actor4, NULL);
+ }
+ } else {
+ SceneItem::display(3150, 42, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999);
+ }
+ } else {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3152;
+ scene->setAction(&scene->_sequenceManager, scene, 3152, &R2_GLOBALS._player, NULL);
+ }
+ return true;
+ } else {
+ return SceneActor::startAction(action, event);
+ }
+}
+
+bool Scene3150::Actor7::startAction(CursorType action, Event &event) {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ if ((action == R2_43) && (!R2_GLOBALS.getFlag(80))) {
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 3160;
+ scene->setAction(&scene->_sequenceManager, scene, 3160, &R2_GLOBALS._player, &scene->_actor7, NULL);
+ return true;
+ }
+
+ return SceneActor::startAction(action, event);
+}
+
+void Scene3150::Exit1::changeScene() {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 11;
+
+ Common::Point pt(-20, 180);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, scene);
+}
+
+void Scene3150::Exit2::changeScene() {
+ Scene3150 *scene = (Scene3150 *)R2_GLOBALS._sceneManager._scene;
+
+ _enabled = false;
+ g_globals->_events.setCursor(CURSOR_ARROW);
+ R2_GLOBALS._player.disableControl();
+ scene->_sceneMode = 12;
+
+ scene->setAction(&scene->_sequenceManager, scene, 3163, &R2_GLOBALS._player, NULL);
+}
+
+void Scene3150::postInit(SceneObjectList *OwnerList) {
+ loadScene(3150);
+ if (R2_GLOBALS._sceneManager._previousScene == -1) {
+ R2_INVENTORY.setObjectScene(35, 2000);
+ R2_GLOBALS._player._oldCharacterScene[1] = 3100;
+ R2_GLOBALS._player._oldCharacterScene[3] = 0;
+ R2_GLOBALS._player._characterIndex = R2_MIRANDA;
+ }
+ SceneExt::postInit();
+
+ if (R2_GLOBALS.getFlag(78)) {
+ _exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
+ _exit1.setDest(Common::Point(70, 125));
+ }
+
+ if (R2_GLOBALS.getFlag(80)) {
+ _exit2.setDetails(Rect(249, 36, 279, 60), EXITCURSOR_NE, 3150);
+ _exit2.setDest(Common::Point(241, 106));
+ }
+
+ R2_GLOBALS._player.postInit();
+ R2_GLOBALS._player.disableControl();
+
+ _actor2.postInit();
+ _actor2.setPosition(Common::Point(64, 139));
+ if (R2_GLOBALS.getFlag(78)) {
+ _actor2.setup(3151, 1, 5);
+ _actor2.fixPriority(125);
+ } else {
+ _actor2.setup(3151, 1, 1);
+ _actor2.setDetails(3150, 8, -1, 9, 1, NULL);
+ }
+
+ if (R2_GLOBALS.getFlag(78)) {
+ _actor1.postInit();
+ _actor1.setup(3154, 1, 16);
+ _actor1.setPosition(Common::Point(104, 129));
+ _actor1._effect = 6;
+ _actor1._shade = 3;
+ _actor1.setDetails(3150, 24, -1, -1, -1, NULL);
+ }
+
+ _actor7.postInit();
+ _actor7.setup(3154, 5, 1);
+ if (R2_GLOBALS.getFlag(80))
+ _actor7.setPosition(Common::Point(264, 108));
+ else
+ _actor7.setPosition(Common::Point(264, 58));
+ _actor7.fixPriority(50);
+ _actor7.setDetails(3150, 17, -1, 19, 1, NULL);
+
+ if (R2_INVENTORY.getObjectScene(41) == 3150) {
+ _actor4.postInit();
+ if (R2_GLOBALS.getFlag(75)) {
+ if (R2_GLOBALS.getFlag(76)) {
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ _actor4.setup(3152, 4, 10);
+ _actor4.setDetails(3150, 14, -1, -1, 1, NULL);
+ } else {
+ _actor4.setup(3152, 7, 4);
+ _actor4.setDetails(3150, 13, -1, -1, 1, NULL);
+ }
+ _actor4.fixPriority(110);
+ _actor4.setPosition(Common::Point(83, 88));
+ _actor4._effect = 6;
+ _actor4._shade = 3;
+ } else {
+ _actor4.setup(3152, 7, 3);
+ _actor4.setPosition(Common::Point(143, 70));
+ _actor4.setDetails(3150, 15, -1, -1, 1, NULL);
+ }
+ }
+
+ if (R2_INVENTORY.getObjectScene(47) == 3150) {
+ _actor3.postInit();
+ _actor3.setup(3152, 7, 1);
+ _actor3.setPosition(Common::Point(73, 83));
+ }
+
+ if (R2_INVENTORY.getObjectScene(40) == 3150) {
+ _actor3.postInit();
+ _actor3.setup(3152, 7, 3);
+ _actor3.setPosition(Common::Point(70, 55));
+ _actor3.fixPriority(111);
+ _actor3._effect = 6;
+ _actor3._shade = 5;
+ }
+
+ if (R2_INVENTORY.getObjectScene(42) == 3150) {
+ _actor5.postInit();
+ if (R2_GLOBALS.getFlag(77)) {
+ _actor5.setup(3152, 7, 8);
+ _actor5.setPosition(Common::Point(82, 92));
+ _actor5.fixPriority(111);
+ _actor5._effect = 6;
+ _actor5._shade = 3;
+ } else {
+ _actor5.setup(3152, 7, 7);
+ _actor5.setPosition(Common::Point(155, 79));
+ }
+ _actor5.setDetails(3150, 30, -1, -1, 2, NULL);
+ }
+
+ _actor6.postInit();
+ _actor6.setup(3152, 7, 6);
+ _actor6.setPosition(Common::Point(98, 73));
+ _actor6.setDetails(3150, 43, -1, -1, 1, NULL);
+
+ _item2.setDetails(12, 3150, 10, -1, 12);
+ _item3.setDetails(Rect(186, 17, 210, 36), 3150, 6, -1, -1, 1, NULL);
+ _item4.setDetails(Rect(61, 21, 92, 41), 3150, 7, -1, -1, 1, NULL);
+ _item5.setDetails(Rect(63, 48, 78, 58), 3150, 6, -1, -1, 1, NULL);
+ _item6.setDetails(Rect(63, 81, 100, 95), 3150, 3, 4, -1, 1, NULL);
+ _item1.setDetails(Rect(0, 0, 200, 320), 3150, 0, 1, 2, 1, NULL);
+
+ switch (R2_GLOBALS._player._oldCharacterScene[3]) {
+ case 0:
+ _sceneMode = 3150;
+ _actor1.postInit();
+ _actor1._effect = 6;
+ _actor1._shade = 5;
+ setAction(&_sequenceManager, this, 3150, &R2_GLOBALS._player, &_actor1, &_actor2, NULL);
+ break;
+ case 1200:
+ _sceneMode = 3162;
+ setAction(&_sequenceManager, this, 3162, &R2_GLOBALS._player, NULL);
+ break;
+ case 3275: {
+ _sceneMode = 10;
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(-20, 180));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+
+ Common::Point pt(80, 125);
+ NpcMover *mover = new NpcMover();
+ R2_GLOBALS._player.addMover(mover, &pt, this);
+ break;
+ }
+ default:
+ if ((R2_GLOBALS._v56AA0 == 1) && (R2_INVENTORY.getObjectScene(35) == 2000) && (R2_GLOBALS._player._oldCharacterScene[1] == 3100)) {
+ ++R2_GLOBALS._v56AA0;
+ _sceneMode = 3156;
+ _actor1.postInit();
+ _actor1._effect = 6;
+ _actor1._shade = 3;
+
+ _actor2.postInit();
+ _actor5.postInit();
+ _actor5._effect = 6;
+ _actor5._shade = 3;
+
+ setAction(&_sequenceManager, this, 3156, &R2_GLOBALS._player, &_actor1, &_actor2, &_actor5, NULL);
+ } else {
+ if (R2_GLOBALS._v56AA0 != 2)
+ ++R2_GLOBALS._v56AA0;
+
+ R2_GLOBALS._player.setup(30, 3, 1);
+ R2_GLOBALS._player.animate(ANIM_MODE_1, NULL);
+ R2_GLOBALS._player.setPosition(Common::Point(155, 120));
+ R2_GLOBALS._player._moveDiff = Common::Point(3, 2);
+ R2_GLOBALS._player.enableControl();
+ }
+ }
+
+ R2_GLOBALS._player._oldCharacterScene[3] = 3150;
+}
+
+void Scene3150::signal() {
+ switch (_sceneMode) {
+ case 11:
+ R2_GLOBALS._sceneManager.changeScene(3275);
+ break;
+ case 12:
+ R2_GLOBALS._sceneManager.changeScene(1200);
+ break;
+ case 3151:
+ _actor1.remove();
+ R2_INVENTORY.setObjectScene(41, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3153:
+ R2_GLOBALS.setFlag(76);
+ _actor4.setDetails(3150, 14, -1, -1, 3, NULL);
+ _actor1.postInit();
+ _actor1.setDetails(3150, 24, -1, -1, 2, NULL);
+ _sceneMode = 3161;
+ setAction(&_sequenceManager, this, 3161, &_actor1, &_actor2, NULL);
+ break;
+ case 3154:
+ _actor3.remove();
+ R2_INVENTORY.setObjectScene(47, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3155:
+ R2_INVENTORY.setObjectScene(40, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3156:
+ _actor5.setDetails(3150, 30, -1, -1, 2, NULL);
+ R2_INVENTORY.setObjectScene(42, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3157:
+ _actor5.remove();
+ R2_INVENTORY.setObjectScene(42, 3);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3158:
+ R2_GLOBALS.setFlag(75);
+ R2_INVENTORY.setObjectScene(41, 3150);
+ _actor4.fixPriority(110);
+ _actor4.setDetails(3150, 13, -1, -1, 2, NULL);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3159:
+ R2_GLOBALS.setFlag(77);
+ R2_INVENTORY.setObjectScene(42, 3150);
+ R2_GLOBALS._player.enableControl();
+ break;
+ case 3160:
+ R2_INVENTORY.setObjectScene(52, 3150);
+ R2_GLOBALS.setFlag(80);
+ R2_GLOBALS._sceneManager.changeScene(1200);
+ break;
+ case 3161:
+ R2_GLOBALS._sceneItems.remove(&_actor2);
+ _exit1.setDetails(Rect(0, 135, 60, 168), EXITCURSOR_SW, 3275);
+ _exit1.setDest(Common::Point(70, 125));
+ R2_GLOBALS._walkRegions.enableRegion(1);
+ R2_GLOBALS._walkRegions.enableRegion(4);
+ R2_GLOBALS._walkRegions.enableRegion(5);
+ R2_GLOBALS._walkRegions.enableRegion(6);
+ R2_GLOBALS.setFlag(78);
+ R2_GLOBALS._player.enableControl();
+ break;
+ default:
+ R2_GLOBALS._player.enableControl();
+ break;
+ }
+}
+
+void Scene3150::dispatch() {
+ if (_actor5._position.x == 155) {
+ _actor5._effect = 0;
+ _actor5._shade = 0;
+ }
+
+ if (_actor1._visage == 3154) {
+ _actor1._effect = 0;
+ _actor1._shade = 0;
+ }
+
+ Scene::dispatch();
+}
+
} // 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 b135ddc0a3..cdbf4359b0 100644
--- a/engines/tsage/ringworld2/ringworld2_scenes3.h
+++ b/engines/tsage/ringworld2/ringworld2_scenes3.h
@@ -105,6 +105,60 @@ public:
virtual void dispatch();
virtual void synchronize(Serializer &s);
};
+
+class Scene3150 : public SceneExt {
+ class Item5 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Item6 : public NamedHotspot {
+ public:
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor4 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor5 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor6 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+ class Actor7 : public SceneActor {
+ virtual bool startAction(CursorType action, Event &event);
+ };
+
+ class Exit1 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+ class Exit2 : public SceneExit {
+ public:
+ virtual void changeScene();
+ };
+public:
+
+ NamedHotspot _item1;
+ NamedHotspot _item2;
+ NamedHotspot _item3;
+ NamedHotspot _item4;
+ Item5 _item5;
+ Item6 _item6;
+ SceneActor _actor1;
+ SceneActor _actor2;
+ SceneActor _actor3;
+ Actor4 _actor4;
+ Actor5 _actor5;
+ Actor6 _actor6;
+ Actor7 _actor7;
+ Exit1 _exit1;
+ Exit2 _exit2;
+ SequenceManager _sequenceManager;
+
+ virtual void postInit(SceneObjectList *OwnerList = NULL);
+ virtual void signal();
+ virtual void dispatch();
+};
} // End of namespace Ringworld2
} // End of namespace TsAGE