diff options
-rw-r--r-- | engines/tsage/blue_force/blueforce_logic.cpp | 3 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes8.cpp | 401 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes8.h | 48 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes9.cpp | 2 |
4 files changed, 451 insertions, 3 deletions
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index ffc8f0ef62..39d0bbaeb7 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -211,7 +211,8 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Cove Beach return new Scene870(); case 880: - error("Scene group 8 not implemented"); + // Beach Path + return new Scene880(); case 900: // Outside Warehouse return new Scene900(); diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp index e3ef55a102..e527e20fa1 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.cpp +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -3182,7 +3182,406 @@ void Scene870::dispatch() { BF_GLOBALS._player.disableControl(); _sceneMode = 8701; - setAction(&_sequenceManager, this, 701, &BF_GLOBALS._player, NULL); + setAction(&_sequenceManager, this, 8701, &BF_GLOBALS._player, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 880 - Beach Path + * + *--------------------------------------------------------------------------*/ + +void Scene880::Action1::signal() { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + _actionIndex = 1 + BF_GLOBALS._randomSource.getRandomNumber(1); + setDelay(BF_GLOBALS._randomSource.getRandomNumber(90)); + break; + case 1: + _actionIndex = 0; + scene->_sequenceManager2._onCallback = SequenceManager_callbackProc; + setAction(&scene->_sequenceManager2, this, 8811, &scene->_object4, NULL); + break; + case 2: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 8814, &scene->_object4, NULL); + break; + default: + break; + } +} + +void Scene880::Action1::SequenceManager_callbackProc(int v1, int v2) { + int idx = BF_GLOBALS._randomSource.getRandomNumber(2); + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (idx) { + case 0: + scene->_object5.show(); + break; + case 1: + scene->_object6.show(); + break; + case 2: + scene->_object7.show(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene880::Object4::startAction(CursorType action, Event &event) { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!scene->_seqNumber) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8815; + scene->setAction(&scene->_sequenceManager1, scene, scene->_seqNumber, &BF_GLOBALS._player, NULL); + return true; + case CURSOR_TALK: + if (scene->_sceneMode != 2) + break; + + scene->_stripManager.start(8800, &BF_GLOBALS._stripProxy); + return true; + case INV_COLT45: + if (scene->_sceneMode != 2) + break; + + scene->gunDisplay(); + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene880::NorthExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(40, 113); + return true; +} + +bool Scene880::SouthEastExit::startAction(CursorType action, Event &event) { + Scene880 *scene = (Scene880 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_sceneMode == 2) + return false; + else { + ADD_PLAYER_MOVER(300, 158); + return true; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene880::Scene880(): SceneExt() { + _seqNumber = 0; +} + +void Scene880::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_seqNumber); +} + +void Scene880::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(880); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 5; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1358); + BF_GLOBALS._player._moveDiff = Common::Point(3, 2); + BF_GLOBALS._player.disableControl(); + + _northExit.setDetails(Rect(25, 99, 54, 127), 880, -1, -1, -1, 1, NULL); + _seExit.setDetails(Rect(279, 150, 320, 167), 880, -1, -1, -1, 1, NULL); + + if (BF_GLOBALS._dayNumber == 5) { + BF_GLOBALS._sound1.changeSound(107); + _object1.postInit(); + _object1.hide(); + + if ((BF_GLOBALS._bookmark != bFinishedWGreen) && (BF_GLOBALS._bookmark >= bInvestigateBoat) && + BF_GLOBALS.getFlag(fTookTrailerAmmo)) { + BF_GLOBALS.setFlag(fLyleOnIsland); + } + + _object2.postInit(); + _object2.setVisage(880); + _object2.setPosition(Common::Point(209, 76)); + _object2.setDetails(880, 4, 5, 6, 1, NULL); + + _object4.postInit(); + _object4.setVisage(875); + _object4.setDetails(880, 7, -1, 9, 1, NULL); + + _object5.postInit(); + _object5.setVisage(874); + _object5.setStrip(2); + _object5.setFrame(2); + _object5.fixPriority(118); + _object5.setPosition(Common::Point(55, 117)); + _object5.hide(); + + _object6.postInit(); + _object6.setVisage(874); + _object6.setStrip(3); + _object6.setFrame(2); + _object6.fixPriority(118); + _object6.setPosition(Common::Point(60, 109)); + _object6.hide(); + + _object7.postInit(); + _object7.setVisage(874); + _object7.setStrip(4); + _object7.setFrame(2); + _object7.fixPriority(118); + _object7.setPosition(Common::Point(57, 100)); + _object7.hide(); + + if (BF_GLOBALS.getFlag(fShootGoon)) { + _object4.setStrip(6); + _object4.setFrame2(_object4.getFrameCount()); + _object4.fixPriority(160); + _object4.setPosition(Common::Point(255, 148)); + + _seqNumber = 8816; + } else if (BF_GLOBALS.getFlag(fBlowUpGoon)) { + _object4.setStrip(7); + _object4.setFrame2(_object4.getFrameCount()); + _object4.fixPriority(130); + _object4.setPosition(Common::Point(255, 148)); + + _seqNumber = 8815; + } else { + _object4.setStrip(2); + _object4.setPosition(Common::Point(258, 147)); + + _object3.postInit(); + _object3.setVisage(871); + _object3.setStrip(4); + _object3.hide(); + + _seqNumber = 0; + } + } else if (BF_GLOBALS._sceneManager._previousScene != 900) { + BF_GLOBALS._sound1.changeSound(91); + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 900: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8802, &BF_GLOBALS._player, NULL); + break; + default: + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS._dayNumber != 5) { + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL); + } else if ((BF_GLOBALS._bookmark > bFinishedWGreen) || (_seqNumber != 0)) { + _sceneMode = 0; + setAction(&_sequenceManager1, this, 8800, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._bookmark = bFinishedWGreen; + _sceneMode = 8805; + setAction(&_sequenceManager1, this, 8805, &BF_GLOBALS._player, &_object1, &_object4, NULL); + } + break; + } + + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 880, 0, -1, -1, 1, NULL); +} + +void Scene880::signal() { + switch (_sceneMode) { + case 0: + case 2: + BF_GLOBALS._player._moveDiff = Common::Point(3, 2); + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.enableControl(); + break; + case 1: + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3: + BF_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.clearFlag(gunDrawn); + BF_INVENTORY.setObjectScene(INV_GRENADES, 880); + _sceneMode = 0; + signal(); + break; + case 4: + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 0; + signal(); + break; + case 6: + BF_GLOBALS._deathReason = 10; + BF_GLOBALS.clearFlag(gunDrawn); + + if (_object4._action) { + handleAction(_object4._action); + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 1; + setAction(&_sequenceManager1, this, 8806, &BF_GLOBALS._player, &_object4, NULL); + break; + case 7: + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8801; + setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL); + break; + case 8801: + BF_GLOBALS._sceneManager.changeScene(870); + break; + case 8803: + BF_GLOBALS._sceneManager.changeScene(900); + break; + case 8805: + _object4.setAction(&_action1); + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL); + BF_GLOBALS.setFlag(gunDrawn); + break; + case 8815: + if (BF_INVENTORY.getObjectScene(INV_DOG_WHISTLE) == 880) { + BF_INVENTORY.setObjectScene(INV_DOG_WHISTLE, 1); + BF_GLOBALS._uiElements.addScore(30); + + SceneItem::display2(880, 13); + } else { + SceneItem::display2(880, 12); + } + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene880::process(Event &event) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_northExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + BF_GLOBALS._events.setCursor(surface); + } else if (_seExit.contains(event.mousePos) && (_sceneMode != 2)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE); + BF_GLOBALS._events.setCursor(surface); + } else { + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } + + if (event.eventType == EVENT_BUTTON_DOWN) { + switch (BF_GLOBALS._events.getCursor()) { + case INV_COLT45: + if (_sceneMode != 2) { + _sceneMode = 0; + SceneItem::display2(880, 11); + signal(); + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + _sceneMode = 6; + setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 8807, &BF_GLOBALS._player, NULL); + } + + event.handled = true; + break; + case INV_GRENADES: + if (_sceneMode == 2) { + if (event.mousePos.x >= 150) { + BF_GLOBALS.setFlag(fBlowUpGoon); + _seqNumber = 8815; + if (_object4._action) + handleAction(_object4._action); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager1, this, 8809, &BF_GLOBALS._player, &_object3, &_object4, NULL); + } else { + if (_object4._action) + handleAction(_object4._action); + + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._deathReason = 11; + _sceneMode = 1; + setAction(&_sequenceManager1, this, 8810, &BF_GLOBALS._player, &_object3, NULL); + } + event.handled = true; + } + break; + case CURSOR_WALK: + if (_sceneMode == 2) { + event.handled = true; + BF_GLOBALS._player.disableControl(); + + _sceneMode = (event.mousePos.y <= BF_GLOBALS._player._position.y) ? 7 : 6; + setAction(&_sequenceManager1, this, 8812, &BF_GLOBALS._player, NULL); + } + break; + } + } + + SceneExt::process(event); +} + +void Scene880::handleAction(Action *action) { + if (action->_action) + // Work down into sub-actions + handleAction(action->_action); + + if (action->_owner) { + action->_owner->_action = NULL; + action->_owner = NULL; + } +} + +void Scene880::dispatch() { + SceneExt::dispatch(); + + if (!_action) { + if ((BF_GLOBALS._player._position.y <= 123) && (BF_GLOBALS._player._priority != 5)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 8801; + setAction(&_sequenceManager1, this, 8801, &BF_GLOBALS._player, NULL); + } + + if ((BF_GLOBALS._player._position.x >= 275) && (BF_GLOBALS._player._position.y > 155)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 8803; + setAction(&_sequenceManager1, this, 8803, &BF_GLOBALS._player, NULL); + } } } diff --git a/engines/tsage/blue_force/blueforce_scenes8.h b/engines/tsage/blue_force/blueforce_scenes8.h index 188edaee93..aa63002f73 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.h +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -513,6 +513,54 @@ public: void startStrip(int stripNumber); }; +class Scene880: public SceneExt { + /* Actions */ + class Action1: public Action { + private: + static void SequenceManager_callbackProc(int v1, int v2); + public: + virtual void signal(); + }; + + /* Objects */ + class Object4: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class NorthExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SouthEastExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +private: + static void handleAction(Action *action); +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Action1 _action1; + NamedObject _object1, _object2, _object3; + Object4 _object4; + NamedObject _object5, _object6, _object7; + NamedHotspot _background; + NorthExit _northExit; + SouthEastExit _seExit; + int _seqNumber; + + Scene880(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp index a449600b63..47ffb73f6c 100644 --- a/engines/tsage/blue_force/blueforce_scenes9.cpp +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -689,7 +689,7 @@ void Scene900::process(Event &event) { if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { if (_item4.contains(event.mousePos)) { - GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); BF_GLOBALS._events.setCursor(surface); } else { CursorType cursorId = BF_GLOBALS._events.getCursor(); |