diff options
-rw-r--r-- | engines/tsage/blue_force/blueforce_logic.cpp | 4 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_logic.h | 12 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes3.cpp | 414 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes3.h | 61 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_speakers.cpp | 22 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_speakers.h | 8 | ||||
-rw-r--r-- | engines/tsage/core.h | 12 |
7 files changed, 532 insertions, 1 deletions
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 0fbe647a8b..162e0611a6 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -109,11 +109,13 @@ Scene *BlueForceGame::createScene(int sceneNumber) { case 360: case 370: case 380: + error("Scene group 3 not implemented"); case 385: // City Hall return new Scene385(); case 390: - error("Scene group 3 not implemented"); + // City Jail + return new Scene390(); case 410: case 415: case 440: diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h index 96e19d4b8c..21dc417b04 100644 --- a/engines/tsage/blue_force/blueforce_logic.h +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -112,6 +112,18 @@ public: void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum); }; +class NamedObjectExt: public NamedObject { +public: + int _flag; + + NamedObjectExt() { _flag = 0; } + virtual Common::String getClassName() { return "NamedObjectExt"; } + virtual void synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + class CountdownObject: public NamedObject { public: int _countDown; diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp index 6512882218..7b0e4bf57c 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.cpp +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -3144,6 +3144,420 @@ void Scene385::dispatch() { } } +/*-------------------------------------------------------------------------- + * Scene 390 - City Jail + * + *--------------------------------------------------------------------------*/ + +void Scene390::Action1::signal() { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + switch (scene->_sceneMode) { + case 3900: + case 3905: + case 3906: + case 3913: + case 3914: + case 3916: + case 3917: { + ADD_PLAYER_MOVER(75, 122); + break; + } + default: { + ADD_PLAYER_MOVER(147, 133); + break; + } + } + break; + case 2: + switch (scene->_sceneMode) { + case 3900: + case 3905: + case 3906: + case 3913: + case 3914: + case 3916: + case 3917: { + BF_GLOBALS._player.changeAngle(315); + break; + } + default: { + BF_GLOBALS._player.changeAngle(90); + break; + } + } + setDelay(1); + break; + case 3: + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 4: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene390::BookingForms::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_flag) { + SceneItem::display2(390, 16); + } else if (!BF_GLOBALS.getFlag(onDuty)) { + SceneItem::display2(390, 22); + } else if (((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) || + ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1))) { + BF_GLOBALS._player.disableControl(); + ++_flag; + scene->_sceneMode = 3902; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display2(390, 23); + } + return true; + default: + return NamedHotspotExt::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene390::Green::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (!_flag) { + ++_flag; + scene->_sceneMode = 3901; + } else { + scene->_sceneMode = 3902; + } + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readGreenRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(readGreenRights); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3904; + + scene->setAction(&scene->_sequenceManager, scene, 3904, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene390::Object2::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (!_flag) + break; + + if (!BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 3917; + } else if (BF_GLOBALS.getFlag(fTalkedToBarry) && !BF_GLOBALS.getFlag(fTalkedToLarry)) { + scene->_sceneMode = 3913; + } else if (!BF_GLOBALS.getFlag(fTalkedToLarry)) { + scene->_sceneMode = 3914; + } else { + ++_flag; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) { + scene->_sceneMode = 3900; + } else if (!BF_GLOBALS._sceneObjects->contains(&scene->_green)) { + scene->_sceneMode = 3905; + } else if (BF_GLOBALS.getFlag(fCuffedFrankie)) { + scene->_sceneMode = 3906; + } else { + scene->_sceneMode = 3916; + } + } + + BF_GLOBALS.setFlag(fTalkedToLarry); + scene->setAction(&scene->_action1); + return true; + case INV_BOOKING_GREEN: + if (BF_GLOBALS._bookmark >= bLauraToParamedics) + SceneItem::display2(390, 21); + else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._bookmark = bLauraToParamedics; + scene->_sceneMode = 3905; + + BF_INVENTORY.setObjectScene(INV_GREEN_ID, 390); + if (BF_GLOBALS.getFlag(fLeftTraceIn910)) + BF_GLOBALS.clearFlag(fLeftTraceIn910); + + scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL); + BF_GLOBALS.clearFlag(f1015Marina); + BF_GLOBALS.clearFlag(f1027Marina); + BF_GLOBALS.clearFlag(f1035Marina); + } + return true; + case INV_BOOKING_FRANKIE: + case INV_BOOKING_GANG: + if (BF_GLOBALS.getFlag(frankInJail)) { + SceneItem::display2(390, 21); + } else { + scene->_sceneMode = 3905; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL); + + BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 390); + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 390); + BF_GLOBALS.clearFlag(frankInJail); + BF_GLOBALS.clearFlag(f1015Frankie); + BF_GLOBALS.clearFlag(f1027Frankie); + BF_GLOBALS.clearFlag(f1035Frankie); + } + return true; + default: + break; + } + + return NamedObjectExt::startAction(action, event); +} + +bool Scene390::Object3::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case INV_GREEN_ID: + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + BF_INVENTORY.setObjectScene(INV_BOOKING_GREEN, 1); + return true; + case INV_FRANKIE_ID: + BF_INVENTORY.setObjectScene(INV_BOOKING_FRANKIE, 1); + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + return true; + case INV_TYRONE_ID: + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + BF_INVENTORY.setObjectScene(INV_BOOKING_GANG, 1); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::GangMember1::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + scene->_sceneMode = 3908; + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 3904; + scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::GangMember2::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + scene->_sceneMode = 3909; + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 3904; + scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::Door::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GREEN) == 1) && (BF_INVENTORY.getObjectScene(INV_GREEN_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_FRANKIE) == 1) && (BF_INVENTORY.getObjectScene(INV_FRANKIE_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GANG) == 1) && (BF_INVENTORY.getObjectScene(INV_TYRONE_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3900; + scene->setAction(&scene->_sequenceManager, scene, 3900, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) { + BF_GLOBALS._sound1.play(17); + SceneExt::postInit(); + setZoomPercents(105, 85, 130, 100); + loadScene(390); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + _stripManager.addSpeaker(&_jailerSpeaker); + _stripManager.addSpeaker(&_shooterSpeaker); + _stripManager.addSpeaker(&_driverSpeaker); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS.setFlag(onDuty); + BF_GLOBALS._bookmark = bStoppedFrankie; + BF_GLOBALS.clearFlag(frankInJail); + BF_GLOBALS.setFlag(fTalkedToBarry); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(147, 114)); + BF_GLOBALS._player.setStrip(6); + BF_GLOBALS._player.changeZoom(-1); + + _object2.postInit(); + _object2.setVisage(395); + _object2.setStrip(2); + _object2.setPosition(Common::Point(38, 84)); + _object2.fixPriority(50); + _object2._flag = 0; + _object2.setDetails(390, 10, 17, 10, 1, NULL); + + _door.postInit(); + _door.setVisage(390); + _door.setStrip(2); + _door.setPosition(Common::Point(151, 18)); + _door.setDetails(390, 5, -1, -1, 1, NULL); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 3901; + setAction(&_sequenceManager, this, 3901, &BF_GLOBALS._player, NULL); + + if ((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) { + _green.postInit(); + _green.setVisage(392); + _green.setPosition(Common::Point(241, 164)); + _green.fixPriority(153); + _green.setDetails(390, 12, -1, 13, 1, NULL); + _green._flag = 0; + } + + if ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1)) { + _gangMember1.postInit(); + _gangMember1.setVisage(396); + _gangMember1.setPosition(Common::Point(273, 169)); + _gangMember1.fixPriority(152); + _gangMember1._flag = 0; + _gangMember1.setDetails(390, 19, -1, 20, 1, NULL); + + _gangMember2.postInit(); + _gangMember2.setVisage(396); + _gangMember2.setStrip(2); + _gangMember2.setPosition(Common::Point(241, 153)); + _gangMember2.fixPriority(152); + _gangMember2._flag = 0; + _gangMember2.setDetails(390, 19, -1, 20, 1, NULL); + } + + _item1.setDetails(Rect(22, 40, 77, 67), 390, 0, -1, 1, 1, NULL); + _bookingForms.setDetails(Rect(89, 46, 110, 65), 390, 2, -1, -1, 1, NULL); + _item3.setDetails(Rect(193, 0, 320, 165), 390, 4, -1, -1, 1, NULL); + _item4.setDetails(Rect(0, 0, 320, 170), 390, 7, -1, -1, 1, NULL); +} + +void Scene390::signal() { + switch (_sceneMode) { + case 3900: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(385); + break; + case 3901: + case 3904: + if ((BF_INVENTORY.getObjectScene(INV_22_SNUB) == 410) && BF_GLOBALS._sceneObjects->contains(&_gangMember1)) { + _sceneMode = 3906; + setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL); + } else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 370) && BF_GLOBALS._sceneObjects->contains(&_green)) { + _sceneMode = 3906; + setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 3902: + SceneItem::display2(390, 3); + + _object3.postInit(); + _object3.setVisage(390); + _object3.setPosition(Common::Point(250, 60)); + _object3.fixPriority(255); + _object3.setDetails(390, 8, -1, 9, 2, NULL); + break; + case 3903: + SceneItem::display2(390, 18); + break; + case 3905: + BF_GLOBALS._uiElements.addScore(30); + _object2.remove(); + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 1); + break; + case 3906: + BF_GLOBALS._deathReason = 18; + BF_GLOBALS._sceneManager.changeScene(666); + break; + } +} + + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h index a2bc4270af..7825154b25 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.h +++ b/engines/tsage/blue_force/blueforce_scenes3.h @@ -543,6 +543,67 @@ public: virtual void dispatch(); }; +class Scene390: public SceneExt { + /* Items */ + class BookingForms: public NamedHotspotExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Green: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GangMember1: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GangMember2: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerGreen _greenSpeaker; + SpeakerJailer _jailerSpeaker; + SpeakerDriver _driverSpeaker; + SpeakerShooter _shooterSpeaker; + Action1 _action1; + Green _green; + Object2 _object2; + Object3 _object3; + GangMember1 _gangMember1; + GangMember2 _gangMember2; + Door _door; + NamedHotspot _item1, _item3, _item4; + BookingForms _bookingForms; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp index d0cc44d397..ff6b477a91 100644 --- a/engines/tsage/blue_force/blueforce_speakers.cpp +++ b/engines/tsage/blue_force/blueforce_speakers.cpp @@ -288,6 +288,28 @@ void SpeakerJailer::setText(const Common::String &msg) { /*--------------------------------------------------------------------------*/ +SpeakerGreen::SpeakerGreen(): VisualSpeaker() { + _color1 = 96; + _color2 = 99; + _speakerName = "GREEN"; +} + +void SpeakerGreen::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(373); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + SpeakerPSutter::SpeakerPSutter(): VisualSpeaker() { _color1 = 20; _color2 = 22; diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h index dd902a0ebe..d5a38f86c1 100644 --- a/engines/tsage/blue_force/blueforce_speakers.h +++ b/engines/tsage/blue_force/blueforce_speakers.h @@ -116,6 +116,14 @@ public: virtual void setText(const Common::String &msg); }; +class SpeakerGreen: public VisualSpeaker { +public: + SpeakerGreen(); + + virtual Common::String getClassName() { return "SpeakerGreen"; } + virtual void setText(const Common::String &msg); +}; + class SpeakerPSutter: public VisualSpeaker { public: SpeakerPSutter(); diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 851c72cc3e..e722daf838 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -459,6 +459,18 @@ public: virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode); }; +class NamedHotspotExt : public NamedHotspot { +public: + int _flag; + NamedHotspotExt() { _flag = 0; } + + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + enum AnimateMode {ANIM_MODE_NONE = 0, ANIM_MODE_1 = 1, ANIM_MODE_2 = 2, ANIM_MODE_3 = 3, ANIM_MODE_4 = 4, ANIM_MODE_5 = 5, ANIM_MODE_6 = 6, ANIM_MODE_7 = 7, ANIM_MODE_8 = 8, // Introduced in Blue Force |