diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/tsage/blue_force/blueforce_logic.cpp | 2 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes8.cpp | 225 | ||||
-rw-r--r-- | engines/tsage/blue_force/blueforce_scenes8.h | 24 |
3 files changed, 251 insertions, 0 deletions
diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index abc3cda700..71f40ec960 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -205,6 +205,8 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Boat Leaving/Entering Marina return new Scene850(); case 860: + // Boat Entering Cove + return new Scene860(); case 870: case 880: error("Scene group 8 not implemented"); diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp index c97b8689e7..d5bb1108d1 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.cpp +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -2556,6 +2556,231 @@ void Scene850::signal() { } } +/*-------------------------------------------------------------------------- + * Scene 860 - Boat Entering Cove + * + *--------------------------------------------------------------------------*/ + +void Scene860::Action1::signal() { + Scene860 *scene = (Scene860 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_sound1.play(88); + scene->_sound1.holdAt(1); + + if (scene->_field888 == scene->_field886) { + ++_actionIndex; + signal(); + } else { + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.setStrip((scene->_field886 == 1) ? 4 : 5); + scene->_field888 = scene->_field886; + + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player._numFrames = 9; + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + } + break; + case 1: + if (scene->_field886 == 1) { + BF_GLOBALS._player._position.x += 5; + BF_GLOBALS._player.setStrip(3); + } else { + BF_GLOBALS._player._position.x -= 5; + BF_GLOBALS._player.setStrip(2); + } + signal(); + // Deliberate fall-through + case 2: + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_MOVER_NULL(BF_GLOBALS._player, scene->_destPos.x, scene->_destPos.y); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene860::Scene860(): SceneExt() { + _field87E = _field880 = 0; + _destPos.x = _destPos.y = 0; + _field886 = _field888 = 0; + + _swRect = Rect(37, 102, 175, 128); + _neRect = Rect(259, 50, 320, 84); +} + +void Scene860::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field87E); + s.syncAsSint16LE(_field880); + s.syncAsSint16LE(_destPos.x); + s.syncAsSint16LE(_destPos.y); + s.syncAsSint16LE(_field886); + s.syncAsSint16LE(_field888); +} + +void Scene860::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(880); + + BF_GLOBALS._sound1.changeSound(90); + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS.setFlag(fBlowUpGoon); + } + + if (BF_GLOBALS.getFlag(fBlowUpGoon)) { + _deadBody.postInit(); + _deadBody.setVisage(875); + _deadBody.setStrip(7); + _deadBody.setFrame2(_deadBody.getFrameCount()); + _deadBody.fixPriority(130); + _deadBody.setPosition(Common::Point(255, 148)); + } + + if (BF_GLOBALS._dayNumber == 5) { + _object2.postInit(); + _object2.setVisage(880); + _object2.setPosition(Common::Point(196, 81)); + BF_GLOBALS._sceneItems.push_back(&_object2); + _object2.setDetails(860, 0, 1, -1, 1, NULL); + _object2.fixPriority(20); + + _neRect = Rect(0, 0, 0, 0); + _yachtRect = Rect(180, 66, 219, 79); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(880); + BF_GLOBALS._player._moveDiff = Common::Point(1, 1); + BF_GLOBALS._player._moveRate = 20; + + BF_GLOBALS._events.setCursor(CURSOR_WALK); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player._canWalk = false; + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 355: + if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 860) { + _sceneMode = 8610; + setAction(&_sequenceManager, this, 8610, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 8609; + setAction(&_sequenceManager, this, 8609, &BF_GLOBALS._player, NULL); + _field87E = 0; + _field880 = 1; + _field888 = 1; + } + break; + case 870: + _sound1.play(89); + _sound1.holdAt(1); + _sceneMode = 8608; + setAction(&_sequenceManager, this, 8608, &BF_GLOBALS._player, NULL); + _field880 = 0; + _field87E = 2; + _field888 = 1; + break; + default: + _sound1.play(89); + _sound1.holdAt(1); + _sceneMode = 8607; + setAction(&_sequenceManager, this, 8607, &BF_GLOBALS._player, NULL); + _field87E = 0; + _field880 = 2; + _field888 = 1; + break; + } +} + +void Scene860::signal() { + switch (_sceneMode) { + case 8601: + case 8606: + BF_GLOBALS._sceneManager.changeScene(870); + break; + case 8602: + case 8604: + BF_GLOBALS._sceneManager.changeScene(355); + break; + case 8603: + case 8605: + BF_GLOBALS._sceneManager.changeScene(850); + break; + case 8607: + case 8608: + case 8609: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + case 8610: + BF_GLOBALS._deathReason = 22; + BF_GLOBALS._sceneManager.changeScene(866); + break; + default: + break; + } +} + +void Scene860::process(Event &event) { + if (_swRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = 2; + _destPos = Common::Point(119, 126); + _field87E = 0; + setAction(&_action1); + } + } else if (_neRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NE); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = 1; + _destPos = Common::Point(266, 56); + _field87E = 2; + setAction(&_action1); + } + } else if (_yachtRect.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_NW); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.eventType == EVENT_BUTTON_DOWN) && !_action) { + event.handled = true; + _field886 = (BF_GLOBALS._player._position.y <= 78) ? 2 : 1; + _destPos = Common::Point(212, 78); + _field87E = 1; + setAction(&_action1); + } + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } +} + +void Scene860::dispatch() { + if (_action) { + _action->dispatch(); + } else if (_swRect.contains(BF_GLOBALS._player._position) && (_field87E == 0)) { + _sound1.play(88); + BF_GLOBALS._sceneManager.changeScene(870); + } else if (_neRect.contains(BF_GLOBALS._player._position) && (_field87E == 2)) { + _sound1.release(); + BF_GLOBALS._sceneManager.changeScene(850); + } else if (_yachtRect.contains(BF_GLOBALS._player._position) && (_field87E == 1)) { + _sound1.play(88); + BF_GLOBALS._sceneManager.changeScene(355); + } +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes8.h b/engines/tsage/blue_force/blueforce_scenes8.h index 170b7cca72..c902eb3087 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.h +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -410,6 +410,30 @@ public: virtual void signal(); }; +class Scene860: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + NamedObject _deadBody, _object2; + NamedHotspot _item1; + Action1 _action1; + Rect _swRect, _neRect, _yachtRect; + ASoundExt _sound1; + int _field87E, _field880, _field886, _field888; + Common::Point _destPos; + + Scene860(); + 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 |