From 69a2c72c47558dfd54762d2361b0fc2c5e680317 Mon Sep 17 00:00:00 2001 From: Strangerke Date: Fri, 20 Jan 2012 19:03:12 +0100 Subject: TSAGE: R2R - Implement scene 1800 --- engines/tsage/ringworld2/ringworld2_logic.cpp | 2 + engines/tsage/ringworld2/ringworld2_scenes1.cpp | 524 ++++++++++++++++++++++++ engines/tsage/ringworld2/ringworld2_scenes1.h | 53 +++ 3 files changed, 579 insertions(+) diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 15d2331cba..ff694a69fd 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -129,7 +129,9 @@ Scene *Ringworld2Game::createScene(int sceneNumber) { case 1700: return new Scene1700(); case 1750: + error("Missing scene %d from group 1", sceneNumber); case 1800: + return new Scene1800(); case 1850: case 1875: case 1900: diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index 9a0a34a93e..2fa7f50cb4 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -5640,5 +5640,529 @@ void Scene1700::signal() { } } +/*-------------------------------------------------------------------------- + * Scene 1800 - + * + *--------------------------------------------------------------------------*/ +Scene1800::Scene1800() { + _field412 = 0; +} + +void Scene1800::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_field412); +} + +bool Scene1800::Hotspot5::startAction(CursorType action, Event &event) { + if ((action != R2_9) && (action != R2_39)) + return false; + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS._v565F6 == 1201) { + scene->_stripManager.start(548, this); + } else if (R2_GLOBALS.getFlag(66)) { + return false; + } else { + scene->_stripManager.start(546, this); + } + } else { + if (R2_GLOBALS._v565F6 == 1201) { + scene->_stripManager.start(549, this); + } else if (R2_GLOBALS.getFlag(66)) { + return false; + } else { + scene->_stripManager.start(547, this); + } + } + + R2_GLOBALS.setFlag(66); + return true; +} + +bool Scene1800::Actor6::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + if (!R2_GLOBALS.getFlag(14)) + return false; + + if (R2_GLOBALS._player._characterIndex != R2_QUINN) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + R2_GLOBALS._player.disableControl(); + + if (_frame == 1) { + R2_GLOBALS.setFlag(64); + scene->_sceneMode = 1810; + scene->setAction(&scene->_sequenceManager, scene, 1810, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL); + } else { + R2_GLOBALS.clearFlag(64); + scene->_sceneMode = 1811; + scene->setAction(&scene->_sequenceManager, scene, 1811, &R2_GLOBALS._player, &scene->_actor6, &scene->_actor4, &scene->_actor5, NULL); + } + return true; +} + +bool Scene1800::Actor7::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + if (R2_GLOBALS._player._characterIndex == R2_SEEKER) { + R2_GLOBALS._player.disableControl(); + if (scene->_field412 >= 2) { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 1809; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1808; + scene->setAction(&scene->_sequenceManager, scene, 1808, &R2_GLOBALS._player, &scene->_actor7, NULL); + R2_GLOBALS.setFlag(14); + } + } else { + scene->_sceneMode = 1813; + scene->setAction(&scene->_sequenceManager, scene, 1813, &R2_GLOBALS._player, NULL); + } + } else if (R2_GLOBALS.getFlag(14)) { + return SceneActor::startAction(action, event); + } else { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 1812; + scene->setAction(&scene->_sequenceManager, scene, 1812, &R2_GLOBALS._player, NULL); + } + + return true; +} + +bool Scene1800::Actor8::startAction(CursorType action, Event &event) { + if (action != CURSOR_USE) + return SceneActor::startAction(action, event); + + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + if (_position.x < 160) { + if (scene->_actor4._frame == 1) { + return SceneActor::startAction(action, event); + } else { + R2_GLOBALS.setFlag(29); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 1804; + scene->setAction(&scene->_sequenceManager, scene, 1804, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL); + } else { + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1805; + scene->setAction(&scene->_sequenceManager, scene, 1805, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor8, NULL); + } + } + } + } else { + if (scene->_actor4._frame == 1) { + return SceneActor::startAction(action, event); + } else { + R2_GLOBALS.clearFlag(29); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1806; + scene->setAction(&scene->_sequenceManager, scene, 1806, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1807; + scene->setAction(&scene->_sequenceManager, scene, 1807, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor9, NULL); + } + } + } + } + + return true; +} + +void Scene1800::Exit1::changeScene() { + Scene1800 *scene = (Scene1800 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS.getFlag(14)) { + scene->_sceneMode = 3; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->setAction(&scene->_sequenceManager, scene, 1809, &R2_GLOBALS._player, &scene->_actor7, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1809, &scene->_actor2, &scene->_actor7, NULL); + R2_GLOBALS.clearFlag(14); + } else { + scene->_sceneMode = 1802; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 1802, &R2_GLOBALS._player, &scene->_actor2, NULL); + } +} + +void Scene1800::postInit(SceneObjectList *OwnerList) { + loadScene(1800); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(116); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS._v565F6 = 1201; + + if (R2_GLOBALS._v565F6 == 1201) + _field412 = 2; + else + _field412 = 0; + + scalePalette(65, 65, 65); + _exit1.setDetails(Rect(0, 160, 319, 168), EXITCURSOR_S, 1800); + _item5.setDetails(Rect(0, 0, 320, 200), -1, -1, -1, -1, 1, NULL); + + _actor6.postInit(); + _actor6.setup(1801, 4, 1); + _actor6.setPosition(Common::Point(170, 24)); + _actor6.setDetails(1800, 13, 14, 15, 1, (SceneItem *) NULL); + + _actor7.postInit(); + _actor7.setup(1801, 3, 1); + _actor7.setPosition(Common::Point(160, 139)); + _actor7.setDetails(1800, 6, -1, -1, 1, (SceneItem *) NULL); + + _actor8.postInit(); + _actor8.setup(1800, 1, 1); + _actor8.setPosition(Common::Point(110, 78)); + _actor8.fixPriority(135); + _actor8.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); + + _actor9.postInit(); + _actor9.setup(1800, 2, 1); + _actor9.setPosition(Common::Point(209, 78)); + _actor9.fixPriority(135); + _actor9.setDetails(1800, 20, -1, -1, 1, (SceneItem *) NULL); + + _actor4.postInit(); + if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64))) + _actor4.setup(1801, 2, 1); + else + _actor4.setup(1801, 2, 10); + _actor4.setPosition(Common::Point(76, 142)); + _actor4.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); + + _actor5.postInit(); + if ((_field412 != 1) && (_field412 != 3) && (!R2_GLOBALS.getFlag(64))) + _actor5.setup(1801, 1, 1); + else + _actor5.setup(1801, 1, 10); + _actor5.setPosition(Common::Point(243, 142)); + _actor5.setDetails(1800, 3, -1, -1, 1, (SceneItem *) NULL); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + R2_GLOBALS._player.animate(ANIM_MODE_NONE, NULL); + R2_GLOBALS._player.setObjectWrapper(NULL); + R2_GLOBALS._player.setup(1801, 5, 12); + R2_GLOBALS._player.setPosition(Common::Point(160, 139)); + R2_GLOBALS._walkRegions.enableRegion(9); + _actor7.hide(); + } else { + R2_GLOBALS._player.setVisage(1507); + } + R2_GLOBALS._player._moveDiff = Common::Point(4, 2); + } else { + R2_GLOBALS._player.setVisage(1503); + R2_GLOBALS._player._moveDiff = Common::Point(2, 2); + } + + _actor2.postInit(); + _actor2.animate(ANIM_MODE_1, NULL); + _actor2.setObjectWrapper(new SceneObjectWrapper()); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(14)) { + _actor2.animate(ANIM_MODE_NONE, NULL); + _actor2.setObjectWrapper(NULL); + _actor2.setup(1801, 5, 12); + + R2_GLOBALS._walkRegions.enableRegion(9); + _actor7.hide(); + } else { + _actor2.setup(1507, 1, 1); + _actor2.setPosition(Common::Point(180, 160)); + } + _actor2.setDetails(9002, 0, 4, 3, 1, (SceneItem *) NULL); + _actor2._moveDiff = Common::Point(4, 2); + } else { + _actor2.setDetails(9001, 0, 5, 3, 1, (SceneItem *) NULL); + _actor2.setVisage(1503); + _actor2._moveDiff = Common::Point(2, 2); + } + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setPosition(Common::Point(114, 150)); + R2_GLOBALS._player.setStrip(5); + if (R2_GLOBALS.getFlag(14)) { + _actor2.setPosition(Common::Point(160, 139)); + R2_GLOBALS._walkRegions.enableRegion(8); + } else { + _actor2.setPosition(Common::Point(209, 150)); + _actor2.setStrip(6); + R2_GLOBALS._walkRegions.enableRegion(8); + } + } else { + if (R2_GLOBALS.getFlag(14)) { + R2_GLOBALS._player.setup(1801, 5, 12); + R2_GLOBALS._player.setPosition(Common::Point(160, 139)); + } else { + R2_GLOBALS._player.setPosition(Common::Point(209, 150)); + R2_GLOBALS._player.setStrip(6); + } + _actor2.setPosition(Common::Point(114, 150)); + _actor2.setStrip(5); + R2_GLOBALS._walkRegions.enableRegion(10); + R2_GLOBALS._walkRegions.enableRegion(11); + } + } else { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + R2_GLOBALS._player.setPosition(Common::Point(140, 160)); + _actor2.setPosition(Common::Point(180, 160)); + } else { + R2_GLOBALS._player.setPosition(Common::Point(180, 160)); + _actor2.setPosition(Common::Point(140, 160)); + } + } + + _actor1.postInit(); + _actor1.fixPriority(10); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _actor1.setVisage(1111); + else + _actor1.setVisage(1110); + + _actor1._effect = 5; + _actor1._field9C = _field312; + + R2_GLOBALS._player._linkedActor = &_actor1; + + _actor3.postInit(); + _actor3.fixPriority(10); + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + _actor3.setVisage(1110); + else + _actor3.setVisage(1111); + + _actor3._effect = 5; + _actor3._field9C = _field312; + + _actor2._linkedActor = &_actor3; + + R2_GLOBALS._player._characterScene[1] = 1800; + R2_GLOBALS._player._characterScene[2] = 1800; + + _item2.setDetails(Rect(128, 95, 190, 135), 1800, 10, -1, -1, 1, NULL); + _item1.setDetails(Rect(95, 3, 223, 135), 1800, 0, -1, -1, 1, NULL); + + // Original was calling _item3.setDetails(Rect(1800, 11, 24, 23), 25, -1, -1, -1, 1, NULL); + // This is *wrong*. The following statement is a wild guess based on good common sense + _item3.setDetails(11, 1800, 23, 24, 25); + _item4.setDetails(Rect(0, 0, 320, 200), 1800, 17, -1, 19, 1, NULL); + + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1800) { + if ((R2_GLOBALS.getFlag(14)) && (R2_GLOBALS._player._characterIndex == R2_SEEKER)) { + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } else { + R2_GLOBALS._player.enableControl(CURSOR_ARROW); + } + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1850) { + if (R2_GLOBALS.getFlag(29)) { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1814; + setAction(&_sequenceManager, this, 1814, &R2_GLOBALS._player, &_actor2, &_actor8, NULL); + } else { + _sceneMode = 1815; + setAction(&_sequenceManager, this, 1815, &R2_GLOBALS._player, &_actor2, &_actor8, NULL); + } + } else { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1816; + setAction(&_sequenceManager, this, 1816, &R2_GLOBALS._player, &_actor2, &_actor9, NULL); + } else { + _sceneMode = 1817; + setAction(&_sequenceManager, this, 1817, &R2_GLOBALS._player, &_actor2, &_actor9, NULL); + } + } + } else { + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1800; + setAction(&_sequenceManager, this, 1800, &R2_GLOBALS._player, &_actor2, NULL); + } else { + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &R2_GLOBALS._player, &_actor2, NULL); + } + } + + R2_GLOBALS._player._oldCharacterScene[1] = 1800; + R2_GLOBALS._player._oldCharacterScene[2] = 1800; +} + +void Scene1800::signal() { + switch (_sceneMode) { + case 1: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1804; + setAction(&_sequenceManager, this, 1804, &R2_GLOBALS._player, &_actor2, &_actor8, NULL); + } else { + _sceneMode = 1805; + setAction(&_sequenceManager, this, 1805, &R2_GLOBALS._player, &_actor2, &_actor8, NULL); + } + break; + case 2: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + _sceneMode = 1806; + setAction(&_sequenceManager, this, 1806, &R2_GLOBALS._player, &_actor2, &_actor9, NULL); + } else { + _sceneMode = 1807; + setAction(&_sequenceManager, this, 1807, &R2_GLOBALS._player, &_actor2, &_actor9, NULL); + } + break; + case 3: + _sceneMode = 1802; + if (R2_GLOBALS._player._characterIndex == R2_QUINN) + setAction(&_sequenceManager, this, 1802, &R2_GLOBALS._player, &_actor2, NULL); + else + setAction(&_sequenceManager, this, 1803, &R2_GLOBALS._player, &_actor2, NULL); + break; + case 10: + // No break on purpose + case 11: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + break; + case 12: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + R2_GLOBALS._player._canWalk = false; + break; + case 13: + _sceneMode = 14; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + R2_GLOBALS._player.setup(1801, 7, 1); + R2_GLOBALS._player.animate(ANIM_MODE_8, NULL); + _stripManager.start(550, this); + break; + case 14: + _sceneMode = 15; + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.setup(1801, 6, 1); + R2_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 15: + R2_GLOBALS._player.setup(1503, 4, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.enableControl(CURSOR_USE); + break; + case 1800: + R2_GLOBALS._walkRegions.enableRegion(8); + if (R2_GLOBALS.getFlag(63)) + R2_GLOBALS._player.enableControl(CURSOR_USE); + else { + _sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(544, this); + } + break; + case 1801: + R2_GLOBALS._walkRegions.enableRegion(10); + R2_GLOBALS._walkRegions.enableRegion(11); + R2_GLOBALS.setFlag(63); + + // The following check is completely dumb. + // Either an original bug, or dead code. + if (R2_GLOBALS.getFlag(63)) { + R2_GLOBALS._player.enableControl(CURSOR_ARROW); + } else { + _sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(545, this); + } + break; + case 1802: + R2_GLOBALS.clearFlag(14); + R2_GLOBALS._sceneManager.changeScene(1700); + break; + case 1804: + // No break on purpose + case 1805: + // No break on purpose + case 1806: + // No break on purpose + case 1807: + R2_GLOBALS.clearFlag(14); + R2_GLOBALS._sceneManager.changeScene(1850); + break; + case 1808: + _sceneMode = 12; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(553, this); + break; + case 1812: + _sceneMode = 13; + R2_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 1814: + // No break on purpose + case 1815: + R2_GLOBALS._walkRegions.enableRegion(10); + R2_GLOBALS._walkRegions.enableRegion(11); + R2_GLOBALS._player.enableControl(); + break; + case 1816: + // No break on purpose + case 1817: + R2_GLOBALS._walkRegions.enableRegion(8); + R2_GLOBALS._player.enableControl(); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene1800::saveCharacter(int characterIndex) { + if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) + R2_GLOBALS._sound1.fadeOut2(NULL); + + SceneExt::saveCharacter(characterIndex); +} + } // End of namespace Ringworld2 } // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.h b/engines/tsage/ringworld2/ringworld2_scenes1.h index cfd701b2d5..08d35edf06 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.h +++ b/engines/tsage/ringworld2/ringworld2_scenes1.h @@ -581,6 +581,59 @@ public: virtual void remove(); virtual void signal(); }; + +class Scene1800 : public SceneExt { + class Hotspot5 : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Actor6 : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Actor7 : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Actor8 : public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + int _field412; + SpeakerQuinn _quinnSpeaker; + SpeakerSeeker _seekerSpeaker; + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + NamedHotspot _item4; + Hotspot5 _item5; + SceneActor _actor1; + SceneActor _actor2; + SceneActor _actor3; + SceneActor _actor4; + SceneActor _actor5; + Actor6 _actor6; + Actor7 _actor7; + Actor8 _actor8; + Actor8 _actor9; + Exit1 _exit1; + SequenceManager _sequenceManager; + + Scene1800(); + void synchronize(Serializer &s); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void saveCharacter(int characterIndex); +}; + } // End of namespace Ringworld2 } // End of namespace TsAGE -- cgit v1.2.3