diff options
Diffstat (limited to 'engines/tsage')
82 files changed, 20453 insertions, 2342 deletions
diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp index 86feceb015..b9b3ad6c22 100644 --- a/engines/tsage/blue_force/blueforce_dialogs.cpp +++ b/engines/tsage/blue_force/blueforce_dialogs.cpp @@ -187,6 +187,7 @@ void RightClickDialog::execute() { break; case 4: // Options dialog + BlueForce::OptionsDialog::show(); break; } @@ -428,6 +429,72 @@ int RadioConvDialog::show() { return btnIndex; } +/*--------------------------------------------------------------------------*/ + +void OptionsDialog::show() { + OptionsDialog *dlg = new OptionsDialog(); + dlg->draw(); + + GfxButton *btn = dlg->execute(); + + if (btn == &dlg->_btnQuit) { + // Quit game + if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) { + g_vm->quitGame(); + } + } else if (btn == &dlg->_btnRestart) { + // Restart game + g_globals->_game->restartGame(); + } else if (btn == &dlg->_btnSound) { + // Sound dialog + SoundDialog::execute(); + } else if (btn == &dlg->_btnSave) { + // Save button + g_globals->_game->saveGame(); + } else if (btn == &dlg->_btnRestore) { + // Restore button + g_globals->_game->restoreGame(); + } + + dlg->remove(); + delete dlg; +} + +OptionsDialog::OptionsDialog() { + // Set the element text + _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT); + _btnRestore.setText(RESTORE_BTN_STRING); + _btnSave.setText(SAVE_BTN_STRING); + _btnRestart.setText(RESTART_BTN_STRING); + _btnQuit.setText(QUIT_BTN_STRING); + _btnSound.setText(SOUND_BTN_STRING); + _btnResume.setText(RESUME_BTN_STRING); + + // Set position of the elements + _gfxMessage._bounds.moveTo(0, 1); + _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1); + _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1); + _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1); + _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1); + _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1); + _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1); + + // Set all the buttons to the widest button + GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume}; + int16 btnWidth = 0; + for (int idx = 0; idx < 6; ++idx) + btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width()); + for (int idx = 0; idx < 6; ++idx) + btnList[idx]->_bounds.setWidth(btnWidth); + + // Add the items to the dialog + addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL); + + // Set the dialog size and position + frame(); + _bounds.collapse(-6, -6); + setCenter(160, 90); +} } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_dialogs.h b/engines/tsage/blue_force/blueforce_dialogs.h index ca51c97aa2..76de7d19d9 100644 --- a/engines/tsage/blue_force/blueforce_dialogs.h +++ b/engines/tsage/blue_force/blueforce_dialogs.h @@ -85,6 +85,20 @@ public: static int show(); }; +class OptionsDialog: public GfxDialog { +private: + GfxButton _btnSave, _btnRestore, _btnRestart; + GfxButton _btnQuit, _btnResume; + GfxButton _btnSound; + GfxMessage _gfxMessage; +public: + OptionsDialog(); + virtual ~OptionsDialog() {} + + static void show(); +}; + + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 247fc4b9f2..22299c1bf1 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -43,9 +43,7 @@ namespace BlueForce { void BlueForceGame::start() { // Start the game - g_globals->_sceneManager.changeScene(300); - - g_globals->_events.setCursor(CURSOR_WALK); + g_globals->_sceneManager.changeScene(20); } Scene *BlueForceGame::createScene(int sceneNumber) { @@ -65,17 +63,32 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Tsnunami Title Screen #2 return new Scene100(); case 109: - // Introduction Bar Room + // Introduction - Bar Room return new Scene109(); case 110: + // Introduction - Outside the bar + return new Scene110(); case 114: + // Outside Tony's Bar + return new Scene114(); case 115: + // Inside Tony's Bar + return new Scene115(); case 125: + // Intro - Chase in the city + return new Scene125(); case 140: + // Intro - Burglar near the House + return new Scene140(); case 150: + // Intro - Burglar inside the house + return new Scene150(); case 160: + // Intro - Burial + return new Scene160(); case 180: - error("Scene group 1 not implemented"); + // Front of Home + return new Scene180(); case 190: // Front of Police Station return new Scene190(); @@ -92,7 +105,7 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Credits - Gun Training return new Scene225(); case 265: - // Graduation Article + // Intro - Graduation Article return new Scene265(); case 270: // Living Room & Kitchen @@ -101,7 +114,8 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Living Room & Kitchen #2 return new Scene271(); case 280: - error("Scene group 2 not implemented"); + // Bedroom Flashback cut-scene + return new Scene280(); case 300: // Outside Police Station return new Scene300(); @@ -184,13 +198,17 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Decking return new Scene690(); case 710: + // Beach return new Scene710(); case 800: // Jamison & Ryan return new Scene800(); case 810: + // Lyle's Office + return new Scene810(); case 820: - error("Scene group 8 not implemented"); + // Microfiche Reader + return new Scene820(); case 830: // Outside Boat Rentals return new Scene830(); @@ -198,17 +216,25 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Boat Rentals return new Scene840(); case 850: + // Boat Leaving/Entering Marina + return new Scene850(); case 860: + // Boat Entering Cove + return new Scene860(); case 870: + // Cove Beach + return new Scene870(); case 880: - error("Scene group 8 not implemented"); + // Beach Path + return new Scene880(); case 900: - // Outside Warehouse + // Outside the Warehouse return new Scene900(); case 910: - error("Scene group 9 not implemented"); + // Inside the Warehouse + return new Scene910(); case 920: - // Inside Warehouse: Secret room + // Inside the Warehouse: Secret room return new Scene920(); case 930: // Inside the caravan @@ -217,6 +243,7 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Hidden in the wardrobe return new Scene935(); case 940: + // Jail ending animation return new Scene940(); default: error("Unknown scene number - %d", sceneNumber); @@ -224,6 +251,20 @@ Scene *BlueForceGame::createScene(int sceneNumber) { } } +/** + * Returns true if it is currently okay to restore a game + */ +bool BlueForceGame::canLoadGameStateCurrently() { + return true; +} + +/** + * Returns true if it is currently okay to save the game + */ +bool BlueForceGame::canSaveGameStateCurrently() { + return true; +} + void BlueForceGame::rightClick() { RightClickDialog *dlg = new RightClickDialog(); dlg->execute(); @@ -274,6 +315,24 @@ void BlueForceGame::processEvent(Event &event) { } } +void BlueForceGame::restart() { + g_globals->_scenePalette.clearListeners(); + g_globals->_soundHandler.stop(); + + // Reset the globals + g_globals->reset(); + + // Clear save/load slots + g_globals->_sceneHandler->_saveGameSlot = -1; + g_globals->_sceneHandler->_loadGameSlot = -1; + + g_globals->_stripNum = 0; + g_globals->_events.setCursor(CURSOR_WALK); + + // Change to the first game scene + g_globals->_sceneManager.changeScene(190); +} + /*--------------------------------------------------------------------------*/ AObjectArray::AObjectArray(): EventHandler() { @@ -563,15 +622,15 @@ void FollowerObject::dispatch() { } else if ((_object->_visage != 308) || (_object->_strip != 1)) { show(); setStrip(_object->_strip); - setPosition(_object->_position, _object->_yDiff); + setPosition(Common::Point(_object->_position.x + 1, _object->_position.y), _yDiff); } } void FollowerObject::reposition() { assert(_object); setStrip(_object->_strip); - setPosition(_object->_position, _object->_yDiff); - reposition(); + setPosition(_object->_position, _yDiff); + NamedObject::reposition(); } void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yDiff) { @@ -665,13 +724,28 @@ void SceneExt::postInit(SceneObjectList *OwnerList) { Scene::postInit(OwnerList); if (BF_GLOBALS._dayNumber) { // Blank out the bottom portion of the screen - BF_GLOBALS._interfaceY = BF_INTERFACE_Y; + BF_GLOBALS._interfaceY = UI_INTERFACE_Y; - Rect r(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); + Rect r(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); BF_GLOBALS.gfxManager().getSurface().fillRect(r, 0); } } +void SceneExt::remove() { + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements.resetClear(); + + // Below code originally in Blue Force Scene::remove(). Placed here to avoid contaminating + // core class with Blue Force specific code + if (_action) { + if (_action->_endHandler) + _action->_endHandler = NULL; + _action->remove(); + } + + _focusObject = NULL; +} + void SceneExt::process(Event &event) { _objArray2.process(event); if (!event.handled) @@ -683,8 +757,8 @@ void SceneExt::dispatch() { if (_field37A) { if ((--_field37A == 0) && BF_GLOBALS._dayNumber) { - if (BF_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) { - BF_GLOBALS._uiElements.show(); + if (T2_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) { + T2_GLOBALS._uiElements.show(); } _field37A = 0; @@ -699,6 +773,7 @@ void SceneExt::loadScene(int sceneNum) { _v51C34.top = 0; _v51C34.bottom = 300; + BF_GLOBALS._sceneHandler->_delayTicks = 1; } void SceneExt::checkGun() { @@ -773,8 +848,8 @@ void SceneExt::startStrip() { scene->_savedCanWalk = BF_GLOBALS._player._canWalk; BF_GLOBALS._player.disableControl(); - if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.hide(); + if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); } } @@ -787,8 +862,8 @@ void SceneExt::endStrip() { BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; BF_GLOBALS._player._canWalk = scene->_savedCanWalk; - if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.show(); + if (!BF_GLOBALS._v50696 && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); } } @@ -841,12 +916,12 @@ void PalettedScene::add2Faders(const byte *arrBufferRGB, int step, int paletteNu BF_GLOBALS._scenePalette.addFader(_palette._palette, 256, step, action); } -void PalettedScene::sub15E4F(const byte *arrBufferRGB, int arg8, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag) { +void PalettedScene::transition(const byte *arrBufferRGB, int percent, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag) { byte tmpPalette[768]; _palette.loadPalette(paletteNum); _palette.loadPalette(2); - if (!flag) { + if (flag) { for (int i = fromColor1; i <= fromColor2; i++) { tmpPalette[(3 * i)] = BF_GLOBALS._scenePalette._palette[(3 * i)]; tmpPalette[(3 * i) + 1] = BF_GLOBALS._scenePalette._palette[(3 * i) + 1]; @@ -861,9 +936,9 @@ void PalettedScene::sub15E4F(const byte *arrBufferRGB, int arg8, int paletteNum, } for (int i = toColor1; i <= toColor2; i++) { - tmpPalette[i] = _palette._palette[i] - ((_palette._palette[i] - arrBufferRGB[0]) * (100 - arg8)) / 100; - tmpPalette[i + 1] = _palette._palette[i + 1] - ((_palette._palette[i + 1] - arrBufferRGB[1]) * (100 - arg8)) / 100; - tmpPalette[i + 2] = _palette._palette[i + 2] - ((_palette._palette[i + 2] - arrBufferRGB[2]) * (100 - arg8)) / 100; + tmpPalette[i * 3] = _palette._palette[i * 3] - ((_palette._palette[i * 3] - arrBufferRGB[i * 3]) * (100 - percent)) / 100; + tmpPalette[i * 3 + 1] = _palette._palette[i * 3 + 1] - ((_palette._palette[i * 3 + 1] - arrBufferRGB[i * 3 + 1]) * (100 - percent)) / 100; + tmpPalette[i * 3 + 2] = _palette._palette[i * 3 + 2] - ((_palette._palette[i * 3 + 2] - arrBufferRGB[i * 3 + 2]) * (100 - percent)) / 100; } BF_GLOBALS._scenePalette.addFader((const byte *)tmpPalette, 256, 100, action); @@ -885,8 +960,8 @@ void SceneHandlerExt::process(Event &event) { if (scene && scene->_focusObject) scene->_focusObject->process(event); - if (BF_GLOBALS._uiElements._active) { - BF_GLOBALS._uiElements.process(event); + if (T2_GLOBALS._uiElements._active) { + T2_GLOBALS._uiElements.process(event); if (event.handled) return; } @@ -899,6 +974,23 @@ void SceneHandlerExt::process(Event &event) { return; } + // If the user clicks the button whilst the introduction is active, prompt for playing the game + if ((BF_GLOBALS._dayNumber == 0) && (event.eventType == EVENT_BUTTON_DOWN)) { + // Prompt user for whether to start play or watch introduction + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._events.setCursor(CURSOR_WALK); + + if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { + // Start the game + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._sceneManager.changeScene(190); + } else { + BF_GLOBALS._player.disableControl(); + } + + event.handled = true; + } + SceneHandler::process(event); } @@ -1126,6 +1218,9 @@ void BlueForceInvObjectList::reset() { setObjectScene(INV_DOG_WHISTLE, 880); setObjectScene(INV_YELLOW_CORD, 910); setObjectScene(INV_BLACK_CORD, 910); + + // Set up the select item handler method + T2_GLOBALS._onSelectItem = SelectItem; } void BlueForceInvObjectList::setObjectScene(int objectNum, int sceneNumber) { @@ -1140,7 +1235,7 @@ void BlueForceInvObjectList::setObjectScene(int objectNum, int sceneNumber) { BF_GLOBALS._events.setCursor(CURSOR_USE); // Update the user interface if necessary - BF_GLOBALS._uiElements.updateInventory(); + T2_GLOBALS._uiElements.updateInventory(); } void BlueForceInvObjectList::alterInventory(int mode) { @@ -1232,8 +1327,241 @@ void BlueForceInvObjectList::alterInventory(int mode) { } } +/** + * When an inventory item is selected, check if it's the gun belt, since that has a specific dialog + */ +bool BlueForceInvObjectList::SelectItem(int objectNumber) { + if (objectNumber == INV_AMMO_BELT) { + AmmoBeltDialog *dlg = new AmmoBeltDialog(); + dlg->execute(); + delete dlg; + + return true; + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +bool NamedHotspot::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_WALK: + // Nothing + return false; + case CURSOR_LOOK: + if (_lookLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _lookLineNum); + return true; + case CURSOR_USE: + if (_useLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _useLineNum); + return true; + case CURSOR_TALK: + if (_talkLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _talkLineNum); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + /*--------------------------------------------------------------------------*/ +void SceneMessage::remove() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene->_focusObject == this) + scene->_focusObject = NULL; + + Action::remove(); +} + +void SceneMessage::signal() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_focusObject = this; + BF_GLOBALS._events.setCursor(CURSOR_WALK); + draw(); + setDelay(180); + break; + case 1: + clear(); + remove(); + break; + default: + break; + } +} + +void SceneMessage::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) || + ((event.eventType == EVENT_KEYPRESS) && (event.kbd.keycode == Common::KEYCODE_RETURN))) { + signal(); + } +} + + +void SceneMessage::draw() { + GfxSurface &surface = BF_GLOBALS._screenSurface; + + // Clear the game area + surface.fillRect(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 0); + + // Disable scene fade in + BF_GLOBALS._paneRefreshFlag[0] = 0; + + // Set up the font + GfxFont &font = BF_GLOBALS._gfxManagerInstance._font; + BF_GLOBALS._scenePalette.setEntry(font._colors.foreground, 255, 255, 255); + BF_GLOBALS._scenePalette.setPalette(font._colors.foreground, 1); + + // Write out the message + Rect textRect(0, UI_INTERFACE_Y / 2 - (font.getHeight() / 2), SCREEN_WIDTH, + UI_INTERFACE_Y / 2 + (font.getHeight() / 2)); + BF_GLOBALS._gfxManagerInstance._font.writeLines(_message.c_str(), textRect, ALIGN_CENTER); + + // TODO: Ideally, saving and loading should be disabled here until the message display is complete +} + +void SceneMessage::clear() { + // Fade out the text display + static const uint32 black = 0; + BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); + + // Refresh the background + BF_GLOBALS._paneRefreshFlag[0] = 0; + + // Set up to fade in the game scene + g_globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; + g_globals->_sceneManager._hasPalette = true; +} + +IntroSceneText::IntroSceneText(): SceneText() { + _action = NULL; + _frameNumber = 0; + _diff = 0; +} + +void IntroSceneText::setup(const Common::String &msg, Action *action) { + _frameNumber = BF_GLOBALS._events.getFrameNumber(); + _diff = 180; + _action = action; + _fontNumber = 4; + _width = 300; + _textMode = ALIGN_CENTER; + _color1 = BF_GLOBALS._scenePalette._colors.background; + _color2 = _color3 = 0; + + SceneText::setup(msg); + + // Center the text on-screen + reposition(); + _bounds.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); + + // Set the new position + _position.x = _bounds.left; + _position.y = _bounds.top; +} + +void IntroSceneText::synchronize(Serializer &s) { + SceneText::synchronize(s); + SYNC_POINTER(_action); + s.syncAsUint32LE(_frameNumber); + s.syncAsSint16LE(_diff); +} + +void IntroSceneText::dispatch() { + if (_diff) { + uint32 frameNumber = BF_GLOBALS._events.getFrameNumber(); + if (_frameNumber < frameNumber) { + _diff -= frameNumber - _frameNumber; + _frameNumber = frameNumber; + + if (_diff <= 0) { + // Time has expired, so remove the text and signal the designated action + remove(); + if (_action) + _action->signal(); + } + } + } +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h index dcaea52444..d0d0e0ee40 100644 --- a/engines/tsage/blue_force/blueforce_logic.h +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -43,6 +43,9 @@ public: virtual Scene *createScene(int sceneNumber); virtual void rightClick(); virtual void processEvent(Event &event); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); + virtual void restart(); }; #define OBJ_ARRAY_SIZE 10 @@ -202,7 +205,7 @@ public: bool _savedCanWalk; int _field37A; - FocusObject *_focusObject; + EventHandler *_focusObject; Visage _cursorVisage; Rect _v51C34; @@ -211,13 +214,14 @@ public: virtual Common::String getClassName() { return "SceneExt"; } virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); virtual void process(Event &event); virtual void dispatch(); virtual void loadScene(int sceneNum); virtual void checkGun(); - void addTimer(Timer *timer) { _timerList.add(timer); } - void removeTimer(Timer *timer) { _timerList.remove(timer); } + void addTimer(EventHandler *timer) { _timerList.add(timer); } + void removeTimer(EventHandler *timer) { _timerList.remove(timer); } bool display(CursorType action); void fadeOut(); void gunDisplay(); @@ -236,7 +240,7 @@ public: virtual void remove(); PaletteFader *addFader(const byte *arrBufferRGB, int step, Action *action); void add2Faders(const byte *arrBufferRGB, int step, int paletteNum, Action *action); - void sub15E4F(const byte *arrBufferRGB, int arg8, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag); + void transition(const byte *arrBufferRGB, int arg8, int paletteNum, Action *action, int fromColor1, int fromColor2, int toColor1, int toColor2, bool flag); }; class SceneHandlerExt: public SceneHandler { @@ -249,6 +253,8 @@ public: }; class BlueForceInvObjectList : public InvObjectList { +private: + static bool SelectItem(int objectNumber); public: InvObject _none; InvObject _colt45; @@ -327,6 +333,61 @@ public: virtual Common::String getClassName() { return "BlueForceInvObjectList"; } }; +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + + virtual bool startAction(CursorType action, Event &event); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + 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); + } +}; + +class SceneMessage: public Action { +private: + Common::String _message; + + void draw(); + void clear(); +public: + void setup(const Common::String &msg) { _message = msg; } + + virtual Common::String getClassName() { return "SceneMessage"; } + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); +}; + +class IntroSceneText: public SceneText { +public: + Action *_action; + uint32 _frameNumber; + int _diff; +public: + IntroSceneText(); + void setup(const Common::String &msg, Action *action); + + virtual Common::String getClassName() { return "BFIntroText"; } + virtual void synchronize(Serializer &s); + virtual void dispatch(); +}; + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp index 1e8c535f5f..682e273716 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.cpp +++ b/engines/tsage/blue_force/blueforce_scenes0.cpp @@ -48,45 +48,45 @@ void Scene20::Action1::signal() { BF_GLOBALS._scenePalette.addRotation(64, 127, -1, 1, this); break; case 2: - scene->_object1.setVisage(22); - scene->_object1._strip = 1; - scene->_object1._frame = 1; - scene->_object1.changeZoom(100); - - scene->_object2.setVisage(22); - scene->_object2._strip = 2; - scene->_object2._frame = 1; - scene->_object2.changeZoom(100); - - scene->_object3.setVisage(22); - scene->_object3._strip = 3; - scene->_object3._frame = 1; - scene->_object3.changeZoom(100); - - scene->_object4.setVisage(22); - scene->_object4._strip = 4; - scene->_object4._frame = 1; - scene->_object4.changeZoom(100); - - scene->_object5.setVisage(22); - scene->_object5._strip = 5; - scene->_object5._frame = 1; - scene->_object5.changeZoom(100); - - scene->_object6.setVisage(22); - scene->_object6._strip = 6; - scene->_object6._frame = 1; - scene->_object6.changeZoom(100); - - scene->_object7.setVisage(22); - scene->_object7._strip = 7; - scene->_object7._frame = 1; - scene->_object7.changeZoom(100); - - scene->_object8.setVisage(22); - scene->_object8._strip = 8; - scene->_object8._frame = 1; - scene->_object8.changeZoom(100); + scene->_tsunamiWave.setVisage(22); + scene->_tsunamiWave._strip = 1; + scene->_tsunamiWave._frame = 1; + scene->_tsunamiWave.changeZoom(100); + + scene->_letterT.setVisage(22); + scene->_letterT._strip = 2; + scene->_letterT._frame = 1; + scene->_letterT.changeZoom(100); + + scene->_letterS.setVisage(22); + scene->_letterS._strip = 3; + scene->_letterS._frame = 1; + scene->_letterS.changeZoom(100); + + scene->_letterU.setVisage(22); + scene->_letterU._strip = 4; + scene->_letterU._frame = 1; + scene->_letterU.changeZoom(100); + + scene->_letterN.setVisage(22); + scene->_letterN._strip = 5; + scene->_letterN._frame = 1; + scene->_letterN.changeZoom(100); + + scene->_letterA.setVisage(22); + scene->_letterA._strip = 6; + scene->_letterA._frame = 1; + scene->_letterA.changeZoom(100); + + scene->_letterM.setVisage(22); + scene->_letterM._strip = 7; + scene->_letterM._frame = 1; + scene->_letterM.changeZoom(100); + + scene->_letterI.setVisage(22); + scene->_letterI._strip = 8; + scene->_letterI._frame = 1; + scene->_letterI.changeZoom(100); setDelay(1); break; @@ -97,12 +97,12 @@ void Scene20::Action1::signal() { setDelay(60); break; case 5: - scene->_object2.animate(ANIM_MODE_5, NULL); - scene->_object3.animate(ANIM_MODE_5, NULL); - scene->_object4.animate(ANIM_MODE_5, NULL); - scene->_object5.animate(ANIM_MODE_5, NULL); - scene->_object6.animate(ANIM_MODE_5, NULL); - scene->_object7.animate(ANIM_MODE_5, this); + scene->_letterT.animate(ANIM_MODE_5, NULL); + scene->_letterS.animate(ANIM_MODE_5, NULL); + scene->_letterU.animate(ANIM_MODE_5, NULL); + scene->_letterN.animate(ANIM_MODE_5, NULL); + scene->_letterA.animate(ANIM_MODE_5, NULL); + scene->_letterM.animate(ANIM_MODE_5, this); break; case 6: setDelay(120); @@ -121,75 +121,76 @@ void Scene20::Action1::signal() { void Scene20::postInit(SceneObjectList *OwnerList) { loadScene(20); - Scene::postInit(); + SceneExt::postInit(); setZoomPercents(60, 85, 200, 100); + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; _scenePalette.loadPalette(1); _scenePalette.loadPalette(22); - _object1.postInit(); - _object1.setVisage(21); - _object1._strip = 1; - _object1._frame = 1; - _object1.animate(ANIM_MODE_NONE, NULL); - _object1.setPosition(Common::Point(62, 85)); - _object1.changeZoom(100); - - _object2.postInit(); - _object2.setVisage(21); - _object2._strip = 2; - _object2._frame = 1; - _object2.animate(ANIM_MODE_NONE, NULL); - _object2.setPosition(Common::Point(27, 94)); - _object2.changeZoom(100); - - _object3.postInit(); - _object3.setVisage(21); - _object3._strip = 2; - _object3._frame = 2; - _object3.animate(ANIM_MODE_NONE, NULL); - _object3.setPosition(Common::Point(68, 94)); - _object3.changeZoom(100); - - _object4.postInit(); - _object4.setVisage(21); - _object4._strip = 2; - _object4._frame = 3; - _object4.animate(ANIM_MODE_NONE, NULL); - _object4.setPosition(Common::Point(110, 94)); - _object4.changeZoom(100); - - _object5.postInit(); - _object5.setVisage(21); - _object5._strip = 2; - _object5._frame = 4; - _object5.animate(ANIM_MODE_NONE, NULL); - _object5.setPosition(Common::Point(154, 94)); - _object5.changeZoom(100); - - _object6.postInit(); - _object6.setVisage(21); - _object6._strip = 2; - _object6._frame = 5; - _object6.animate(ANIM_MODE_NONE, NULL); - _object6.setPosition(Common::Point(199, 94)); - _object6.changeZoom(100); - - _object7.postInit(); - _object7.setVisage(21); - _object7._strip = 2; - _object7._frame = 6; - _object7.animate(ANIM_MODE_NONE, NULL); - _object7.setPosition(Common::Point(244, 94)); - _object7.changeZoom(100); - - _object8.postInit(); - _object8.setVisage(21); - _object8._strip = 2; - _object8._frame = 7; - _object8.animate(ANIM_MODE_NONE, NULL); - _object8.setPosition(Common::Point(286, 94)); - _object8.changeZoom(100); + _tsunamiWave.postInit(); + _tsunamiWave.setVisage(21); + _tsunamiWave._strip = 1; + _tsunamiWave._frame = 1; + _tsunamiWave.animate(ANIM_MODE_NONE, NULL); + _tsunamiWave.setPosition(Common::Point(62, 85)); + _tsunamiWave.changeZoom(100); + + _letterT.postInit(); + _letterT.setVisage(21); + _letterT._strip = 2; + _letterT._frame = 1; + _letterT.animate(ANIM_MODE_NONE, NULL); + _letterT.setPosition(Common::Point(27, 94)); + _letterT.changeZoom(100); + + _letterS.postInit(); + _letterS.setVisage(21); + _letterS._strip = 2; + _letterS._frame = 2; + _letterS.animate(ANIM_MODE_NONE, NULL); + _letterS.setPosition(Common::Point(68, 94)); + _letterS.changeZoom(100); + + _letterU.postInit(); + _letterU.setVisage(21); + _letterU._strip = 2; + _letterU._frame = 3; + _letterU.animate(ANIM_MODE_NONE, NULL); + _letterU.setPosition(Common::Point(110, 94)); + _letterU.changeZoom(100); + + _letterN.postInit(); + _letterN.setVisage(21); + _letterN._strip = 2; + _letterN._frame = 4; + _letterN.animate(ANIM_MODE_NONE, NULL); + _letterN.setPosition(Common::Point(154, 94)); + _letterN.changeZoom(100); + + _letterA.postInit(); + _letterA.setVisage(21); + _letterA._strip = 2; + _letterA._frame = 5; + _letterA.animate(ANIM_MODE_NONE, NULL); + _letterA.setPosition(Common::Point(199, 94)); + _letterA.changeZoom(100); + + _letterM.postInit(); + _letterM.setVisage(21); + _letterM._strip = 2; + _letterM._frame = 6; + _letterM.animate(ANIM_MODE_NONE, NULL); + _letterM.setPosition(Common::Point(244, 94)); + _letterM.changeZoom(100); + + _letterI.postInit(); + _letterI.setVisage(21); + _letterI._strip = 2; + _letterI._frame = 7; + _letterI.animate(ANIM_MODE_NONE, NULL); + _letterI.setPosition(Common::Point(286, 94)); + _letterI.changeZoom(100); setAction(&_action1); BF_GLOBALS._dialogCenter.y = 165; @@ -238,11 +239,11 @@ void Scene50::Tooltip2::dispatch() { } } -void Scene50::Tooltip::set(const Rect &bounds, int v60, const Common::String &msg, int v62) { +void Scene50::Tooltip::set(const Rect &bounds, int sceneNum, const Common::String &msg, int locationId) { _bounds = bounds; - _newSceneNumber = v60; + _newSceneNumber = sceneNum; _msg = msg; - _locationId = v62; + _locationId = locationId; } void Scene50::Tooltip::update() { @@ -260,8 +261,8 @@ void Scene50::Tooltip::update() { void Scene50::Tooltip::highlight(bool btnDown) { Scene50 *scene = (Scene50 *)BF_GLOBALS._sceneManager._scene; - scene->_field382 = _newSceneNumber; - if ((scene->_field380 != 0) || (scene->_field380 != _newSceneNumber)) + // In the original, a variable was used, always set to 0. The check is simplified + if (_newSceneNumber != 0) update(); if (btnDown) { @@ -322,16 +323,11 @@ void Scene50::Tooltip::highlight(bool btnDown) { /*--------------------------------------------------------------------------*/ -Scene50::Scene50(): SceneExt() { - _field382 = 0; - _field380 = 0; -} - void Scene50::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); BF_GLOBALS._interfaceY = 200; - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements._active = false; BF_GLOBALS._player.postInit(); BF_GLOBALS._player.setVisage(830); BF_GLOBALS._player.setStrip(3); @@ -420,9 +416,10 @@ void Scene50::postInit(SceneObjectList *OwnerList) { void Scene50::remove() { // Blank out the screen clearScreen(); + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; SceneExt::remove(); - BF_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements._active = true; } void Scene50::signal() { @@ -437,11 +434,11 @@ void Scene50::signal() { } if ((BF_GLOBALS._driveFromScene == 410) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { - BF_GLOBALS.setFlag(125); + BF_GLOBALS.setFlag(f1097Frankie); } if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { - BF_GLOBALS.setFlag(123); + BF_GLOBALS.setFlag(f1097Marina); } if ((BF_GLOBALS._driveFromScene == 380) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { @@ -467,7 +464,6 @@ void Scene50::signal() { BF_GLOBALS._player.enableControl(); BF_GLOBALS._events.setCursor(CURSOR_WALK); _sceneMode = 0; - _field380 = 0; } } @@ -475,7 +471,6 @@ void Scene50::process(Event &event) { SceneExt::process(event); Common::Point pt(event.mousePos.x + _sceneBounds.left, event.mousePos.y + _sceneBounds.top); bool mouseDown = false; - _field382 = 0; if ((event.mousePos.x > 270 && (_sceneBounds.right < (SCREEN_WIDTH * 2)))) loadBackground(4, 0); @@ -535,7 +530,7 @@ bool Scene60::Ignition::startAction(CursorType action, Event &event) { bool Scene60::Ignition::check1() { if (BF_GLOBALS._bookmark >= bStoppedFrankie) { - BF_GLOBALS._v5098C |= 1; + BF_GLOBALS._subFlagBitArr1 |= 1; return false; } else { if ((BF_GLOBALS._bookmark == bBookedGreen) && BF_GLOBALS.getFlag(fArrivedAtGangStop)) { @@ -562,13 +557,13 @@ bool Scene60::Ignition::check1() { } else if (BF_GLOBALS._bookmark < bStartOfGame) { // Should never reach here } else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) { - if ((BF_GLOBALS._v5098C >> 1) & 1) + if ((BF_GLOBALS._subFlagBitArr1 >> 1) & 1) BF_GLOBALS.setFlag(fLateToMarina); else - BF_GLOBALS._v5098C |= 2; + BF_GLOBALS._subFlagBitArr1 |= 2; } else { - int v = (((BF_GLOBALS._v5098C >> 2) & 15) + 1) & 15; - BF_GLOBALS._v5098C = (BF_GLOBALS._v5098C & 0xC3) | (v << 2); + int v = (((BF_GLOBALS._subFlagBitArr1 >> 2) & 15) + 1) & 15; + BF_GLOBALS._subFlagBitArr1 = (BF_GLOBALS._subFlagBitArr1 & 0xC3) | (v << 2); if ((v != 1) && (v != 2)) { BF_GLOBALS._deathReason = 19; @@ -578,17 +573,17 @@ bool Scene60::Ignition::check1() { } } - BF_GLOBALS._v5098C |= 1; + BF_GLOBALS._subFlagBitArr1 |= 1; return false; } bool Scene60::Ignition::check2() { switch (BF_GLOBALS._bookmark) { case bInspectionDone: - if (BF_GLOBALS._v5098D & 1) { + if (BF_GLOBALS._subFlagBitArr2 & 1) { BF_GLOBALS.setFlag(fLateToDrunkStop); } else { - BF_GLOBALS._v5098D |= 1; + BF_GLOBALS._subFlagBitArr2 |= 1; } break; case bCalledToDrunkStop: @@ -598,7 +593,7 @@ bool Scene60::Ignition::check2() { break; } - BF_GLOBALS._v5098C |= 0x80; + BF_GLOBALS._subFlagBitArr1 |= 0x80; return false; } @@ -681,7 +676,7 @@ bool Scene60::MirandaCard::startAction(CursorType action, Event &event) { SceneItem::display2(60, 6); BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 1); if (!BF_GLOBALS.getFlag(fGotPointsForTktBook)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fGotPointsForTktBook); } @@ -712,7 +707,7 @@ bool Scene60::TicketBook::startAction(CursorType action, Event &event) { SceneItem::display2(60, 3); BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 1); if (!BF_GLOBALS.getFlag(fShotNicoIn910)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fShotNicoIn910); } } @@ -777,10 +772,10 @@ void Scene60::Action1::signal() { switch (_state) { case 1: if (BF_GLOBALS.removeFlag(fCan1004Marina)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 606; } else if (BF_GLOBALS.removeFlag(fCan1004Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 606; } else { _state = 611; @@ -791,13 +786,13 @@ void Scene60::Action1::signal() { break; case 3: if (BF_GLOBALS.removeFlag(f1015Marina)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 613; } else if (BF_GLOBALS.removeFlag(f1015Frankie)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 614; } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 615; } else { _state = 616; @@ -805,15 +800,15 @@ void Scene60::Action1::signal() { break; case 4: if (BF_GLOBALS.removeFlag(f1027Marina)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _actionIndex = 5; _state = 617; } else if (BF_GLOBALS.removeFlag(f1027Frankie)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _actionIndex = 5; _state = 618; } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _actionIndex = 5; _state = 619; } else { @@ -823,15 +818,15 @@ void Scene60::Action1::signal() { case 5: if (BF_GLOBALS.removeFlag(f1035Marina)) { BF_GLOBALS.setFlag(fCalledBackup); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); _state = 621; } else if (BF_GLOBALS.removeFlag(f1035Frankie)) { BF_GLOBALS.setFlag(fCalledBackup); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); _actionIndex = 5; _state = 622; } else if (BF_GLOBALS.removeFlag(f1035Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 623; } else { _state = 624; @@ -839,14 +834,14 @@ void Scene60::Action1::signal() { break; case 6: if (BF_GLOBALS.removeFlag(f1097Marina)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 625; } else if (BF_GLOBALS.removeFlag(f1097Frankie)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _actionIndex = 5; _state = 626; } else if (BF_GLOBALS.removeFlag(f1097Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 627; } else { _state = 628; @@ -854,13 +849,13 @@ void Scene60::Action1::signal() { break; case 7: if (BF_GLOBALS.removeFlag(f1098Marina)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 629; } else if (BF_GLOBALS.removeFlag(f1098Frankie)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 630; } else if (BF_GLOBALS.removeFlag(f1098Drunk)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); _state = 631; } else { _state = 632; @@ -1081,7 +1076,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { switch (BF_GLOBALS._dayNumber) { case 1: - if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._v5098C & 1) && + if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._subFlagBitArr1 & 1) && (BF_GLOBALS._bookmark < bStartOfGame) && (BF_GLOBALS._sceneManager._previousScene != 342)) { setAction(&_action2); if (BF_GLOBALS._sceneManager._previousScene == 342) @@ -1089,7 +1084,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { } break; case 2: - if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._v5098C >> 7) & 1) && + if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._subFlagBitArr1 >> 7) & 1) && (BF_GLOBALS._sceneManager._previousScene != 550) && (BF_GLOBALS._bookmark < bInspectionDone)) { setAction(&_action3); diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h index 103e5f0a4c..9b0bf556f4 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.h +++ b/engines/tsage/blue_force/blueforce_scenes0.h @@ -50,8 +50,8 @@ class Scene20 : public SceneExt { public: Action1 _action1; ScenePalette _scenePalette; - SceneObject _object1, _object2, _object3, _object4; - SceneObject _object5, _object6, _object7, _object8; + SceneObject _tsunamiWave, _letterT, _letterS, _letterU; + SceneObject _letterN, _letterA, _letterM, _letterI; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -65,7 +65,7 @@ class Scene50: public SceneExt { int _locationId; public: Tooltip(); - void set(const Rect &bounds, int v60, const Common::String &msg, int v62); + void set(const Rect &bounds, int sceneNum, const Common::String &msg, int locationId); void update(); void highlight(bool btnDown); @@ -81,7 +81,6 @@ class Scene50: public SceneExt { virtual void dispatch(); }; public: - int _field380, _field382; int _sceneNumber; SceneText _text; SceneItemType2 _item; @@ -89,7 +88,6 @@ public: Tooltip _location6, _location7, _location8, _location9; Timer _timer; public: - Scene50(); virtual Common::String getClassName() { return "Scene50"; } virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void remove(); @@ -172,6 +170,7 @@ public: int _sceneNumber; int _visage; CursorType _cursorId; + // TODO: Check if really useless in original bool _field1222; Scene60(); diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp index c953584665..f17f2d7c83 100644 --- a/engines/tsage/blue_force/blueforce_scenes1.cpp +++ b/engines/tsage/blue_force/blueforce_scenes1.cpp @@ -140,6 +140,7 @@ void Scene100::Action2::signal() { } else { // Prompt user for whether to start play or watch introduction g_globals->_player.enableControl(); + g_globals->_events.setCursor(CURSOR_WALK); if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { // Signal to start the game @@ -242,8 +243,8 @@ void Scene109::Action1::signal() { scene->_drunk.show(); scene->_drunk.setAction(&scene->_action3); scene->_object2.show(); - scene->_object9.show(); - scene->_object9.setAction(&scene->_action2); + scene->_beerSign.show(); + scene->_beerSign.setAction(&scene->_action2); BF_GLOBALS._v501FC = 170; setDelay(60); @@ -256,27 +257,27 @@ void Scene109::Action1::signal() { break; case 5: // Open briefcase and pass over disk - setAction(&scene->_sequenceManager6, this, 105, &scene->_object10, NULL); + setAction(&scene->_sequenceManager6, this, 105, &scene->_animationInset, NULL); break; case 6: // Protaginist 2 walk to the bar - scene->_object10.remove(); + scene->_animationInset.remove(); setAction(&scene->_sequenceManager6, this, 100, &scene->_protaginist2, NULL); break; case 7: // Two thugs enter and walk to table - scene->_object7.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_object7, NULL); - scene->_object5.setAction(&scene->_sequenceManager8, this, 102, &scene->_object5, NULL); + scene->_cop2.setAction(&scene->_sequenceManager7, NULL, 103, &scene->_cop2, NULL); + scene->_cop1.setAction(&scene->_sequenceManager8, this, 102, &scene->_cop1, NULL); scene->_protaginist2.setAction(&scene->_sequenceManager6, NULL, 104, &scene->_protaginist2, &scene->_bartender, NULL); break; case 8: // Protaginist 1 leaves, protaginist 2 stands up - setAction(&scene->_sequenceManager8, this, 101, &scene->_object5, &scene->_protaginist1, NULL); + setAction(&scene->_sequenceManager8, this, 101, &scene->_cop1, &scene->_protaginist1, NULL); break; case 9: // Shots fired! scene->_protaginist1.setAction(&scene->_sequenceManager5, this, 98, &scene->_protaginist1, NULL); - scene->_object7.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_object7, NULL); + scene->_cop2.setAction(&scene->_sequenceManager7, NULL, 99, &scene->_cop2, NULL); break; case 10: // End scene @@ -288,65 +289,12 @@ void Scene109::Action1::signal() { void Scene109::Action2::signal() { Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene; - scene->setAction(&scene->_sequenceManager2, this, 3117, &scene->_object9, NULL); + setAction(&scene->_sequenceManager2, this, 3117, &scene->_beerSign, NULL); } void Scene109::Action3::signal() { Scene109 *scene = (Scene109 *)BF_GLOBALS._sceneManager._scene; - scene->setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL); -} - -/*--------------------------------------------------------------------------*/ - -Scene109::Text::Text(): SceneText() { - _action = NULL; - _frameNumber = 0; - _diff = 0; -} - -void Scene109::Text::setup(const Common::String &msg, Action *action) { - _frameNumber = BF_GLOBALS._events.getFrameNumber(); - _diff = 180; - _action = action; - _fontNumber = 4; - _width = 300; - _textMode = ALIGN_CENTER; - _color1 = BF_GLOBALS._scenePalette._colors.background; - _color2 = _color3 = 0; - - SceneText::setup(msg); - - // Center the text on-screen - reposition(); - _bounds.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); - - // Set the new position - _position.x = _bounds.left; - _position.y = _bounds.top; -} - -void Scene109::Text::synchronize(Serializer &s) { - SceneText::synchronize(s); - SYNC_POINTER(_action); - s.syncAsUint32LE(_frameNumber); - s.syncAsSint16LE(_diff); -} - -void Scene109::Text::dispatch() { - if (_diff) { - uint32 frameNumber = BF_GLOBALS._events.getFrameNumber(); - if (_frameNumber < frameNumber) { - _diff -= frameNumber - _frameNumber; - _frameNumber = frameNumber; - - if (_diff <= 0) { - // Time has expired, so remove the text and signal the designated action - remove(); - if (_action) - _action->signal(); - } - } - } + setAction(&scene->_sequenceManager3, this, 108, &scene->_drunk, NULL); } /*--------------------------------------------------------------------------*/ @@ -405,21 +353,21 @@ void Scene109::postInit(SceneObjectList *OwnerList) { _object2.setPosition(Common::Point(104, 64)); _object2.hide(); - _object9.postInit(); - _object9.setVisage(115); - _object9.setStrip(4); - _object9.setFrame(1); - _object9.setPosition(Common::Point(262, 29)); - _object9.hide(); + _beerSign.postInit(); + _beerSign.setVisage(115); + _beerSign.setStrip(4); + _beerSign.setFrame(1); + _beerSign.setPosition(Common::Point(262, 29)); + _beerSign.hide(); - _object5.postInit(); - _object5.hide(); + _cop1.postInit(); + _cop1.hide(); - _object7.postInit(); - _object7.hide(); + _cop2.postInit(); + _cop2.hide(); - _object10.postInit(); - _object10.hide(); + _animationInset.postInit(); + _animationInset.hide(); BF_GLOBALS._player.disableControl(); setAction(&_action1, this); @@ -433,11 +381,2749 @@ void Scene109::signal() { } /*-------------------------------------------------------------------------- + * Scene 110 - Intro - Outside the bar + * + *--------------------------------------------------------------------------*/ + +void Scene110::Action1::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(5); + break; + case 1: + scene->_object8.show(); + scene->_object7.show(); + scene->_object1.show(); + scene->_object4.show(); + scene->_object5.show(); + scene->_object6.show(); + scene->_object9.show(); + scene->_object10.show(); + BF_GLOBALS._v51C44 = 1; + scene->loadScene(110); + setDelay(10); + break; + case 2: + BF_GLOBALS._v51C44 = 1; + scene->_object1.animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point pt(123, 121); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, this); + } + // No break on purpose + case 7: + setDelay(30); + break; + case 4: + // Guy running to the moto + scene->_object1.animate(ANIM_MODE_6, NULL); + break; + case 5: + scene->_object4.setStrip(2); + scene->_object4.setPosition(Common::Point(117, 106)); + scene->_object4.animate(ANIM_MODE_5, this); + break; + case 6: + // Play "Vroum" + scene->_sound.play(31); + // The guy starts the engine + scene->_object4.setStrip(3); + scene->_object4._frame = 1; + scene->_object4.animate(ANIM_MODE_5, NULL); + // The guy looks behind him + scene->_object2.setPosition(Common::Point(227, 190)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 8: + scene->_object2.animate(ANIM_MODE_6, this); + break; + case 9: + scene->_object2.remove(); + scene->_object4.remove(); + scene->_object5.setStrip(4); + scene->_object5.setFrame2(5); + scene->_object5.setPosition(Common::Point(105, 120)); + setDelay(10); + scene->_object6.setPosition(Common::Point(127, 96)); + scene->_object6.animate(ANIM_MODE_2, NULL); + scene->_object6.setAction(&scene->_action2); + scene->_sound.play(22); + break; + case 10: + scene->_object8.setAction(&scene->_action4); + scene->_object5.setFrame2(3); + scene->_object5.setPosition(Common::Point(87, 120)); + setDelay(8); + break; + case 11: + scene->_object5.setFrame2(4); + scene->_object5.setPosition(Common::Point(62, 122)); + setDelay(6); + break; + case 12: + scene->_object5.setFrame2(5); + scene->_object5.setPosition(Common::Point(35, 120)); + scene->_object5.fixPriority(70); + setDelay(4); + break; + case 13: + scene->_object5.setFrame2(6); + scene->_object5.setPosition(Common::Point(22, 111)); + setDelay(2); + break; + case 14: + scene->_object5.setFrame2(7); + scene->_object5.setPosition(Common::Point(19, 99)); + setDelay(2); + break; + case 15: + scene->_object5.setFrame2(8); + scene->_object5.setPosition(Common::Point(54, 76)); + setDelay(1); + break; + case 16: { + Common::Point pt(182, 54); + NpcMover *mover = new NpcMover(); + scene->_object5.addMover(mover, &pt, this); + } + break; + case 17: + scene->_object5.remove(); + break; + default: + break; + } +} + +void Scene110::Action2::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + Common::Point pt(152, 94); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 1: { + Common::Point pt(167, 108); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 2: { + Common::Point pt(172, 109); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 3: { + Common::Point pt(179, 117); + NpcMover *mover = new NpcMover(); + scene->_object6.addMover(mover, &pt, this); + } + break; + case 4: + setDelay(30); + break; + case 5: + scene->_object6.animate(ANIM_MODE_NONE, NULL); + break; + default: + break; + } +} + +void Scene110::Action3::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3); + break; + case 1: + scene->_object7.setPosition(scene->_object7._position); + scene->_object1.setFrame(2); + setDelay(1); + break; + case 2: + scene->_object1.setFrame(3); + setDelay(1); + break; + case 3: + scene->_object1.setFrame(4); + scene->_object7.animate(ANIM_MODE_5, this); + break; + case 4: { + scene->_object1.animate(ANIM_MODE_6, NULL); + scene->_object7.setPosition(Common::Point(205, 99)); + scene->_object7.setStrip(2); + scene->_object7.animate(ANIM_MODE_1, NULL); + scene->_object7.changeZoom(90); + Common::Point pt(151, 88); + NpcMover *mover = new NpcMover(); + scene->_object7.addMover(mover, &pt, this); + } + break; + case 5: + scene->_object7.fixPriority(76); + scene->_object7.setStrip(3); + scene->_object7.changeZoom(90); + scene->_object7.setFrame(1); + scene->_object7.animate(ANIM_MODE_5, this); + scene->_object10.animate(ANIM_MODE_5, NULL); + break; + case 6: + scene->_object7.fixPriority(73); + scene->_object10.animate(ANIM_MODE_6, this); + break; + case 7: { + scene->_object7._yDiff = 1000; + scene->_object10.remove(); + scene->_object9.setFrame2(2); + Common::Point pt(230, 53); + NpcMover *mover = new NpcMover(); + scene->_object9.addMover(mover, &pt, this); + scene->_sound.play(23); + } + break; + case 8: + scene->_object9.remove(); + BF_GLOBALS._sceneManager.changeScene(125); + break; + default: + break; + } +} + +void Scene110::Action3::dispatch() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + Action::dispatch(); + if ((_actionIndex == 5) && (scene->_object7._percent > 80)) + scene->_object7.changeZoom(scene->_object7._percent - 1); +} + +void Scene110::Action4::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object8.setPosition(scene->_object8._position); + scene->_object1.setFrame(2); + setDelay(1); + break; + case 1: + scene->_object1.setFrame(3); + setDelay(1); + break; + case 2: { + scene->_object1.setFrame(4); + scene->_object8.fixPriority(90); + Common::Point pt(194, 119); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 3: + scene->_object1.animate(ANIM_MODE_6, NULL); + scene->_object8.setPosition(Common::Point(186, 117)); + scene->_object8.setStrip(2); + scene->_object8.setFrame(1); + scene->_object3.setPosition(scene->_object3._position); + scene->_object3.setFrame(1); + setDelay(7); + break; + case 4: + scene->_object8.setFrame2(2); + scene->_object3.setFrame(3); + setDelay(7); + break; + case 5: + scene->_object8.setFrame2(3); + scene->_object3.setFrame(3); + setDelay(7); + scene->_object6.remove(); + break; + case 6: + scene->_object8.setFrame2(4); + scene->_object3.setFrame(4); + setDelay(7); + break; + case 7: + scene->_object8.setFrame2(5); + scene->_object3.setFrame(5); + setDelay(7); + break; + case 8: + scene->_object8.setFrame2(7); + scene->_object3.setFrame(6); + setDelay(30); + break; + case 9: { + scene->_object3.remove(); + scene->_object8.setFrame2(-1); + scene->_object8.setPosition(Common::Point(176, 105)); + scene->_object8.animate(ANIM_MODE_1, NULL); + scene->_object8.setStrip(3); + Common::Point pt(141, 94); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + scene->_object7.setAction(&scene->_action3); + } + break; + case 10: { + scene->_object8.fixPriority(77); + Common::Point pt(78, 76); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 11: { + scene->_object8.setPosition(Common::Point(87, 76)); + scene->_object8.fixPriority(71); + scene->_object8.setStrip(6); + scene->_object8.changeZoom(75); + Common::Point pt(103, 74); + NpcMover *mover = new NpcMover(); + scene->_object8.addMover(mover, &pt, this); + } + break; + case 12: + scene->_object8.setPosition(Common::Point(119, 59)); + scene->_object8.setStrip(5); + scene->_object8.changeZoom(100); + scene->_object8.animate(ANIM_MODE_5, this); + break; + case 13: + scene->_object8.setPosition(Common::Point(119, 59), 300); + break; + default: + break; + } +} + +void Scene110::Action4::dispatch() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + Action::dispatch(); + if ((_actionIndex > 9) && (_actionIndex < 12) && (scene->_object8._percent > 80)) + scene->_object8.changeZoom(scene->_object8._percent - 1); +} + +void Scene110::Action5::signal() { + Scene110 *scene = (Scene110 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object3.setPosition(scene->_object3._position); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 1: + scene->_object3.remove(); + break; + default: + break; + } +} + +void Scene110::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(999); + _object8.postInit(); + _object8.setVisage(112); + _object8.setPosition(Common::Point(239, 98), 300); + _object8.setFrame(1); + _object8.setStrip(1); + _object8.changeZoom(90); + _object8.fixPriority(90); + _object8.animate(ANIM_MODE_1, NULL); + _object8._moveDiff.x = 7; + _object8._moveDiff.y = 3; + _object8.hide(); + + _object3.postInit(); + _object3.setVisage(112); + _object3.setPosition(Common::Point(247, 190), 300); + _object3.setFrame(1); + _object3.setStrip(4); + _object3.changeZoom(100); + _object3.fixPriority(255); + + _object7.postInit(); + _object7.setVisage(113); + _object7.setPosition(Common::Point(236, 86), 300); + _object7._frame = 1; + _object7.setStrip(1); + _object7.changeZoom(110); + _object7.fixPriority(89); + _object7._moveDiff.x = 7; + _object7._moveDiff.y = 3; + _object7.hide(); + + _object1.postInit(); + _object1.setVisage(110); + _object1.setPosition(Common::Point(216, 88), 0); + _object1._frame = 1; + _object1.setStrip(1); + _object1.changeZoom(100); + _object1.fixPriority(83); + _object1.hide(); + + _object2.postInit(); + _object2.setVisage(111); + _object2.setPosition(Common::Point(527, 190), 0); + _object2._frame = 1; + _object2.fixPriority(250); + _object2.setStrip(5); + _object2.changeZoom(100); + + _object4.postInit(); + _object4.setVisage(111); + _object4.setPosition(Common::Point(253, 98), 0); + _object4._frame = 1; + _object4.setStrip(1); + _object4.changeZoom(100); + _object4.fixPriority(90); + _object4.animate(ANIM_MODE_1, NULL); + _object4._moveDiff.x = 10; + _object4._moveDiff.y = 10; + _object4.hide(); + + _object5.postInit(); + _object5.setVisage(111); + _object5.setPosition(Common::Point(114, 119), 0); + _object5.setFrame2(1); + _object5.setStrip(7); + _object5.fixPriority(70); + _object5.changeZoom(100); + _object5._moveDiff.x = 20; + _object5._moveDiff.y = 20; + _object5.hide(); + + _object6.postInit(); + _object6.setVisage(111); + _object6.setPosition(Common::Point(527, 96), 0); + _object6._frame = 1; + _object6.setStrip(6); + _object6.changeZoom(100); + _object6.fixPriority(238); + _object6._moveDiff.x = 10; + _object6._moveDiff.y = 10; + _object6.hide(); + + _object9.postInit(); + _object9.setVisage(110); + _object9.setPosition(Common::Point(148, 69), 0); + _object9._frame = 1; + _object9.setStrip(2); + _object9.changeZoom(100); + _object9.fixPriority(72); + _object9._moveDiff.x = 10; + _object9._moveDiff.y = 10; + _object9.hide(); + + _object10.postInit(); + _object10.setVisage(110); + _object10._frame = 1; + _object10.setStrip(3); + _object10.changeZoom(100); + _object10.fixPriority(74); + _object10._moveDiff.x = 10; + _object10._moveDiff.y = 10; + _object10.setPosition(_object9._position); + _object10.hide(); + + setAction(&_action1); +} +/*-------------------------------------------------------------------------- + * Scene 114 - Outside the Bar + * + *--------------------------------------------------------------------------*/ + +bool Scene114::Vechile::startAction(CursorType action, Event &event) { + Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(114, 0); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1142; + if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_lyle.fixPriority(-1); + scene->setAction(&scene->_sequenceManager1, scene, 1142, &BF_GLOBALS._player, &scene->_lyle, NULL); + } else { + Common::Point pt(155, 111); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene114::Door::startAction(CursorType action, Event &event) { + Scene114 *scene = (Scene114 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(114, 1); + return true; + case CURSOR_USE: + BF_GLOBALS._walkRegions.enableRegion(2); + BF_GLOBALS._player.disableControl(); + scene->_lyle.fixPriority(-1); + scene->_sceneMode = 1140; + scene->setAction(&scene->_sequenceManager1, scene, 1140, &BF_GLOBALS._player, this, &scene->_lyle, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene114::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + BF_GLOBALS._sound1.fadeSound(33); + loadScene(110); + + setZoomPercents(85, 80, 105, 100); + BF_GLOBALS._walkRegions.disableRegion(9); + BF_GLOBALS._walkRegions.disableRegion(22); + + _door.postInit(); + _door.setVisage(110); + _door.setPosition(Common::Point(216, 88)); + BF_GLOBALS._sceneItems.push_front(&_door); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1358); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(155, 111)); + BF_GLOBALS._player._moveDiff.x = 3; + BF_GLOBALS._player._moveDiff.y = 2; + BF_GLOBALS._player.changeZoom(-1); + + _lyle.postInit(); + _lyle.setVisage(1359); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setPosition(Common::Point(-118, -146)); + _lyle.changeZoom(-1); + _lyle._moveDiff.x = 2; + _lyle._moveDiff.y = 1; + _lyle.hide(); + _lyle.setDetails(114, 2, -1, -1, 1, NULL); + + _vechile.postInit(); + if (BF_GLOBALS.getFlag(fWithLyle)) { + _vechile.setVisage(444); + _vechile.setPosition(Common::Point(127, 78)); + _vechile.fixPriority(20); + BF_GLOBALS._player.setPosition(Common::Point(139, 79)); + _lyle.setPosition(Common::Point(86, 79)); + _lyle.show(); + } else { + _vechile.setVisage(380); + _vechile.setPosition(Common::Point(128, 125)); + _vechile.setFrame(1); + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setStrip(2); + _vechile.changeZoom(70); + BF_GLOBALS._player.setVisage(352); + } else { + _vechile.setStrip(1); + _vechile.changeZoom(77); + } + BF_GLOBALS._walkRegions.disableRegion(17); + } + BF_GLOBALS._sceneItems.push_front(&_vechile); + BF_GLOBALS._walkRegions.disableRegion(2); + + if (BF_GLOBALS._sceneManager._previousScene == 115) { + BF_GLOBALS._player.setPosition(Common::Point(219, 100)); + BF_GLOBALS._player.setStrip(6); + _lyle.setPosition(Common::Point(253, 110)); + _lyle.fixPriority(108); + _lyle.setStrip(6); + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _sceneMode = 1141; + setAction(&_sequenceManager1, this, 1141, &_lyle, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + + _item1.setDetails(Rect(0, 0, 320, 200), 114, 3, -1, -1, 1, NULL); +} + +void Scene114::signal() { + switch (_sceneMode) { + case 1140: + BF_GLOBALS._sceneManager.changeScene(115); + break; + case 1141: + BF_GLOBALS._player.enableControl(); + break; + case 1142: + BF_GLOBALS._sceneManager.changeScene(60); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 115 - Inside Tony's bar + * + *--------------------------------------------------------------------------*/ +bool Scene115::Kate::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 8, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1174, scene); + } else if (scene->_jukeboxPlaying == 0) { + if (BF_GLOBALS.getFlag(fShowedIdToKate)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1159, scene); + } else { + scene->_sceneMode = 1167; + scene->setAction(&scene->_action6); + } + } else + scene->setAction(&scene->_action7); + return true; + case INV_MUG_SHOT: + if (scene->_jukeboxPlaying == 0) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + if (BF_GLOBALS._tonyDialogCtr == 0) + scene->_stripManager.start(1167, scene); + else if (BF_GLOBALS.getFlag(fShowedIdToKate)) + scene->_stripManager.start(1159, scene); + else if (BF_GLOBALS.getFlag(fMugOnKate)) + scene->_stripManager.start(1159, scene); + else { + scene->_sceneMode = 9999; + scene->setAction(&scene->_action6); + } + } else + SceneItem::display(115, 44, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case INV_ID: + if (scene->_jukeboxPlaying == 0) { + if (BF_GLOBALS._tonyDialogCtr == 0) { + scene->_sceneMode = 1167; + scene->setAction(&scene->_action6); + } else if (BF_GLOBALS.getFlag(fShowedIdToKate)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(1159, scene); + } else { + BF_GLOBALS.setFlag(fShowedIdToKate); + scene->setAction(&scene->_action8); + } + } else + SceneItem::display(115, 44, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Tony::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 7, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + if (BF_GLOBALS._dayNumber == 3) { + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) + scene->_sceneMode = 1173; + else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) + scene->_sceneMode = 1151; + else if (BF_GLOBALS._tonyDialogCtr == 0) { + scene->_sceneMode = 1150; + BF_GLOBALS.setFlag(fTalkedToTony); + } else + scene->_sceneMode = 1151; + } else if (_talkToTonyCtr2 == 0) { + _talkToTonyCtr2++; + scene->_sceneMode = 1171; + } else + scene->_sceneMode = 1172; + } else if (BF_GLOBALS.getFlag(onDuty)) { + if (scene->_talkToTonyCtr == 0) { + scene->_talkToTonyCtr = 1; + scene->_sceneMode = 1169; + } else + scene->_sceneMode = 1170; + } else if (scene->_talkToTonyCtr == 0) { + scene->_sceneMode = 1171; + scene->_talkToTonyCtr = 1; + } else + scene->_sceneMode = 1172; + + scene->setAction(&scene->_action9); + return true; + case INV_FOREST_RAP: + if (BF_GLOBALS.getFlag(onDuty)) + scene->_sceneMode = 1178; + else + scene->_sceneMode = 1180; + scene->setAction(&scene->_action9); + return true; + case INV_COBB_RAP: + if (BF_GLOBALS.getFlag(onDuty)) + scene->_sceneMode = 1177; + else if (BF_GLOBALS._tonyDialogCtr == 0) + scene->_sceneMode = 1179; + else + scene->_sceneMode = 1154; + + scene->setAction(&scene->_action9); + return true; + case INV_MUG_SHOT: + scene->setAction(&scene->_action2); + return true; + case INV_ID: + if (BF_INVENTORY.getObjectScene(INV_NAPKIN) == 1) { + scene->_sceneMode = 1173; + scene->setAction(&scene->_action9); + } else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + scene->_sceneMode = 1151; + scene->setAction(&scene->_action9); + } else { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fTalkedToTony); + if (BF_GLOBALS._tonyDialogCtr == 0) { + scene->_sceneMode = 1150; + scene->setAction(&scene->_action9); + } else { + BF_GLOBALS._tonyDialogCtr = 1; + scene->setAction(&scene->_action2); + } + } + } else if (_talkToTonyCtr2 == 0) { + _talkToTonyCtr2++; + if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 1182; + scene->setAction(&scene->_action9); + } else { + scene->_sceneMode = 1171; + scene->setAction(&scene->_action9); + } + } else if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 1183; + scene->setAction(&scene->_action9); + } else { + scene->_sceneMode = 1172; + scene->setAction(&scene->_action9); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Object3::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 9, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + SceneItem::display(115, 23, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + Common::Point pt(160, 110); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; + } + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene115::Object4::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 42, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_TALK: + scene->_sceneMode = 0; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.updateAngle(_position); + scene->_stripManager.start(1184, scene); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene115::Jukebox::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (_jokeboxPlayingCtr == 2) + _jokeboxPlayingCtr = 0; + else if (_jokeboxPlayingCtr == 1) { + _jokeboxPlayingCtr = 2; + setAction(&_sequenceManager6, this, 118, &scene->_object12, &scene->_object11, NULL); + } +} + +bool Scene115::Jukebox::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (_jokeboxPlayingCtr == 0) { + _jokeboxPlayingCtr = 1; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action4); + } else + SceneItem::display(_resNum, 37, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else + return NamedHotspot::startAction(action, event); +} + +void Scene115::Jukebox::synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_jokeboxPlayingCtr); +} + +Scene115::Jukebox::Jukebox() { + _jokeboxPlayingCtr = 0; +} + +void Scene115::EventHandler1::dispatch() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS._player.getRegionIndex() == 27) { + scene->_kate.setAction(&scene->_action5); + scene->removeTimer(this); + } +} + +bool Scene115::Item10::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_object4.setStrip2(6); + Common::Point pt(-20, 122); + NpcMover *mover = new NpcMover(); + scene->_object4.addMover(mover, &pt, NULL); + } + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1150; + scene->setAction(&scene->_sequenceManager1, scene, 1150, &BF_GLOBALS._player, NULL); + return true; +} + +bool Scene115::Item14::startAction(CursorType action, Event &event) { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(115, 10, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + if (BF_GLOBALS._sceneObjects->contains(&scene->_object3)) + SceneItem::display(115, 23, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneItem::display(115, 43, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void Scene115::Action1::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + _actionIndex = 2 + BF_GLOBALS._randomSource.getRandomNumber(1); + setDelay(BF_GLOBALS._randomSource.getRandomNumber(180)); + break; + case 2: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 115, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL); + break; + case 3: + _actionIndex = 1; + setAction(&scene->_sequenceManager2, this, 116, &scene->_object3, &scene->_object8, &scene->_object9, &scene->_object10, NULL); + break; + default: + break; + } +} + +void Scene115::Action2::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._tonyDialogCtr < 3) { + if (scene->_tony._position.x > 67) { + scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_tony, NULL); + } else if (scene->_tony._position.x != 67) { + scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_tony, NULL); + } + } + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player); + break; + case 1: + ++BF_GLOBALS._tonyDialogCtr; + if (BF_GLOBALS.getFlag(onDuty)) { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + switch (BF_GLOBALS._tonyDialogCtr) { + case 1: + T2_GLOBALS._uiElements.addScore(30); + scene->_stripManager.start(1181, this); + break; + case 2: + scene->_stripManager.start(1176, this); + break; + default: + scene->_stripManager.start(1155, this); + break; + } + } else { + scene->_stripManager.start(1175, this); + } + } else { + if (BF_GLOBALS.getFlag(fTalkedToTony)) { + switch (BF_GLOBALS._tonyDialogCtr) { + case 1: + T2_GLOBALS._uiElements.addScore(30); + scene->_stripManager.start(1153, this); + break; + case 2: + scene->_stripManager.start(1154, this); + break; + default: + scene->_stripManager.start(1155, this); + break; + } + } else { + scene->_stripManager.start(1152, this); + } + } + break; + case 2: + if (BF_GLOBALS._tonyDialogCtr == 3) + scene->_tony.setAction(&scene->_sequenceManager3, NULL, 3119, &scene->_tony, NULL); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action3::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + setAction(&scene->_sequenceManager4, this, 3117, &scene->_neonSign, NULL); +} + +void Scene115::Action4::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(145, 107); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 1: + BF_GLOBALS._player.setStrip(4); + SceneItem::display(115, 27, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + scene->_object12.animate(ANIM_MODE_NONE); + setDelay(10); + break; + case 2: + setAction(&scene->_sequenceManager1, this, 117, &scene->_object12, &scene->_object11, NULL); + break; + case 3: + scene->_sound1.play(81, &scene->_itemJukebox, 127); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action5::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_itemJukebox._jokeboxPlayingCtr == 0) { + setAction(&scene->_sequenceManager5, this, 1115, &scene->_kate, NULL); + scene->_jukeboxPlaying = 1; + } else { + --_actionIndex; + setDelay(120); + } + break; + case 1: + setAction(&scene->_sequenceManager5, this, 117, &scene->_object12, &scene->_object11, NULL); + break; + case 2: + scene->_sound1.play(81, &scene->_itemJukebox, 127); + scene->_itemJukebox._jokeboxPlayingCtr = 1; + setDelay(3); + break; + case 3: + setAction(&scene->_sequenceManager5, this, 1116, &scene->_kate, NULL); + break; + case 4: + scene->_jukeboxPlaying = 0; + remove(); + default: + break; + } +} + +void Scene115::Action6::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 2115, &scene->_kate, &BF_GLOBALS._player, NULL); + break; + case 1: + if (scene->_sceneMode == 9999) { + setAction(&scene->_sequenceManager1, this, 4115, &scene->_kate, &BF_GLOBALS._player, NULL); + --_actionIndex; + scene->_sceneMode = 1166; + } else { + scene->_stripManager.start(scene->_sceneMode, this); + } + break; + case 2: + scene->_kate.setVisage(131); + scene->_kate.setStrip(1); + scene->_kate.setFrame(1); + scene->_kate.setPosition(Common::Point(122, 97)); + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +void Scene115::Action7::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + BF_GLOBALS._player.disableControl(); + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(142, 105); + BF_GLOBALS._player.addMover(mover, &destPos, this); + } + break; + case 1: + BF_GLOBALS._player.setStrip(4); + if (BF_GLOBALS._kateDialogCtr == 0) + scene->_stripManager.start(1156, this); + else + scene->_stripManager.start(1157, this); + ++BF_GLOBALS._kateDialogCtr; + break; + case 2: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene115::Action8::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setAction(&scene->_sequenceManager1, this, 2115, &scene->_kate, &BF_GLOBALS._player, NULL); + break; + case 1: + T2_GLOBALS._uiElements.addScore(30); + setAction(&scene->_sequenceManager1, this, 4115, &scene->_kate, &BF_GLOBALS._player, NULL); + break; + case 2: + scene->_stripManager.start(1160, this); + break; + case 3: + scene->_stripManager.start(1161, this); + break; + case 4: + BF_GLOBALS.setFlag(fGivenNapkin); + setAction(&scene->_sequenceManager1, this, 2117, &scene->_kate, &BF_GLOBALS._player, &scene->_object13, NULL); + break; + case 5: + BF_INVENTORY.setObjectScene(INV_NAPKIN, 1); + T2_GLOBALS._uiElements.addScore(10); + scene->_kate.setVisage(131); + scene->_kate.setStrip(1); + scene->_kate.setFrame(1); + scene->_kate.setPosition(Common::Point(122, 97)); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene115::Action9::signal() { + Scene115 *scene = (Scene115 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + if (scene->_tony._position.x > 67) + scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1118, &scene->_tony, NULL); + else if (scene->_tony._position.x != 67) + scene->_tony.setAction(&scene->_sequenceManager3, NULL, 1119, &scene->_tony, NULL); + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, 1117, &BF_GLOBALS._player, NULL); + break; + case 1: + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 2: + scene->_tony.setAction(&scene->_sequenceManager3, this, 3119, &scene->_tony, NULL); + break; + case 3: + BF_GLOBALS._player.enableControl(); + remove(); + default: + break; + } +} + +Scene115::Scene115() : SceneExt () { + _lineNumModifier = _jukeboxPlaying = _talkToTonyCtr = 0; +} + +void Scene115::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + BF_GLOBALS._sound1.fadeSound(15); + loadScene(115); + setZoomPercents(98, 85, 115, 100); + _jukeboxPlaying = 0; + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_kateSpeaker); + _stripManager.addSpeaker(&_tonySpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + _object6.postInit(); + _object6.setVisage(121); + _object6.setPosition(Common::Point(82, 66)); + _object6._frame = 1; + _object6.setStrip(5); + _object6.changeZoom(100); + _object6.fixPriority(95); + + _object5.postInit(); + _object5.setVisage(121); + _object5.setPosition(Common::Point(111, 64)); + _object5._frame = 1; + _object5.setStrip(6); + _object5.changeZoom(100); + _object5.fixPriority(95); + + // Bartender + _tony.postInit(); + _tony.setVisage(132); + _tony.setPosition(Common::Point(74, 66)); + _tony.setStrip(3); + _tony.setFrame(1); + _tony.fixPriority(95); + _tony.animate(ANIM_MODE_2, NULL); + _tony._numFrames = 5; + _tony._talkToTonyCtr2 = 0; + _talkToTonyCtr = 0; + + //Neon sign + _neonSign.postInit(); + _neonSign.setVisage(115); + _neonSign.setStrip(4); + _neonSign.setFrame(1); + _neonSign.setPosition(Common::Point(262, 29)); + _neonSign.setAction(&_action3); + + _object11.postInit(); + _object11.hide(); + + _object12.postInit(); + _object12.hide(); + + _object13.postInit(); + _object13.hide(); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.changeZoom(-1); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _object4.postInit(); + _object4.setVisage(469); + _object4.animate(ANIM_MODE_1, NULL); + _object4.setStrip2(1); + _object4.setPosition(Common::Point(-20, 155)); + Common::Point destPos(17, 118); + NpcMover *mover = new NpcMover(); + _object4.addMover(mover, &destPos, NULL); + BF_GLOBALS._sceneItems.push_front(&_object4); + BF_GLOBALS._walkRegions.disableRegion(1); + } else if (BF_GLOBALS.getFlag(onDuty)) + BF_GLOBALS._player.setVisage(1341); + + if (BF_GLOBALS._dayNumber == 3) { + _object3.postInit(); + _object3.setVisage(123); + _object3.setPosition(Common::Point(212, 108)); + _object3.setAction(&_action1); + _lineNumModifier = 0; + BF_GLOBALS._sceneItems.push_front(&_object3); + + _object8.postInit(); + _object8.setVisage(115); + _object8.setPosition(Common::Point(330, 87)); + _object8.setStrip(3); + _object8.fixPriority(112); + + _object9.postInit(); + _object9.setVisage(115); + _object9.setPosition(Common::Point(330, 87)); + _object9.setStrip(3); + _object9.fixPriority(112); + + _object10.postInit(); + _object10.setVisage(115); + _object10.setPosition(Common::Point(330, 87)); + _object10.setStrip(3); + _object10.fixPriority(112); + + if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) { + _kate.postInit(); + _kate.setVisage(131); + _kate.setPosition(Common::Point(122, 97)); + _kate.setStrip(1); + _kate.setFrame(1); + _kate.changeZoom(100); + _kate.fixPriority(95); + BF_GLOBALS._sceneItems.push_front(&_kate); + } + addTimer(&_eventHandler1); + } + BF_GLOBALS._sceneItems.push_front(&_tony); + + _item11.setDetails(16, 115, 4, 15, 21, 1); + _item12.setDetails(20, 115, 5, 15, 21, 1); + _item13.setDetails(31, 115, 6, 16, 22, 1); + _item14._sceneRegionId = 13; + BF_GLOBALS._sceneItems.push_front(&_item14); + _item10.setDetails(Rect(0, 147, 30, 167), 115, -1, -1, -1, 1, NULL); + // SUB_177B8 + addTimer(&_itemJukebox); + _itemJukebox.setDetails(Rect(147, 45, 179, 91), 115, 25, 26, 27, 1, NULL); + // + _item6.setDetails(Rect(107, 43, 122, 61), 115, 28, 29, 30, 1, NULL); + _item7.setDetails(Rect(180, 33, 230, 63), 115, 31, 32, 33, 1, NULL); + _item8.setDetails(Rect( 0, 35, 96, 66), 115, 34, 35, 36, 1, NULL); + _item2.setDetails(Rect( 0, 65, 135, 95), 115, 0, 12, 18, 1, NULL); + _item4.setDetails(Rect(104, 0, 150, 90), 115, 2, 14, 20, 1, NULL); + _item5.setDetails(Rect(148, 0, 320, 93), 115, 3, 14, 20, 1, NULL); + _item3.setDetails(Rect( 0, 95, 320, 168), 115, 1, 13, 19, 1, NULL); + _item9.setDetails(Rect( 0, 0, 320, 168), 115, 11, 17, 24, 1, NULL); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 5115; + setAction(&_sequenceManager1, this, 5115, &BF_GLOBALS._player, NULL); +} + +void Scene115::signal() { + switch (_sceneMode) { + + case 1150: + BF_GLOBALS._sceneManager.changeScene(114); + break; + case 1: + BF_GLOBALS._player.updateAngle(_object3._position); + SceneItem::display(115, 38 + _lineNumModifier, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + ++_lineNumModifier; + if (_lineNumModifier >= 4) + _lineNumModifier = 0; + // No break on purpose + case 0: + // No break on purpose + case 5115: + // No break on purpose + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene115::process(Event &event) { + SceneExt::process(event); + if (!BF_GLOBALS._player._enabled) + return; + if (event.mousePos.y >= 167) + return; + if (_item10._bounds.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } +} + +void Scene115::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_lineNumModifier); + s.syncAsSint16LE(_jukeboxPlaying); + s.syncAsSint16LE(_talkToTonyCtr); +} + +/*-------------------------------------------------------------------------- + * Scene 125 - Intro - Chase in the city + * + *--------------------------------------------------------------------------*/ +void Scene125::Action1::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 1: { + Common::Point destPos(214, 105); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->animate(ANIM_MODE_4, 4, 1, this); + break; + case 3: + owner->setFrame(5); + scene->_object2.show(); + setDelay(180); + break; + case 4: { + Common::Point destPos(311, 85); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 5: + owner->remove(); + break; + case 0: + // No break on purpose + default: + break; + } +} + +void Scene125::Action2::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_action1.signal(); + setDelay(20); + break; + case 2: { + BF_GLOBALS._v501FA = 10; + BF_GLOBALS._v51C44 = 1; + Common::Point destPos(202, 94); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 3: { + scene->_action3.signal(); + Common::Point destPos(280, 84); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 4: + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 5: { + Common::Point destPos(375, 111); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 6: + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 7: { + Common::Point destPos(347, 139); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 8: + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 9: { + Common::Point destPos(107, 75); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + BF_GLOBALS._player.setPriority(80); + break; + } + case 10: + BF_GLOBALS._player.setStrip(4); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 11: { + BF_GLOBALS._player.setPriority(64); + Common::Point destPos(229, 61); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 12: + scene->_action3.signal(); + BF_GLOBALS._player.remove(); + default: + break; + } +} + +void Scene125::Action2::dispatch() { + Action::dispatch(); + + if ((_actionIndex == 10) && (BF_GLOBALS._player._percent > 80)) + BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1); + + if ((_actionIndex == 12) && (BF_GLOBALS._player._percent > 50)) + BF_GLOBALS._player.changeZoom(BF_GLOBALS._player._percent - 1); +} + +void Scene125::Action3::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: { + Common::Point destPos(202, 94); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: { + Common::Point destPos(275, 84); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 3: + scene->_soundExt2.fadeSound(20); + owner->fixPriority(70); + owner->animate(ANIM_MODE_5, this); + break; + case 4: { + Common::Point destPos(375, 111); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 5: + owner->setStrip(2); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 6: { + Common::Point destPos(347, 145); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 7: + owner->setStrip(3); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 8: { + Common::Point destPos(96, 71); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + owner->_moveDiff.x = 6; + owner->_moveDiff.y = 6; + owner->setPriority(80); + break; + } + case 9: + owner->setPosition(Common::Point(85, 76)); + owner->setStrip(4); + owner->setFrame(1); + owner->changeZoom(100); + owner->animate(ANIM_MODE_5, this); + break; + case 10: { + scene->_action5.signal(); + scene->_soundExt1.play(25); + Common::Point destPos(154, 94); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 11: + break; + case 12: + scene->_object1.setPosition(owner->_position); + scene->_object1.changeZoom(2); + scene->_object1.show(); + setDelay(1); + case 13: + BF_GLOBALS._sound1.play(6); + scene->_object1.changeZoom(4); + scene->_object1.setPosition(Common::Point(148, 88)); + setDelay(1); + break; + case 14: + scene->_object1.changeZoom(8); + scene->_object1.setPosition(Common::Point(167, 97)); + setDelay(1); + break; + case 15: + scene->_object1.changeZoom(16); + scene->_object1.setPosition(Common::Point(197, 104)); + scene->_object4.show(); + scene->_object3.show(); + scene->_object4.changeZoom(16); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 9, scene->_object1._position.y - 8)); + scene->_object3.changeZoom(16); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 5, scene->_object1._position.y - 8)); + setDelay(1); + break; + case 16: + scene->_object1.changeZoom(32); + scene->_object1.setPosition(Common::Point(197, 104)); + scene->_object4.changeZoom(32); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 17, scene->_object1._position.y - 15)); + scene->_object3.changeZoom(32); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 12, scene->_object1._position.y - 15)); + setDelay(1); + break; + case 17: + scene->_object1.changeZoom(64); + scene->_object1.setPosition(Common::Point(198, 114)); + scene->_object4.changeZoom(64); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 34, scene->_object1._position.y - 29)); + scene->_object3.changeZoom(64); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 23, scene->_object1._position.y - 29)); + setDelay(1); + break; + case 18: + scene->_object1.changeZoom(100); + scene->_object1.setPosition(Common::Point(160, 112)); + scene->_object4.changeZoom(100); + scene->_object4.setPosition(Common::Point(scene->_object1._position.x - 51, scene->_object1._position.y - 45)); + scene->_object3.changeZoom(100); + scene->_object3.setPosition(Common::Point(scene->_object1._position.x + 42, scene->_object1._position.y - 45)); + scene->_object4.animate(ANIM_MODE_5, this); + scene->_object3.animate(ANIM_MODE_5, this); + setDelay(1); + break; + case 19: + break; + case 20: + setDelay(30); + break; + case 21: + BF_GLOBALS._sceneManager.changeScene(140); + break; + default: + break; + } +} + +void Scene125::Action3::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 9) && (owner->_percent > 70)) + owner->changeZoom(owner->_percent - 1); +} + +void Scene125::Action4::signal() { + Scene125 *scene = (Scene125 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + setDelay(180); + break; + case 1: { + owner->setPriority(scene->_object2._priority - 1); + Common::Point destPos(66, 168); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->animate(ANIM_MODE_5, this); + break; + case 3: { + Common::Point destPos(307, 106); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 4: + owner->remove(); + break; + default: + break; + } +} + +void Scene125::Action4::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 4) && (owner->_percent > 80)) + owner->changeZoom(owner->_percent - 1); +} + +void Scene125::Action5::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + if (_actionIndex++ == 1) { + Common::Point destPos(162, 103); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + } +} + +void Scene125::Action6::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + setDelay(60); + break; + case 1: { + Common::Point destPos(410, 181); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 2: + owner->remove(); + default: + break; + } +} + +void Scene125::Action6::dispatch() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + Action::dispatch(); + + if ((_actionIndex == 2) && (owner->_percent < 100)) + owner->changeZoom(owner->_percent + 1); +} + +void Scene125::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(120); + + _object4.postInit(); + _object4.setVisage(124); + _object4.setPosition(Common::Point(0, 0)); + _object4.setStrip(1); + _object4.setFrame(1); + _object4.fixPriority(251); + _object4.hide(); + + _object3.postInit(); + _object3.setVisage(124); + _object3.setPosition(Common::Point(0, 0)); + _object3.setStrip(2); + _object3.setFrame(1); + _object3.fixPriority(251); + _object3.hide(); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(127); + BF_GLOBALS._player.setPosition(Common::Point(160, 110)); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.changeZoom(100); + BF_GLOBALS._player.fixPriority(68); + BF_GLOBALS._player._moveDiff.x = 6; + BF_GLOBALS._player._moveDiff.y = 6; + BF_GLOBALS._player.disableControl(); + + _object5.postInit(); + _object5.setVisage(128); + _object5.setPosition(Common::Point(150, 117)); + _object5.fixPriority(68); + _object5._moveDiff.x = 6; + _object5._moveDiff.y = 6; + + _object9.postInit(); + _object9.setVisage(126); + _object9.setPosition(Common::Point(124, 106)); + _object9.setStrip(4); + _object9.fixPriority(90); + _object9._moveDiff.x = 3; + _object9._moveDiff.y = 3; + + _object1.postInit(); + _object1.setVisage(130); + _object1.setPosition(Common::Point(139, 88)); + _object1.setStrip(1); + _object1.setFrame(1); + _object1.changeZoom(100); + _object1.fixPriority(250); + _object1.hide(); + + _object8.postInit(); + _object8.setVisage(126); + _object8.setPosition(Common::Point(89, 181)); + _object8.setStrip(3); + _object8._moveDiff.x = 6; + _object8._moveDiff.y = 6; + + _object6.postInit(); + _object6.setVisage(126); + _object6.setPosition(Common::Point(289, 128)); + _object6.fixPriority(69); + _object6._moveDiff.x = 6; + _object6._moveDiff.y = 6; + _object6.setAction(&_action1); + + _object2.postInit(); + _object2.setVisage(126); + _object2.setPosition(Common::Point(214, 105)); + _object2.setStrip(2); + _object2.setFrame(1); + _object2.changeZoom(100); + _object2.fixPriority(63); + _object2.hide(); + + _object7.postInit(); + _object7.setVisage(126); + _object7.setPosition(Common::Point(87, 76)); + _object7.setStrip(6); + _object7.setFrame(6); + _object7.changeZoom(80); + _object7._moveDiff.x = 4; + _object7._moveDiff.y = 4; + _object7.setAction(&_action6); + + BF_GLOBALS._sound1.play(5); + setAction(&_action2); + _object5.setAction(&_action3); + _object8.setAction(&_action4); + _object9.setAction(&_action5); +} + +/*-------------------------------------------------------------------------- + * Scene 140 - Intro - Near the house + * + *--------------------------------------------------------------------------*/ + +void Scene140::Action1::signal() { + Scene140 *scene = (Scene140 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + scene->loadScene(999); + setDelay(2); + break; + case 1: + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); + scene->_text.setup(BF_19840518, this); + break; + case 2: + scene->_object1.show(); + scene->loadScene(140); + setDelay(1); + break; + case 3: { + Common::Point destPos(236, 144); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + owner->_numFrames = 7; + break; + } + case 4: + owner->setStrip(3); + owner->setFrame(1); + owner->_numFrames = 5; + owner->setPosition(Common::Point(226, 143)); + owner->animate(ANIM_MODE_5, this); + break; + case 5: + owner->setStrip(4); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 6: + scene->_object1.animate(ANIM_MODE_5, this); + owner->setStrip(1); + owner->setFrame(1); + break; + case 7: + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x, owner->_position.y + 1)); + owner->animate(ANIM_MODE_5, this); + break; + case 8: + owner->animate(ANIM_MODE_6, this); + owner->_numFrames = 10; + break; + case 9: + owner->_numFrames = 5; + owner->setPosition(Common::Point(217, 117)); + owner->setStrip(2); + owner->animate(ANIM_MODE_5, this); + break; + case 10: + owner->setPosition(Common::Point(212, 117)); + setDelay(10); + // No break on purpose + case 11: + owner->setPosition(owner->_position, 1000); + setDelay(60); + break; + case 12: + BF_GLOBALS._sound1.play(8); + setDelay(60); + // No break on purpose + case 13: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(150); + default: + break; + } +} + +void Scene140::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(999); + + _object2.postInit(); + _object2.setVisage(141); + _object2.setPosition(Common::Point(333, 149)); + _object2.setStrip(5); + _object2.animate(ANIM_MODE_1, NULL); + _object2._moveDiff.x = 3; + + _object1.postInit(); + _object1.setVisage(141); + _object1.setPosition(Common::Point(202, 115)); + _object1.setFrame(1); + _object1.setStrip(6); + _object1.changeZoom(100); + _object1.hide(); + + BF_GLOBALS._v5020C = 0; + BF_GLOBALS._v501F8 = 300; + BF_GLOBALS._v501FC = 90; + BF_GLOBALS._sound1.play(7); + + _object2.setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 150 - Intro - Burglar inside the house + * + *--------------------------------------------------------------------------*/ +void Scene150::Action1::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + static uint32 v50B96 = 0; + + switch (_actionIndex++) { + case 0: + _actionIndex = 5; + _object2.postInit(); + _object2.setVisage(150); + _object2.setStrip(3); + _object2._frame = 1; + _object2.setPosition(Common::Point(148, 126)); + _object2.changeZoom(100); + setDelay(10); + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->_frame = 1; + owner->setStrip(4); + owner->animate(ANIM_MODE_4, 3, 1, this); + break; + case 3: + owner->animate(ANIM_MODE_5, this); + _object2.animate(ANIM_MODE_5, this); + break; + case 4: + _object2.remove(); + break; + case 5: + owner->_numFrames = 8; + owner->_frame = 1; + owner->setStrip(2); + owner->animate(ANIM_MODE_4, 14, 1, this); + break; + case 6: + owner->fixPriority(119); + owner->animate(ANIM_MODE_5, this); + break; + case 7: + setDelay(60); + break; + case 8: + BF_GLOBALS._sound1.stop(); + // No break on purpose + case 9: + _sound1.play(8); + setDelay(30); + break; + case 10: + BF_GLOBALS._scenePalette.addFader((const byte *)&v50B96, 1, 2, this); + break; + case 11: + BF_GLOBALS._sound1.play(9); + BF_GLOBALS._sceneManager.changeScene(160); + break; + default: + break; + } +} + +void Scene150::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(150); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff.x = 15; + BF_GLOBALS._player.hide(); + + _object1.postInit(); + _object1.setVisage(150); + _object1.setPosition(Common::Point(158, 119)); + _object1._numFrames = 5; + _object1.fixPriority(121); + _object1.setAction(&_action1); +} + +/*-------------------------------------------------------------------------- + * Scene 160 - Intro - Burial + * + *--------------------------------------------------------------------------*/ +void Scene160::Action1::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + break; + case 1: + scene->_kid.animate(ANIM_MODE_5, this); + break; + case 2: + // No break on purpose + case 10: + scene->_grandma.animate(ANIM_MODE_5, this); + break; + case 3: + // No break on purpose + case 6: + scene->_kid.animate(ANIM_MODE_6, this); + break; + case 4: + scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 2, scene->_kid._position.y + 19)); + scene->_kid.setFrame(1); + scene->_kid.setStrip(2); + scene->_kid.animate(ANIM_MODE_5, this); + + scene->_kidBody.setPosition(scene->_kid._position); + scene->_kidBody.setFrame(1); + scene->_kidBody.setStrip(3); + break; + case 5: + setDelay(60); + break; + case 7: + scene->_kidBody.remove(); + scene->_kid.setStrip(6); + scene->_kid.setFrame(1); + scene->_kid.setPosition(Common::Point(scene->_kid._position.x - 4, scene->_kid._position.y + 19)); + scene->_grandma.animate(ANIM_MODE_6, this); + scene->_grandma._numFrames = 7; + break; + case 8: + scene->_grandma.setStrip(2); + scene->_grandma.setFrame(1); + scene->_grandma.animate(ANIM_MODE_5, this); + break; + case 9: + setDelay(120); + break; + default: + break; + } +} + +void Scene160::Action2::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + static uint32 v50BAB = 0; + static uint32 v50BC3 = 0; + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + owner->_numFrames = 8; + break; + case 2: + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(scene->_flag._position.x + 56, scene->_flag._position.y + 2)); + owner->animate(ANIM_MODE_5, this); + break; + case 3: + owner->setStrip(3); + owner->setFrame(1); + owner->setPosition(Common::Point(scene->_flag._position.x + 26, scene->_flag._position.y - 8)); + owner->animate(ANIM_MODE_4, 8, 1, this); + break; + case 4: + scene->_flag.remove(); + owner->animate(ANIM_MODE_5, this); + break; + case 5: + owner->setVisage(162); + owner->setStrip(1); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 27, owner->_position.y + 11)); + owner->animate(ANIM_MODE_5, this); + break; + case 6: + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 42, owner->_position.y + 15)); + owner->animate(ANIM_MODE_5, this); + break; + case 7: + owner->setStrip(3); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 1, owner->_position.y)); + owner->animate(ANIM_MODE_5, this); + break; + case 8: + owner->setStrip(4); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 3, owner->_position.y - 1)); + + scene->_leftOfficer.show(); + scene->_leftOfficer.setStrip(1); + scene->_leftOfficer.setFrame(1); + scene->_leftOfficer.setPosition(Common::Point(owner->_position.x + 8, owner->_position.y - 39)); + scene->_leftOfficer._numFrames = 5; + scene->_leftOfficer.animate(ANIM_MODE_5, this); + break; + case 9: + setDelay(30); + break; + case 10: + scene->_leftOfficer.hide(); + owner->setVisage(163); + owner->setStrip(2); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x + 39, owner->_position.y)); + owner->animate(ANIM_MODE_5, this); + break; + case 11: + scene->_leftOfficer.fixPriority(owner->_priority + 1); + setDelay(60); + break; + case 12: + scene->_leftOfficer.show(); + scene->_leftOfficer.setPosition(Common::Point(owner->_position.x - 32, owner->_position.y - 38)); + scene->_leftOfficer.setStrip(3); + scene->_leftOfficer.setFrame(1); + + owner->setVisage(165); + owner->setPosition(Common::Point(owner->_position.x + 6, owner->_position.y - 3)); + owner->setStrip(1); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 13: { + owner->setStrip(2); + owner->setFrame(1); + owner->changeZoom(110); + owner->animate(ANIM_MODE_1, NULL); + Common::Point destPos(scene->_kid._position.x - 25, scene->_kid._position.y + 15); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 14: + owner->changeZoom(100); + owner->setStrip(5); + owner->setFrame(1); + scene->_kid.animate(ANIM_MODE_4, 5, 1, this); + break; + case 15: + owner->animate(ANIM_MODE_5, this); + scene->_kid.animate(ANIM_MODE_5, NULL); + break; + case 16: + owner->setStrip(6); + owner->setFrame(1); + owner->setPosition(Common::Point(owner->_position.x - 8, owner->_position.y + 3)); + owner->animate(ANIM_MODE_5, this); + break; + case 17: + setDelay(70); + break; + case 18: + owner->animate(ANIM_MODE_6, this); + break; + case 19: + setDelay(120); + break; + case 20: + BF_GLOBALS._sound1.changeSound(10); + BF_GLOBALS._scenePalette.addFader((const byte *)&v50BAB, 1, 2, this); + break; + case 21: + BF_GLOBALS._scenePalette.loadPalette(2); + scene->loadScene(999); + setDelay(2); + break; + case 22: + scene->_sceneBounds.set(0, 0, 320, 200); + scene->_text.setup(BF_11_YEARS, this); + break; + case 23: + BF_GLOBALS._scenePalette.loadPalette(2); + scene->loadScene(165); + BF_GLOBALS._scenePalette.addFader((const byte *)&v50BC3, 1, -5, this); + break; + case 24: + setDelay(900); + break; + case 25: + BF_GLOBALS._sound1.fade(0, 10, 10, true, this); +// FIXME: Currently, fade() doesn't end properly with this song, +// thus never returns here. This hack skips the wait and changes +// directly to the next scene +// Start of hack +// break; +// case 26: + setDelay(5); + BF_GLOBALS._sound1.stop(); +// End of hack + + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(200); + break; + default: + break; + } +} + +void Scene160::Action2::process(Event &event) { + if ((event.handled) || (event.eventType == 5)) + return; + + if (_actionIndex == 25) { + event.handled = true; + setDelay(1); + } +} + +void Scene160::Action3::signal() { + Scene160 *scene = (Scene160 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_text.setup(BF_3_DAYS, this); + break; + case 1: { + Common::Point destPos(720, 100); + NpcMover *mover = new NpcMover(); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 2: + scene->_action1.signal(); + scene->_action2.signal(); + break; + default: + break; + } +} + +void Scene160::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(160); + _sceneBounds.moveTo(0, 0); + + BF_GLOBALS._scenePalette.loadPalette(2); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff.x = 15; + BF_GLOBALS._player.hide(); + + _grandma.postInit(); + _grandma.setVisage(54); + _grandma.setPosition(Common::Point(712, 97)); + _grandma.fixPriority(66); + + _kid.postInit(); + _kid.setPosition(Common::Point(732, 65)); + _kid.setVisage(164); + _kid.setStrip(4); + _kid.fixPriority(68); + + _kidBody.postInit(); + _kidBody.setPosition(Common::Point(_kid._position.x, _kid._position.y)); + _kidBody.setVisage(164); + _kidBody.setStrip(5); + _kidBody.fixPriority(68); + + _flag.postInit(); + _flag.setPosition(Common::Point(645, 116)); + _flag.setVisage(161); + _flag.setStrip(4); + _flag.fixPriority(80); + + _rightOfficer.postInit(); + _rightOfficer.setVisage(161); + _rightOfficer.setPosition(Common::Point(_flag._position.x + 58, _flag._position.y + 11)); + _rightOfficer.fixPriority(81); + + _leftOfficer.postInit(); + _leftOfficer.setVisage(163); + _leftOfficer.setPosition(Common::Point(620, 79)); + _leftOfficer.setStrip(3); + _leftOfficer.fixPriority(81); + _leftOfficer.hide(); + + _rightOfficer.setAction(&_action2); + _grandma.setAction(&_action1); + setAction(&_action3); + + _sceneBounds.center(BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y); +} + +/*-------------------------------------------------------------------------- + * Scene 180 - Front of Home + * + *--------------------------------------------------------------------------*/ + +bool Scene180::Vechile::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_GLOBALS._sceneManager.changeScene(60); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene180::GarageExit::startAction(CursorType action, Event &event) { + Scene180 *scene = (Scene180 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_garageExit.contains(event.mousePos)) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 256, 114); + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene180::Scene180(): SceneExt() { + _dispatchMode = 0; +} + +void Scene180::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_dispatchMode); +} + +void Scene180::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + + if (((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) || + ((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) || + ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) + loadScene(999); + else + loadScene(1180); + _garageExit.setDetails(Rect(243, 93, 275, 122), 180, -1, -1, -1, 1, NULL); + _gameTextSpeaker._textPos.y = 180; + _stripManager.addSpeaker(&_gameTextSpeaker); + _dispatchMode = 0; + setZoomPercents(121, 60, 125, 70); + + if ((BF_GLOBALS._bookmark == bLyleStoppedBy) && (BF_GLOBALS._dayNumber == 1)) { + BF_GLOBALS._v501FC = 87; + BF_GLOBALS._v501FA = _sceneBounds.left + 10; + // CHECKME: BF_GLOBALS._v50206 = 18; ?? + _sceneMessage.setup(THE_NEXT_DAY); + _sceneMode = 6; + setAction(&_sceneMessage, this); + BF_GLOBALS._driveFromScene = 4; + BF_GLOBALS._driveToScene = 4; + BF_GLOBALS._mapLocationId = 4; + } else if (((BF_GLOBALS._bookmark == bDroppedOffLyle) && (BF_GLOBALS._dayNumber == 3)) || + ((BF_GLOBALS._bookmark == bDoneAtLyles) && (BF_GLOBALS._dayNumber == 4))) { + BF_GLOBALS._v501FC = 87; + BF_GLOBALS._v501FA = _sceneBounds.left + 10; + // CHECKME: BF_GLOBALS._v50206 = 18; ?? + _sceneMessage.setup(THE_NEXT_DAY); + _sceneMode = 6; + setAction(&_sceneMessage, this); + } else if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + _vechile.postInit(); + _garageExit.postInit(); + + BF_GLOBALS._driveToScene = 190; + BF_GLOBALS._sound1.play(31); + BF_GLOBALS._sound1.holdAt(1); + _sceneMode = 1800; + + setAction(&_sequenceManager, this, 1800, &_vechile, &_object1, NULL); + } else if (BF_GLOBALS._driveFromScene == 180) { + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(831); + BF_GLOBALS._player.setPosition(Common::Point(285, 125)); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.changeZoom(-1); + + _vechile.postInit(); + _vechile.setVisage(580); + _vechile.setStrip(2); + _vechile.setPosition(Common::Point(262, 131)); + _vechile.setZoom(65); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + _object1.setFrame(6); + + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS._driveToScene != 180) { + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + + _vechile.postInit(); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + + BF_GLOBALS._driveFromScene = 4; + BF_GLOBALS._driveToScene = 4; + BF_GLOBALS._mapLocationId = 4; + + BF_GLOBALS._sound1.fadeSound(33); + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL); + } else { + BF_GLOBALS._driveFromScene = 0; + if (!BF_GLOBALS.getFlag(onDuty) && !BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + + _vechile.postInit(); + _vechile.setVisage(181); + _vechile.setStrip(2); + _vechile.changeZoom(80); + _vechile.fixPriority(150); + _vechile._moveDiff = Common::Point(40, 5); + _vechile.setPosition(Common::Point(-25, 171)); + + _dispatchMode = 1; + + BF_GLOBALS._sound1.play(29); + _sceneMode = 1; + ADD_MOVER(_vechile, 259, 150); + } else { + BF_GLOBALS._player.setPosition(Common::Point(0, 150)); + + _object1.postInit(); + _object1.setVisage(182); + _object1.setStrip(2); + _object1.setPosition(Common::Point(258, 122)); + + _vechile.postInit(); + if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._sound1.play(29); + + _vechile.setVisage(191); + _vechile.setStrip(3); + _vechile._frame = 5; + _vechile.changeZoom(75); + + _dispatchMode = 1; + _vechile._moveDiff.x = 45; + } else { + _vechile.setVisage(444); + _vechile.setStrip(2); + _vechile.changeZoom(85); + + _dispatchMode = 3; + _vechile._moveDiff.x = 30; + } + + _vechile.fixPriority(150); + _vechile._moveDiff.y = 5; + _vechile.setPosition(Common::Point(-25, 171)); + + _sceneMode = 3; + ADD_MOVER(_vechile, 258, 145); + } + } + + if (_sceneMode != 6) { + _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL); + _driveway.setDetails(8, 180, 36, 37, 38, 1); + _street.setDetails(1, 180, 21, 22, 23, 1); + _lawn.setDetails(3, 180, 18, 19, 20, 1); + _bushes.setDetails(4, 180, 15, 16, 17, 1); + _palms.setDetails(6, 180, 12, 13, 14, 1); + _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL); + _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL); + _house.setDetails(5, 180, 24, 25, 26, 1); + _steps.setDetails(7, 180, 6, 7, 8, 1); + _curb.setDetails(2, 180, 3, 4, 5, 1); + _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL); + } +} + +void Scene180::signal() { + switch (_sceneMode) { + case 1: + _dispatchMode = 0; + switch (BF_GLOBALS._bookmark) { + case bFlashBackThree: + BF_GLOBALS._bookmark = bDroppedOffLyle; + _sceneMode = 7; + break; + case bDoneWithIsland: + BF_GLOBALS._bookmark = bDoneAtLyles; + _sceneMode = 8; + break; + default: + _sceneMode = 1802; + break; + } + + setAction(&_sequenceManager, this, 1802, &_vechile, &_object1, NULL); + break; + case 2: + _dispatchMode = 0; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene); + break; + case 3: + _dispatchMode = 0; + BF_GLOBALS._sound1.stop(); + _stripManager.start(1800, this); + _sceneMode = 4; + break; + case 4: + _sceneMode = 5; + BF_GLOBALS._sound1.fadeSound(29); + ADD_MOVER(_vechile, 340, 140); + _vechile._moveDiff.y = 1; + break; + case 5: + BF_GLOBALS._sceneManager.changeScene(50); + break; + case 6: + loadScene(1180); + BF_GLOBALS._sound1.fadeSound(33); + + switch (BF_GLOBALS._bookmark) { + case bLyleStoppedBy: + BF_GLOBALS._dayNumber = 2; + BF_INVENTORY.alterInventory(2); + break; + case bDroppedOffLyle: + BF_GLOBALS._dayNumber = 4; + BF_INVENTORY.alterInventory(4); + break; + case bDoneAtLyles: + BF_GLOBALS._dayNumber = 5; + BF_INVENTORY.alterInventory(5); + break; + default: + break; + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + + _vechile.postInit(); + _vechile.setDetails(180, 33, 34, 35, 1, NULL); + + _object1.postInit(); + _sceneMode = 1801; + setAction(&_sequenceManager, this, 1801, &BF_GLOBALS._player, &_vechile, &_object1, NULL); + + _frontDoor.setDetails(Rect(183, 92, 218, 122), 180, 27, 28, 29, 1, NULL); + _driveway.setDetails(8, 180, 36, 37, 38, 1); + _street.setDetails(1, 180, 21, 22, 23, 1); + _lawn.setDetails(3, 180, 18, 19, 20, 1); + _bushes.setDetails(4, 180, 15, 16, 17, 1); + _palms.setDetails(6, 180, 12, 13, 14, 1); + _garage.setDetails(Rect(241, 85, 319, 121), 180, 30, 31, 32, 1, NULL); + _fence.setDetails(Rect(0, 109, 21, 125), 180, 9, 10, 11, 1, NULL); + _house.setDetails(4, 180, 24, 25, 26, 1); + _steps.setDetails(7, 180, 6, 7, 8, 1); + _curb.setDetails(2, 180, 3, 4, 5, 1); + _sky.setDetails(Rect(0, 0, 319, 190), 180, 0, 1, 2, 1, NULL); + break; + case 7: + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0); + BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 0); + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0); + BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 0); + BF_INVENTORY.setObjectScene(INV_NAPKIN, 0); + BF_INVENTORY.setObjectScene(INV_9MM_BULLETS, 0); + BF_INVENTORY.setObjectScene(INV_SCHEDULE, 0); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0); + + BF_GLOBALS._sceneManager.changeScene(180); + break; + case 8: + if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) || + BF_GLOBALS.getFlag(fLeftTraceIn920)) { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._sceneManager.changeScene(271); + } else { + BF_GLOBALS._sceneManager.changeScene(180); + } + break; + case 1800: + _dispatchMode = 2; + _vechile._moveDiff.x = 10; + _sceneMode = 2; + ADD_MOVER(_vechile, -25, 171); + break; + case 1801: + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.enableControl(); + break; + case 1802: + BF_GLOBALS._sound1.release(); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + BF_GLOBALS._sceneManager.changeScene(270); + break; + default: + break; + } +} + +void Scene180::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + if (_vechile.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else if (_garageExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW); + 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); + } + } +} + +void Scene180::dispatch() { + switch (_dispatchMode) { + case 1: + if (_vechile._mover && (_vechile._percent > 50)) + _vechile.changeZoom(_vechile._percent - 1); + if (_vechile._moveDiff.x > 15) + --_vechile._moveDiff.x; + break; + case 2: + if (_vechile._mover && (_vechile._percent < 100)) + _vechile.changeZoom(_vechile._percent + 1); + if (_vechile._moveDiff.x < 35) + ++_vechile._moveDiff.x; + break; + case 3: + if (_vechile._mover && (_vechile._percent > 70)) + _vechile.changeZoom(_vechile._percent - 1); + if (_vechile._moveDiff.x > 15) + --_vechile._moveDiff.x; + break; + default: + break; + } + + SceneExt::dispatch(); + + if (!_action && (BF_GLOBALS._player._position.y < 120)) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._driveToScene = 0; + BF_GLOBALS._driveFromScene = 0; + + if (BF_GLOBALS.getFlag(fLeftTraceIn900) || BF_GLOBALS.getFlag(fGotPointsForSearchingDA) || + BF_GLOBALS.getFlag(fLeftTraceIn920)) + BF_GLOBALS._sceneManager.changeScene(271); + else + BF_GLOBALS._sceneManager.changeScene(270); + } +} + +/*-------------------------------------------------------------------------- * Scene 190 - Front of Police Station * *--------------------------------------------------------------------------*/ -bool Scene190::Object4::startAction(CursorType action, Event &event) { +bool Scene190::LyleCar::startAction(CursorType action, Event &event) { Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -505,14 +3191,14 @@ void Scene190::Action1::signal() { } case 2: scene->_sound.play(82); - scene->_object2.animate(ANIM_MODE_5, this); + scene->_door.animate(ANIM_MODE_5, this); break; case 3: ADD_MOVER(BF_GLOBALS._player, 180, 86); break; case 4: scene->_sound.play(82); - scene->_object2.animate(ANIM_MODE_6, this); + scene->_door.animate(ANIM_MODE_6, this); break; case 5: BF_GLOBALS._sound1.fadeOut2(NULL); @@ -534,12 +3220,17 @@ void Scene190::postInit(SceneObjectList *OwnerList) { (BF_GLOBALS._sceneManager._previousScene == 20)) { // clearScreen(); } - if (BF_GLOBALS._dayNumber == 0) + if (BF_GLOBALS._dayNumber == 0) { // If at start of game, change to first day BF_GLOBALS._dayNumber = 1; + // To be checked: Not present in the original + g_globals->_sceneManager._previousScene = 100; + } + SceneExt::postInit(); // Load the scene data loadScene(190); + BF_GLOBALS._scenePalette.loadPalette(2); _stripManager.addSpeaker(&_speaker); @@ -547,18 +3238,20 @@ void Scene190::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.disableControl(); // Initialise objects - _object2.postInit(); - _object2.setVisage(190); - _object2.setStrip(1); - _object2.setPosition(Common::Point(179, 88)); + _door.postInit(); + _door.setVisage(190); + _door.setStrip(1); + _door.setPosition(Common::Point(179, 88)); + + _flag.postInit(); + _flag.setVisage(190); + _flag.setStrip(2); + _flag.fixPriority(200); + _flag.setPosition(Common::Point(170, 31)); + _flag.animate(ANIM_MODE_7, 0, NULL); + _flag.setDetails(190, 8, 26, 19, 1, NULL); - _object3.postInit(); - _object3.setVisage(190); - _object3.setStrip(2); - _object3.fixPriority(200); - _object3.setPosition(Common::Point(170, 31)); - _object3.animate(ANIM_MODE_7, 0, NULL); - _object3.setDetails(190, 8, 26, 19, 1, NULL); + _fieldB52 = true; if (BF_GLOBALS.getFlag(fWithLyle)) { BF_GLOBALS._player.setVisage(303); @@ -566,11 +3259,11 @@ void Scene190::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); BF_GLOBALS._player._moveDiff = Common::Point(3, 1); - _object4.postInit(); - _object4.setVisage(444); - _object4.setFrame(2); - _object4.setPosition(Common::Point(54, 114)); - _object4.setDetails(190, -1, -1, -1, 1, NULL); + _lyleCar.postInit(); + _lyleCar.setVisage(444); + _lyleCar.setFrame(2); + _lyleCar.setPosition(Common::Point(54, 114)); + _lyleCar.setDetails(190, -1, -1, -1, 1, NULL); switch (BF_GLOBALS._sceneManager._previousScene) { case 300: { @@ -581,7 +3274,7 @@ void Scene190::postInit(SceneObjectList *OwnerList) { } case 315: _sceneMode = 1901; - setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_object2, NULL); + setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_door, NULL); break; case 50: case 60: @@ -615,13 +3308,15 @@ void Scene190::postInit(SceneObjectList *OwnerList) { case 315: BF_GLOBALS._player._moveDiff = Common::Point(3, 1); _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 1900 : 1901; - setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object2, NULL); + setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_door, NULL); break; case 50: case 60: default: BF_GLOBALS.setFlag(onBike); BF_GLOBALS._player.disableControl(); + // To be checked: Not present in the original + T2_GLOBALS._uiElements._active = true; _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 192 : 190; setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL); break; @@ -644,7 +3339,7 @@ void Scene190::postInit(SceneObjectList *OwnerList) { _item6.setDetails(4, 190, 2, 10, 13, 1); _item5.setDetails(3, 190, 3, 10, 14, 1); _item9.setDetails(Rect(0, 0, 89, 68), 190, 6, 10, 17, 1, NULL); - _item10.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 190, 23, -1, -1, 1, NULL); + _item10.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 190, 23, -1, -1, 1, NULL); } void Scene190::signal() { @@ -680,7 +3375,7 @@ void Scene190::signal() { void Scene190::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(3); @@ -707,6 +3402,11 @@ void Scene190::dispatch() { } } +void Scene190::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldB52); +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes1.h b/engines/tsage/blue_force/blueforce_scenes1.h index 3fd38e35ca..b304c2aeaa 100644 --- a/engines/tsage/blue_force/blueforce_scenes1.h +++ b/engines/tsage/blue_force/blueforce_scenes1.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "tsage/blue_force/blueforce_logic.h" +#include "tsage/blue_force/blueforce_speakers.h" #include "tsage/converse.h" #include "tsage/events.h" #include "tsage/core.h" @@ -94,39 +95,344 @@ class Scene109: public PalettedScene { virtual void signal(); }; - /* Texts */ - class Text: public SceneText { +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SequenceManager _sequenceManager4, _sequenceManager5, _sequenceManager6; + SequenceManager _sequenceManager7, _sequenceManager8; + SceneObject _object1, _object2, _protaginist2, _protaginist1, _cop1; + SceneObject _drunk, _cop2, _bartender, _beerSign, _animationInset; + IntroSceneText _text; + Action1 _action1; + Action2 _action2; + Action3 _action3; +public: + Scene109(); + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene110: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action4: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; +public: + NamedObject _object1, _object2, _object3, _object4, _object5, _object6, _object7, _object8, _object9, _object10; + ASound _sound; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); +}; + +class Scene114: public SceneExt { + /* Objects */ + class Vechile: public NamedObject { public: - Action *_action; - uint32 _frameNumber; - int _diff; + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { public: - Text(); - void setup(const Common::String &msg, Action *action); + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1; + Vechile _vechile; + Door _door; + NamedObject _lyle; + NamedHotspot _item1; +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; - virtual Common::String getClassName() { return "BF109Text"; } +class Scene115: public SceneExt { + /* Objects */ + class Kate: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Tony: public NamedObject { + public: + int _talkToTonyCtr2; + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object4: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Custom class */ + class EventHandler1: public EventHandler { + public: + virtual Common::String getClassName() { return "Scene115_EventHandler1"; } + virtual void dispatch(); + }; + + /* Items */ + class Jukebox: public NamedHotspot { + SequenceManager _sequenceManager6; + public: + int _jokeboxPlayingCtr; + + Jukebox(); + virtual bool startAction(CursorType action, Event &event); + virtual void signal(); virtual void synchronize(Serializer &s); + }; + class Item10: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item14: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + }; + class Action4: public Action { + public: + virtual void signal(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; + class Action6: public Action { + public: + virtual void signal(); + }; + class Action7: public Action { + public: + virtual void signal(); + }; + class Action8: public Action { + public: + virtual void signal(); + }; + class Action9: public Action { + public: + virtual void signal(); + }; + + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + SequenceManager _sequenceManager3; + SequenceManager _sequenceManager4; + SequenceManager _sequenceManager5; + Kate _kate; + Tony _tony; + Object3 _object3; + Object4 _object4; + SceneObject _object5, _object6, _neonSign, _object8, _object9; + SceneObject _object10, _object11, _object12, _object13; + Jukebox _itemJukebox; + EventHandler1 _eventHandler1; + NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7, _item8, _item9; + Item10 _item10; + NamedHotspot _item11, _item12, _item13; + Item14 _item14; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + Action9 _action9; + SpeakerGameText _gameTextSpeaker; + SpeakerKate _kateSpeaker; + SpeakerTony _tonySpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + ASound _sound1; + int _lineNumModifier; + int _jukeboxPlaying; + int _talkToTonyCtr; +public: + Scene115(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene125: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action3: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action4: public Action { + public: + virtual void signal(); + virtual void dispatch(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; + class Action6: public Action { + public: + virtual void signal(); virtual void dispatch(); }; + public: - SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; - SequenceManager _sequenceManager4, _sequenceManager5, _sequenceManager6; - SequenceManager _sequenceManager7, _sequenceManager8; - SceneObject _object1, _object2, _protaginist2, _protaginist1, _object5; - SceneObject _drunk, _object7, _bartender, _object9, _object10; - Text _text; Action1 _action1; - Action _action2, _action3; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + NamedObject _object1, _object2, _object3, _object4, _object5; + NamedObject _object6, _object7, _object8, _object9; + ASoundExt _soundExt1; + ASoundExt _soundExt2; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene140: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; public: - Scene109(); + Action1 _action1; + ASoundExt _soundExt1; + NamedObject _object1; + NamedObject _object2; + IntroSceneText _text; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene150: public SceneExt { + class Action1: public Action { + NamedObject _object2; + ASound _sound1; + public: + virtual void signal(); + }; +public: + NamedObject _object1; + Action1 _action1; + void postInit(SceneObjectList *OwnerList); +}; + +class Scene160: public SceneExt { + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + virtual void process(Event &event); + }; + class Action3: public ActionExt { + public: + virtual void signal(); + }; +public: + NamedObject _flag, _kid, _kidBody, _leftOfficer, _grandma, _rightOfficer; + ASound _sound1; + Action1 _action1; + Action2 _action2; + Action3 _action3; + IntroSceneText _text; + + void postInit(SceneObjectList *OwnerList); +}; + +class Scene180: public SceneExt { + /* Objects */ + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class GarageExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + NamedObject _object1; + Vechile _vechile; + NamedHotspot _driveway, _garage, _frontDoor, _house, _street; + NamedHotspot _lawn, _bushes, _palms, _fence, _steps; + NamedHotspot _curb, _sky; + GarageExit _garageExit; + ASoundExt _sound1; + SceneMessage _sceneMessage; + int _dispatchMode; + + Scene180(); + virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); }; class Scene190: public SceneExt { /* Objects */ - class Object4: public NamedObject { + class LyleCar: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -153,8 +459,8 @@ class Scene190: public SceneExt { public: SequenceManager _sequenceManager; FollowerObject _object1; - NamedObject _object2, _object3; - Object4 _object4; + NamedObject _door, _flag; + LyleCar _lyleCar; Item1 _item1; Item2 _item2; NamedHotspot _item3, _item4, _item5, _item6; @@ -170,10 +476,7 @@ public: virtual void signal(); virtual void process(Event &event); virtual void dispatch(); - virtual void synchronize(Serializer &s) { - SceneExt::synchronize(s); - s.syncAsSint16LE(_fieldB52); - } + virtual void synchronize(Serializer &s); }; } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp index 7d66c7a52b..5a181af927 100644 --- a/engines/tsage/blue_force/blueforce_scenes2.cpp +++ b/engines/tsage/blue_force/blueforce_scenes2.cpp @@ -86,12 +86,14 @@ void Scene200::Action2::signal() { switch (_actionIndex++) { case 1: - owner->setPosition(owner->_position); + owner->setPosition(owner->_position, 0); owner->animate(ANIM_MODE_5, this); break; case 2: - owner->setPosition(owner->_position); + owner->setPosition(owner->_position, 1000); owner->setFrame(1); + _actionIndex = 0; + setDelay(1); break; default: break; @@ -184,6 +186,12 @@ void Scene210::Action1::signal() { void Scene210::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); loadScene(210); + +// FIXME: This fixes an obvious glitch during scene transition. +// Shouldn't it be included in the 2 previous functions? + clearScreen(); +// + BF_GLOBALS._scenePalette.loadPalette(235); BF_GLOBALS._scenePalette.refresh(); @@ -349,6 +357,11 @@ void Scene220::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); loadScene(220); +// FIXME: This fixes an obvious glitch during scene transition. +// Shouldn't it be included in the 2 previous functions? + clearScreen(); +// + _object2.postInit(); _object2.setVisage(220); _object2.setPosition(Common::Point(182, 122)); @@ -708,7 +721,7 @@ void Scene225::remove() { } /*-------------------------------------------------------------------------- - * Scene 265 - Graduation Article + * Scene 265 - Intro - Graduation Article * *--------------------------------------------------------------------------*/ @@ -754,7 +767,7 @@ void Scene265::postInit(SceneObjectList *OwnerList) { void Scene265::remove() { clearScreen(); - remove(); + SceneExt::remove(); } /*-------------------------------------------------------------------------- @@ -857,7 +870,7 @@ bool Scene270::Item::startAction(CursorType action, Event &event) { scene->_object2.postInit(); scene->_object2.hide(); scene->_sceneMode = 2705; - scene->setAction(&scene->_sequenceManager1, this, 2705, &BF_GLOBALS._player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object2, NULL); return true; } else { return NamedHotspot::startAction(action, event); @@ -924,9 +937,9 @@ void Scene270::postInit(SceneObjectList *OwnerList) { (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2) && (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 1)) || ((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3))) { - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); _grandma.postInit(); _grandma.setVisage(274); @@ -1091,7 +1104,7 @@ void Scene270::signal() { SceneItem::display2(270, 37); BF_GLOBALS._player.enableControl(); } else { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(shownLyleCrate1Day1); _sceneMode = 12; ADD_PLAYER_MOVER(192, 135); @@ -1129,9 +1142,9 @@ void Scene270::signal() { &_lyle, &_grandma, NULL); break; case 2718: - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); _field219A = 1; BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard; @@ -1139,7 +1152,7 @@ void Scene270::signal() { _grandma.setStrip(8); _grandma._frame = 5; _field384 = 1; - _field384 = 1; + _field386 = 1; BF_GLOBALS._player._moveDiff.x = 8; BF_GLOBALS._player.enableControl(); @@ -1169,7 +1182,7 @@ void Scene270::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1)) && + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1)) && !_field384 && !_field386) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { @@ -1277,7 +1290,7 @@ void Scene270::dispatch() { void Scene271::Action1::signal() { Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene; - scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL); + setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL); } /*--------------------------------------------------------------------------*/ @@ -1419,7 +1432,7 @@ void Scene271::postInit(SceneObjectList *OwnerList) { _item6.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL); _item2.setDetails(3, 270, 24, 25, 26, 1); _item4.setDetails(2, 270, 30, 31, 32, 1); - _item11.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 270, 0, 1, 2, 1, NULL); + _item11.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 270, 0, 1, 2, 1, NULL); BF_GLOBALS._player.postInit(); BF_GLOBALS._player._moveDiff.x = 8; @@ -1437,11 +1450,11 @@ void Scene271::postInit(SceneObjectList *OwnerList) { switch (BF_GLOBALS._sceneManager._previousScene) { case 180: - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); - BF_GLOBALS._player.setVisage(151); + BF_GLOBALS._player.setVisage(275); BF_GLOBALS._player.setPosition(Common::Point(348, 151)); _object12.postInit(); @@ -1468,9 +1481,9 @@ void Scene271::postInit(SceneObjectList *OwnerList) { _object6.postInit(); _object6.hide(); - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); _object12.postInit(); _object12.setVisage(274); @@ -1496,9 +1509,9 @@ void Scene271::postInit(SceneObjectList *OwnerList) { _object7.setStrip(7); _object7.setPosition(Common::Point(48, 149)); - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); _object12.postInit(); _object12.setVisage(276); @@ -1530,9 +1543,9 @@ void Scene271::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.setFrame(1); BF_GLOBALS._player.setPosition(Common::Point(239, 145)); - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(14); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(19); _object12.postInit(); _object12.setVisage(274); @@ -1577,7 +1590,8 @@ void Scene271::signal() { break; case 590: _sceneMode = 2704; - setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL); + setAction(&_sequenceManager1, this, 2704, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL); + break; default: _object11.postInit(); _object11.setPosition(Common::Point(340, 100)); @@ -1617,7 +1631,7 @@ void Scene271::signal() { _object1.remove(); _field796 = 0; - ADD_PLAYER_MOVER(_tempPos.x, _tempPos.y); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y); break; case 2707: BF_GLOBALS._player.enableControl(); @@ -1653,6 +1667,8 @@ void Scene271::signal() { _sceneMode = 13; addFader((const byte *)&black, 2, this); break; + default: + break; } } @@ -1669,7 +1685,7 @@ void Scene271::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < BF_INTERFACE_Y)) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < UI_INTERFACE_Y)) { if (_exit.contains(event.mousePos)) { GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_E); BF_GLOBALS._events.setCursor(cursor); @@ -1715,6 +1731,123 @@ void Scene271::dispatch() { SceneExt::dispatch(); } +/*-------------------------------------------------------------------------- + * Scene 280 - Bedroom Flashback cut-scene + * + *--------------------------------------------------------------------------*/ + +void Scene280::Action1::signal() { + Scene280 *scene = (Scene280 *)BF_GLOBALS._sceneManager._scene; + static uint32 black = 0; + + switch (_actionIndex++) { + case 0: + scene->_jake.postInit(); + scene->_jake.setVisage(283); + scene->_jake.setPosition(Common::Point(331, 200)); + scene->_jake.animate(ANIM_MODE_1, NULL); + scene->_jake.setStrip(1); + ADD_MOVER(scene->_jake, 189, 131); + break; + case 1: + scene->_jake.setStrip(2); + scene->_jake.setFrame(1); + scene->_jake.animate(ANIM_MODE_8, NULL); + scene->_jake._numFrames = 5; + + scene->_stripManager.start(2800, this); + break; + case 2: + scene->_jake.animate(ANIM_MODE_5, NULL); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_jake.setStrip(4); + scene->_jake.setFrame(1); + scene->_dad.setStrip(2); + scene->_jake.setFrame(1); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 4: + scene->_dad.setStrip(3); + scene->_dad.setFrame(1); + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_object4.hide(); + scene->_dad.setVisage(282); + scene->_dad.setStrip(1); + scene->_dad.setFrame(1); + scene->_dad._numFrames = 5; + scene->_dad.animate(ANIM_MODE_5, this); + break; + case 6: + scene->_stripManager.start(2801, this); + break; + case 7: + scene->_mum.postInit(); + scene->_mum.setVisage(282); + scene->_mum.setStrip(2); + scene->_mum.setFrame(1); + scene->_mum.fixPriority(1); + scene->_mum.setPosition(Common::Point(160, 138)); + + scene->_jake.setStrip(3); + scene->_jake.setFrame(1); + scene->_jake.animate(ANIM_MODE_5, this); + + scene->_dad._numFrames = 10; + scene->_dad.setVisage(284); + scene->_dad.setStrip(1); + scene->_dad.fixPriority(-1); + scene->_dad.setPosition(Common::Point(174, 136)); + scene->_dad.setFrame(1); + scene->_dad.animate(ANIM_MODE_1, NULL); + ADD_MOVER(scene->_dad, 438, 320); + break; + case 8: + scene->_mum.animate(ANIM_MODE_4, 5, 1, this); + break; + case 9: + scene->_sceneMode = 2; + BF_GLOBALS._sound1.fadeOut2(NULL); + scene->addFader((const byte *)&black, 2, scene); + + scene->_jake.remove(); + scene->_mum.animate(ANIM_MODE_5, NULL); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene280::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + BF_GLOBALS._interfaceY = SCREEN_HEIGHT; + loadScene(280); + + _stripManager.addSpeaker(&_gameTextSpeaker); + + _dad.postInit(); + _dad.setVisage(281); + _dad.setPosition(Common::Point(160, 138)); + _dad.fixPriority(1); + + _object4.postInit(); + _object4.setVisage(280); + _object4.setPosition(Common::Point(139, 141)); + + const uint32 black = 0; + add2Faders((const byte *)&black, 2, 280, this); + _sceneMode = 1; + setAction(&_action1); +} + +void Scene280::signal() { + if (_sceneMode == 2) + BF_GLOBALS._sceneManager.changeScene(271); +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes2.h b/engines/tsage/blue_force/blueforce_scenes2.h index 2ec939be19..17e749d7a1 100644 --- a/engines/tsage/blue_force/blueforce_scenes2.h +++ b/engines/tsage/blue_force/blueforce_scenes2.h @@ -276,6 +276,20 @@ public: virtual void dispatch(); }; +class Scene280: public PalettedScene { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; +public: + Action1 _action1; + SpeakerGameText _gameTextSpeaker; + NamedObject _jake, _dad, _mum, _object4; + + void postInit(SceneObjectList *OwnerList); + virtual void signal(); +}; } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp index 6edd6d1aaa..a63f45d8df 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.cpp +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -58,7 +58,7 @@ bool Scene300::Object19::startAction(CursorType action, Event &event) { return true; } - +// entrance door bool Scene300::Item1::startAction(CursorType action, Event &event) { if (action == CURSOR_USE) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; @@ -75,6 +75,8 @@ bool Scene300::Item1::startAction(CursorType action, Event &event) { bool Scene300::Item2::startAction(CursorType action, Event &event) { if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; scene->setAction(&scene->_sequenceManager1, scene, 304, &scene->_object11, NULL); return true; } else { @@ -108,7 +110,7 @@ void Scene300::Action1::signal() { setDelay(1); break; case 2: { - ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8, + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8, BF_GLOBALS._player._position.y); break; } @@ -183,12 +185,13 @@ void Scene300::Action4::signal() { break; case 2: BF_GLOBALS._sceneManager.changeScene(60); + setDelay(15); break; case 3: setAction(&scene->_sequenceManager1, this, 319, &scene->_object19, NULL); break; case 4: - BF_GLOBALS.setFlag(2); + BF_GLOBALS.setFlag(onBike); BF_GLOBALS._sceneManager.changeScene(190); break; default: @@ -213,6 +216,7 @@ void Scene300::Action5::signal() { break; case 3: { ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 186, 140); + setDelay(3); break; } case 4: @@ -302,14 +306,14 @@ void Scene300::postInit(SceneObjectList *OwnerList) { break; case 190: _sceneMode = 0; - if (!BF_GLOBALS.getFlag(2)) { + if (!BF_GLOBALS.getFlag(onBike)) { _sceneMode = 7308; BF_GLOBALS._player.setPosition(Common::Point(175, 50)); ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 123, 71); if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne)) - setup(); - } else if (!BF_GLOBALS.getFlag(3)) { + setupInspection(); + } else if (!BF_GLOBALS.getFlag(onDuty)) { BF_GLOBALS._player.disableControl(); _sceneMode = 300; setAction(&_sequenceManager1, this, 300, &BF_GLOBALS._player, NULL); @@ -328,7 +332,7 @@ void Scene300::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL); } else { BF_GLOBALS._player.setVisage(1304); - setup(); + setupInspection(); BF_GLOBALS._player.disableControl(); _sceneMode = 0; setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL); @@ -348,13 +352,13 @@ void Scene300::postInit(SceneObjectList *OwnerList) { _item13.setDetails(3, 300, 25, 26, 27, 1); _item2.setDetails(Rect(266, 54, 272, 59), 300, -1, -1, -1, 1, NULL); _item1.setDetails(Rect(262, 47, 299, 76), 300, 1, 13, -1, 1, NULL); - _item4.setDetails(Rect(0, 85, SCREEN_WIDTH - 1, BF_INTERFACE_Y - 1), 300, 6, 13, 15, 1, NULL); + _item4.setDetails(Rect(0, 85, SCREEN_WIDTH - 1, UI_INTERFACE_Y - 1), 300, 6, 13, 15, 1, NULL); _item7.setDetails(Rect(219, 46, 251, 74), 300, 22, 23, 24, 1, NULL); _item8.setDetails(Rect(301, 53, 319, 78), 300, 22, 23, 24, 1, NULL); _item5.setDetails(Rect(179, 44, 200, 55), 300, 8, 13, 17, 1, NULL); _item6.setDetails(Rect(210, 46, 231, 55), 300, 8, 13, 17, 1, NULL); _item3.setDetails(Rect(160, 0, SCREEN_WIDTH - 1, 75), 300, 4, 13, 14, 1, NULL); - _item9.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 300, 29, 30, 31, 1, NULL); + _item9.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 300, 29, 30, 31, 1, NULL); } void Scene300::signal() { @@ -420,7 +424,7 @@ void Scene300::signal() { setAction(&_sequenceManager1, this, 312, &_object1, &_object16, NULL); break; case 317: - BF_GLOBALS.setFlag(2); + BF_GLOBALS.setFlag(onBike); BF_GLOBALS._sceneManager.changeScene(60); break; case 318: @@ -474,10 +478,10 @@ void Scene300::signal() { _object10.postInit(); _object10.hide(); - if (BF_GLOBALS.getFlag(1)) { + if (BF_GLOBALS.getFlag(gunClean)) { BF_GLOBALS._player.disableControl(); _sceneMode = 4308; - setAction(&_sequenceManager1, this, 6307, &_object2, &_object1, &_object9, &_object10, NULL); + setAction(&_sequenceManager1, this, 6307, &_object12, &_object1, &_object9, &_object10, NULL); } else { BF_GLOBALS._player.disableControl(); _sceneMode = 4308; @@ -523,7 +527,7 @@ void Scene300::signal() { void Scene300::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_item14.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NE); @@ -552,7 +556,7 @@ void Scene300::dispatch() { if ((BF_GLOBALS._player._position.y < 59) && (BF_GLOBALS._player._position.x > 137) && (_sceneMode != 6308) && (_sceneMode != 7308)) { - BF_GLOBALS._v4CEA4 = 3; + // The original was setting a useless global variable (removed) _sceneMode = 6308; BF_GLOBALS._player.disableControl(); ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20, @@ -563,7 +567,7 @@ void Scene300::dispatch() { setAction(&_action2); if (BF_GLOBALS._player._position.x >= 315) { - if (BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark == bNone) || !BF_GLOBALS.getFlag(fWithLyle)) { + if (BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark == bNone) || BF_GLOBALS.getFlag(fWithLyle)) { setAction(&_action1); } else { BF_GLOBALS._player.disableControl(); @@ -574,7 +578,7 @@ void Scene300::dispatch() { } } -void Scene300::setup() { +void Scene300::setupInspection() { _object13.postInit(); _object13.setVisage(307); _object13.setStrip(6); @@ -618,7 +622,7 @@ void Scene300::setup() { _object1._moveDiff = Common::Point(3, 1); _object1.setObjectWrapper(new SceneObjectWrapper()); _object1.animate(ANIM_MODE_1, NULL); - _object2.setup(&_object1, 306, 4, 9); + _object2.setup(&_object1, 306, 4, 29); BF_GLOBALS._sceneItems.addItems(&_object13, &_object14, &_object15, &_object16, NULL); _timer.set(3600, this, &_action5); @@ -638,7 +642,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_USE: - if (scene->_field1B60 || scene->_field1B64) + if (scene->_invGreenCount || scene->_invGangCount) SceneItem::display2(320, 51); else NamedHotspot::startAction(action, event); @@ -667,7 +671,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { scene->_stripNumber = 3174; scene->setAction(&scene->_action1); } else { - ++scene->_field1B62; + ++scene->_bookGreenCount; scene->_stripNumber = (action == INV_GREENS_GUN) ? 3168 : 0; scene->_sceneMode = 3153; scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL); @@ -675,7 +679,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { break; case INV_FOREST_RAP: BF_GLOBALS._player.disableControl(); - scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3178 : 3173; + scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3173 : 3178; scene->setAction(&scene->_action1); break; case INV_GREEN_ID: @@ -693,7 +697,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { scene->setAction(&scene->_action1); break; case INV_COBB_RAP: - if (BF_INVENTORY._mugshot._sceneNumber == 1) + if (BF_INVENTORY.getObjectScene(INV_MUG_SHOT) == 1) NamedHotspot::startAction(action, event); else { BF_GLOBALS._player.disableControl(); @@ -717,7 +721,8 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { scene->_stripNumber = 3174; scene->setAction(&scene->_action1); } else { - if (!scene->_field1B6C & (scene->_field1B66 == 1)) { + ++scene->_bookGangCount; + if (!scene->_field1B6C && (scene->_bookGangCount == 1)) { scene->_field1B6C = 1; scene->_stripNumber = 3169; } else { @@ -737,6 +742,7 @@ bool Scene315::Barry::startAction(CursorType action, Event &event) { bool Scene315::SutterSlot::startAction(CursorType action, Event &event) { Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + scene->_currentCursor = action; switch (action) { case INV_GREENS_GUN: @@ -757,9 +763,9 @@ bool Scene315::SutterSlot::startAction(CursorType action, Event &event) { case INV_BOOKING_FRANKIE: case INV_BOOKING_GANG: if (action == INV_BOOKING_GREEN) - ++scene->_field1B62; + ++scene->_bookGreenCount; else - ++scene->_field1B66; + ++scene->_bookGangCount; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 12; @@ -860,7 +866,7 @@ bool Scene315::BulletinMemo::startAction(CursorType action, Event &event) { return true; case CURSOR_USE: if (!BF_GLOBALS.getFlag(fGotPointsForCleaningGun)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fGotPointsForCleaningGun); } BF_GLOBALS._player.addMover(NULL); @@ -872,6 +878,7 @@ bool Scene315::BulletinMemo::startAction(CursorType action, Event &event) { } } +// Own Mail Slot bool Scene315::Object2::startAction(CursorType action, Event &event) { Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; @@ -904,7 +911,7 @@ bool Scene315::ATFMemo::startAction(CursorType action, Event &event) { return true; case CURSOR_USE: if (!BF_GLOBALS.getFlag(fGotPointsForMemo)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(fGotPointsForMemo); } @@ -935,8 +942,12 @@ void Scene315::Action1::signal() { break; case 3: if (scene->_sceneMode == 3169) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1); + //HACK: This has to be checked wether or not it occurs in the original. + //When the _sceneMode is set to 3169, the value desn't change. + //If you show the forest rapsheet, it gives points (and again... and again...) + scene->_sceneMode = 3154; } remove(); @@ -955,9 +966,9 @@ Scene315::Scene315() { BF_GLOBALS.clearFlag(fCanDrawGun); _field1B68 = true; - _field1B6A = false; - _field1B60 = _field1B62 = 0; - _field1B64 = _field1B66 = 0; + _doorOpened = false; + _invGreenCount = _bookGreenCount = 0; + _invGangCount = _bookGangCount = 0; } void Scene315::synchronize(Serializer &s) { @@ -966,18 +977,19 @@ void Scene315::synchronize(Serializer &s) { s.syncAsSint16LE(_field1390); s.syncAsSint16LE(_stripNumber); s.syncAsSint16LE(_field1398); - s.syncAsSint16LE(_field1B60); - s.syncAsSint16LE(_field1B62); - s.syncAsSint16LE(_field1B64); - s.syncAsSint16LE(_field1B66); + s.syncAsSint16LE(_invGreenCount); + s.syncAsSint16LE(_bookGreenCount); + s.syncAsSint16LE(_invGangCount); + s.syncAsSint16LE(_bookGangCount); s.syncAsSint16LE(_field1B6C); s.syncAsSint16LE(_field139C); s.syncAsByte(_field1B68); - s.syncAsByte(_field1B6A); + s.syncAsByte(_doorOpened); s.syncAsSint16LE(_currentCursor); } void Scene315::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(OwnerList); loadScene(315); if (BF_GLOBALS._sceneManager._previousScene != 325) @@ -1059,34 +1071,34 @@ void Scene315::postInit(SceneObjectList *OwnerList) { // Set up evidence objects in inventory if (BF_INVENTORY._bookingGreen.inInventory()) - ++_field1B60; + ++_invGreenCount; if (BF_INVENTORY._greensGun.inInventory()) - ++_field1B60; + ++_invGreenCount; if (BF_INVENTORY._greensKnife.inInventory()) - ++_field1B60; + ++_invGreenCount; if (BF_INVENTORY._bullet22.inInventory()) - ++_field1B64; + ++_invGangCount; if (BF_INVENTORY._autoRifle.inInventory()) - ++_field1B64; + ++_invGangCount; if (BF_INVENTORY._wig.inInventory()) - ++_field1B64; + ++_invGangCount; if (BF_INVENTORY._bookingFrankie.inInventory()) - ++_field1B64; + ++_invGangCount; if (BF_INVENTORY._bookingGang.inInventory()) - ++_field1B64; + ++_invGangCount; if (BF_INVENTORY._snub22.inInventory()) - ++_field1B64; + ++_invGangCount; switch (BF_GLOBALS._sceneManager._previousScene) { case 190: if (_field1398) - _field1B6A = true; + _doorOpened = true; _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 3150 : 3165; setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL); break; case 325: - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements._active = false; _object6.postInit(); _object7.postInit(); _object8.setFrame(8); @@ -1097,7 +1109,7 @@ void Scene315::postInit(SceneObjectList *OwnerList) { case 300: default: if (_field1398) - _field1B6A = true; + _doorOpened = true; if (!BF_GLOBALS.getFlag(onDuty)) _sceneMode = 3166; else if (!_field1398) @@ -1109,10 +1121,10 @@ void Scene315::postInit(SceneObjectList *OwnerList) { break; } - if (_field1B6A) { + if (_doorOpened) { _object8.setFrame(8); } else { - BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._walkRegions.disableRegion(4); } _briefingMaterial.setDetails(24, 315, 38, 39, 40, 1); @@ -1133,15 +1145,15 @@ void Scene315::signal() { BF_GLOBALS._player.enableControl(); break; case 10: - if (_field1B62) { - if (_field1B62 >= _field1B60) + if (_bookGreenCount) { + if (_bookGreenCount >= _invGreenCount) BF_GLOBALS.setFlag(fLeftTraceIn910); else ++ctr; } - if (_field1B66) { - if (_field1B66 < _field1B64) + if (_bookGangCount) { + if (_bookGangCount < _invGangCount) ++ctr; else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence) BF_GLOBALS._bookmark = bBookedFrankieEvidence; @@ -1156,15 +1168,15 @@ void Scene315::signal() { BF_GLOBALS._sound1.fadeOut2(NULL); break; case 11: - if (_field1B62) { - if (_field1B62 >= _field1B60) + if (_bookGreenCount) { + if (_bookGreenCount >= _invGreenCount) BF_GLOBALS.setFlag(fLeftTraceIn910); else ++ctr; } - if (_field1B66) { - if (_field1B66 < _field1B64) + if (_bookGangCount) { + if (_bookGangCount < _invGangCount) ++ctr; else if (BF_GLOBALS._bookmark < bBookedFrankie) BF_GLOBALS._bookmark = bBookedFrankie; @@ -1175,6 +1187,7 @@ void Scene315::signal() { if (ctr == 1) { BF_GLOBALS._deathReason = 20; BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(666); } else if ((BF_GLOBALS._bookmark != bBookedFrankie) || !BF_GLOBALS.getFlag(onDuty)) { BF_GLOBALS._sound1.fadeOut2(NULL); BF_GLOBALS._sceneManager.changeScene(190); @@ -1189,10 +1202,10 @@ void Scene315::signal() { } break; case 12: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene((int)_currentCursor, 315); - if (!_field1B64 || (_field1B66 != _field1B64)) + if (!_invGangCount || (_bookGangCount != _invGangCount)) BF_GLOBALS._player.enableControl(); else { _field139C = 1; @@ -1211,23 +1224,24 @@ void Scene315::signal() { BF_GLOBALS._sceneManager.changeScene(325); break; case 3152: - BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._walkRegions.disableRegion(4); _object7.remove(); _object6.remove(); - + // No break on purpose + case 3155: BF_GLOBALS._player.enableControl(); _field1B68 = false; - BF_GLOBALS._walkRegions.proc1(4); - BF_GLOBALS._uiElements._active = true; - BF_GLOBALS._uiElements.show(); + BF_GLOBALS._walkRegions.disableRegion(4); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); break; case 3153: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene((int)_currentCursor, 315); if (_stripNumber != 0) setAction(&_action1); - else if (!_field1B64 || (_field1B66 != _field1B64)) + else if (!_invGangCount || (_bookGangCount != _invGangCount)) BF_GLOBALS._player.enableControl(); else { _stripNumber = 3171; @@ -1235,15 +1249,8 @@ void Scene315::signal() { _field139C = 1; } break; - case 3155: - BF_GLOBALS._player.enableControl(); - _field1B68 = false; - BF_GLOBALS._walkRegions.proc1(4); - BF_GLOBALS._uiElements._active = true; - BF_GLOBALS._uiElements.show(); - break; case 3156: - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_INVENTORY.setObjectScene(INV_DA_NOTE, 1); _object2.remove(); BF_GLOBALS._player.enableControl(); @@ -1254,12 +1261,12 @@ void Scene315::signal() { break; case 3158: BF_GLOBALS._player.enableControl(); - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 1); break; case 3159: if (!BF_GLOBALS.getFlag(fBookedGreenEvidence)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(fBookedGreenEvidence); } BF_GLOBALS.setFlag(gunClean); @@ -1284,6 +1291,11 @@ void Scene315::signal() { BF_GLOBALS._player.enableControl(); _object9.remove(); break; + case 3169: + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1); + BF_GLOBALS._player.enableControl(); + break; case 3154: default: break; @@ -1293,7 +1305,7 @@ void Scene315::signal() { void Scene315::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_swExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); @@ -1315,7 +1327,7 @@ void Scene315::dispatch() { if (_field1B68) return; - if (_field1B6A) { + if (_doorOpened) { if (BF_GLOBALS._player._position.y < 69) { BF_GLOBALS._player.disableControl(); _field1B68 = true; @@ -1718,9 +1730,9 @@ void Scene340::Action1::signal() { ++BF_GLOBALS._marinaWomanCtr; if (BF_GLOBALS.getFlag(fBackupArrived340)) { - scene->_field2654 = 1; + scene->_backupPresent = 1; scene->_harrison.setPosition(Common::Point(46, 154)); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(19); } else if (BF_GLOBALS.getFlag(fCalledBackup)) { scene->_timer1.set(40, &scene->_harrison, &scene->_action4); } @@ -1729,6 +1741,8 @@ void Scene340::Action1::signal() { BF_GLOBALS._player.enableControl(); remove(); break; + default: + break; } } @@ -1737,6 +1751,7 @@ void Scene340::Action2::signal() { switch (_actionIndex++) { case 0: { + BF_GLOBALS._player.disableControl(); ADD_PLAYER_MOVER(64, 155); break; } @@ -1754,6 +1769,8 @@ void Scene340::Action2::signal() { BF_GLOBALS._player.enableControl(); remove(); break; + default: + break; } } @@ -1762,6 +1779,7 @@ void Scene340::Action3::signal() { switch (_actionIndex++) { case 0: { + BF_GLOBALS._player.disableControl(); ADD_PLAYER_MOVER(64, 155); break; } @@ -1770,18 +1788,20 @@ void Scene340::Action3::signal() { setDelay(3); break; case 2: - scene->_stripManager.start(scene->_field2652 + 3404, this); + scene->_stripManager.start(scene->_womanDialogCount + 3404, this); break; case 3: - if (++scene->_field2652 > 2) { + if (++scene->_womanDialogCount > 2) { if (!BF_GLOBALS.getFlag(fGotAllSkip340)) BF_GLOBALS.setFlag(fGotAllSkip340); - scene->_field2652 = 0; + scene->_womanDialogCount = 0; } BF_GLOBALS._player.enableControl(); remove(); break; + default: + break; } } @@ -1800,17 +1820,19 @@ void Scene340::Action4::signal() { break; case 1: BF_GLOBALS.setFlag(fBackupArrived340); - scene->_field2654 = 1; + scene->_backupPresent = 1; setDelay(3); break; case 2: BF_GLOBALS._player.setAction(&scene->_sequenceManager3, this, 1347, &scene->_harrison, NULL); break; case 3: - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(19); BF_GLOBALS._player.enableControl(); remove(); break; + default: + break; } } @@ -1820,7 +1842,7 @@ void Scene340::Action5::signal() { switch (_actionIndex++) { case 0: BF_GLOBALS._player.disableControl(); - if (scene->_field2654) { + if (scene->_backupPresent) { ADD_PLAYER_MOVER(64, 155); } else { BF_GLOBALS._player.changeAngle(45); @@ -1846,6 +1868,8 @@ void Scene340::Action5::signal() { BF_GLOBALS._player.enableControl(); remove(); break; + default: + break; } } @@ -1890,6 +1914,8 @@ void Scene340::Action7::signal() { BF_GLOBALS.setFlag(fBackupIn350); BF_GLOBALS._sceneManager.changeScene(350); break; + default: + break; } } @@ -1942,6 +1968,11 @@ void Scene340::Action8::signal() { case 4: remove(); break; + default: + // This is present in the original game + warning("Bugs"); + remove(); + break; } } @@ -1974,15 +2005,15 @@ void Scene340::Timer2::signal() { /*--------------------------------------------------------------------------*/ Scene340::Scene340(): PalettedScene() { - _seqNumber1 = _field2652 = _field2654 = 0; + _seqNumber1 = _womanDialogCount = _backupPresent = 0; } void Scene340::synchronize(Serializer &s) { PalettedScene::synchronize(s); s.syncAsSint16LE(_seqNumber1); - s.syncAsSint16LE(_field2652); - s.syncAsSint16LE(_field2654); + s.syncAsSint16LE(_womanDialogCount); + s.syncAsSint16LE(_backupPresent); } void Scene340::postInit(SceneObjectList *OwnerList) { @@ -1990,14 +2021,14 @@ void Scene340::postInit(SceneObjectList *OwnerList) { loadScene(340); setZoomPercents(126, 70, 162, 100); - BF_GLOBALS._walkRegions.proc1(13); - BF_GLOBALS._walkRegions.proc1(15); + BF_GLOBALS._walkRegions.disableRegion(13); + BF_GLOBALS._walkRegions.disableRegion(15); _timer2.set(2, NULL); _stripManager.addSpeaker(&_gameTextSpeaker); _stripManager.addSpeaker(&_jakeUniformSpeaker); - _field2652 = 0; + _womanDialogCount = 0; BF_GLOBALS._player.postInit(); BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); @@ -2006,7 +2037,7 @@ void Scene340::postInit(SceneObjectList *OwnerList) { _swExit.setDetails(15, 340, -1, -1, -1, 1); _northExit.setDetails(16, 340, -1, -1, -1, 1); - BF_GLOBALS._player._regionBitList = 0x10000; + BF_GLOBALS._player._regionBitList |= 0x10000; BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129); BF_GLOBALS._player._moveDiff = Common::Point(5, 2); @@ -2054,18 +2085,18 @@ void Scene340::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_harrisonSpeaker); if (BF_GLOBALS.getFlag(fBackupIn350)) { - _field2654 = 0; + _backupPresent = 0; _harrison.setVisage(1355); _harrison.setPosition(Common::Point(289, 112)); _harrison.changeAngle(225); _harrison.setFrame(1); _harrison.fixPriority(75); - BF_GLOBALS._walkRegions.proc1(23); + BF_GLOBALS._walkRegions.disableRegion(23); } else if (BF_GLOBALS.getFlag(fBackupArrived340)) { - _field2654 = 1; + _backupPresent = 1; _harrison.setPosition(Common::Point(46, 154)); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(19); } else if (BF_GLOBALS.getFlag(fCalledBackup) && (BF_GLOBALS._marinaWomanCtr > 0)) { _timer1.set(900, &_harrison, &_action4); } @@ -2092,7 +2123,7 @@ void Scene340::postInit(SceneObjectList *OwnerList) { _item3.setDetails(7, 340, 3, 9, 12, 1); _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 39), 340, 2, 8, 11, 1, NULL); - _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, BF_INTERFACE_Y), 340, 1, 7, 10, 1, NULL); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 340, 1, 7, 10, 1, NULL); BF_GLOBALS._player.disableControl(); _sceneMode = 0; @@ -2137,7 +2168,7 @@ void Scene340::process(Event &event) { if (!event.handled) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_westExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); @@ -2288,8 +2319,8 @@ void Scene342::postInit(SceneObjectList *OwnerList) { loadScene(340); setZoomPercents(126, 70, 162, 100); - BF_GLOBALS._walkRegions.proc1(13); - BF_GLOBALS._walkRegions.proc1(15); + BF_GLOBALS._walkRegions.disableRegion(13); + BF_GLOBALS._walkRegions.disableRegion(15); _field1A1A = 0; _timer1.set(2, NULL); @@ -2357,7 +2388,7 @@ void Scene342::postInit(SceneObjectList *OwnerList) { } if (BF_GLOBALS.getFlag(fWithLyle)) { - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(19); BF_GLOBALS._player.disableControl(); _sceneMode = 0; @@ -2393,7 +2424,7 @@ void Scene342::postInit(SceneObjectList *OwnerList) { _item3.setDetails(7, 340, 3, 9, 12, 1); _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 39), 340, 2, 8, 11, 1, NULL); - _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, BF_INTERFACE_Y), 340, 1, 7, 10, 1, NULL); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 340, 1, 7, 10, 1, NULL); } void Scene342::remove() { @@ -2434,7 +2465,7 @@ void Scene342::process(Event &event) { if (!event.handled) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_westExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); @@ -2481,7 +2512,7 @@ void Scene342::dispatch() { * *--------------------------------------------------------------------------*/ -bool Scene350::Item5::startAction(CursorType action, Event &event) { +bool Scene350::FireBox::startAction(CursorType action, Event &event) { Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -2559,7 +2590,7 @@ bool Scene350::Hook::startAction(CursorType action, Event &event) { BF_INVENTORY.setObjectScene(INV_HOOK, 1); if (!BF_GLOBALS.getFlag(hookPoints)) { BF_GLOBALS.setFlag(hookPoints); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } remove(); return true; @@ -2568,7 +2599,7 @@ bool Scene350::Hook::startAction(CursorType action, Event &event) { } } -bool Scene350::Object5::startAction(CursorType action, Event &event) { +bool Scene350::FireboxInset::startAction(CursorType action, Event &event) { Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -2576,7 +2607,7 @@ bool Scene350::Object5::startAction(CursorType action, Event &event) { SceneItem::display2(350, BF_INVENTORY.getObjectScene(INV_HOOK) ? 29 : 28); return true; case CURSOR_USE: - scene->_object5.remove(); + scene->_fireBoxInset.remove(); return true; case INV_HOOK: BF_INVENTORY.setObjectScene(INV_HOOK, 350); @@ -2589,7 +2620,7 @@ bool Scene350::Object5::startAction(CursorType action, Event &event) { BF_GLOBALS._sceneItems.push_front(&scene->_hook); return true; default: - return NamedObject::startAction(action, event); + return FocusObject::startAction(action, event); } } @@ -2635,7 +2666,7 @@ void Scene350::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player._moveDiff = Common::Point(3, 1); _yacht._flag = false; - _swExit.setDetails(Rect(0, 160, SCREEN_WIDTH, BF_INTERFACE_Y - 1), 350, -1, -1, -1, 1, NULL); + _swExit.setDetails(Rect(0, 160, SCREEN_WIDTH, UI_INTERFACE_Y - 1), 350, -1, -1, -1, 1, NULL); if ((BF_GLOBALS._dayNumber != 1) && (BF_GLOBALS._dayNumber != 4)) { _yacht.setDetails(28, 350, 15, 16, 17, 1); @@ -2669,20 +2700,20 @@ void Scene350::postInit(SceneObjectList *OwnerList) { } } - _item5._sceneRegionId = 5; - BF_GLOBALS._sceneItems.push_back(&_item5); + _fireBox._sceneRegionId = 5; + BF_GLOBALS._sceneItems.push_back(&_fireBox); _item4.setDetails(15, 350, 0, 1, 2, 1); BF_GLOBALS._sceneItems.push_back(&_yacht); _item3.setDetails(7, 350, 23, 24, 25, 1); _item2.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, 31), 350, 3, 4, 5, 1, NULL); - _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, BF_INTERFACE_Y), 350, 0, 1, 2, 1, NULL); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 350, 0, 1, 2, 1, NULL); switch (BF_GLOBALS._sceneManager._previousScene) { case 370: BF_GLOBALS._player.enableControl(); - BF_GLOBALS._uiElements._active = true; - BF_GLOBALS._uiElements.show(); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); // Deliberate fall-through case 355: if (BF_GLOBALS.getFlag(onDuty) && BF_GLOBALS.getFlag(gunDrawn)) @@ -2726,12 +2757,12 @@ void Scene350::signal() { case 3: BF_GLOBALS._player.setStrip(8); - _object5.postInit(); - _object5.setVisage(350); - _object5.setStrip(4); - _object5.fixPriority(200); - _object5.setPosition(Common::Point(85, 166)); - BF_GLOBALS._sceneItems.push_front(&_object5); + _fireBoxInset.postInit(); + _fireBoxInset.setVisage(350); + _fireBoxInset.setStrip(4); + _fireBoxInset.fixPriority(200); + _fireBoxInset.setPosition(Common::Point(85, 166)); + BF_GLOBALS._sceneItems.push_front(&_fireBoxInset); if (BF_INVENTORY.getObjectScene(INV_HOOK) == 350) { _hook.postInit(); @@ -2748,7 +2779,7 @@ void Scene350::signal() { default: if (BF_GLOBALS.getFlag(fBackupIn350)) { _harrison.updateAngle(BF_GLOBALS._player._position); - BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._walkRegions.disableRegion(19); } BF_GLOBALS._player.enableControl(); @@ -2792,7 +2823,7 @@ void Scene350::process(Event &event) { if (!event.handled) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_swExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); @@ -2860,7 +2891,7 @@ bool Scene355::Doorway::startAction(CursorType action, Event &event) { BF_GLOBALS.setFlag(fTookTrailerAmmo); scene->_stripManager.start(3575, scene); - scene->_object7._flag = 1; + scene->_lyle._flag = 1; return true; case 1: BF_GLOBALS._player.disableControl(); @@ -2935,7 +2966,7 @@ bool Scene355::Locker::startAction(CursorType action, Event &event) { } } -bool Scene355::LockerDoor::startAction(CursorType action, Event &event) { +bool Scene355::LockerInset::startAction(CursorType action, Event &event) { Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -2949,8 +2980,8 @@ bool Scene355::LockerDoor::startAction(CursorType action, Event &event) { if (_frame == 1) { SceneItem::display2(355, 23); return true; - } - return true; + } else + return NamedObject::startAction(action, event); case INV_SCREWDRIVER: scene->_sound2.play(104); BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 999); @@ -2985,7 +3016,7 @@ bool Scene355::Object5::startAction(CursorType action, Event &event) { return true; case CURSOR_USE: BF_INVENTORY.setObjectScene(INV_FLARE, 1); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_object9.remove(); remove(); @@ -2995,7 +3026,7 @@ bool Scene355::Object5::startAction(CursorType action, Event &event) { } } -bool Scene355::Object6::startAction(CursorType action, Event &event) { +bool Scene355::Green::startAction(CursorType action, Event &event) { Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -3013,7 +3044,7 @@ bool Scene355::Object6::startAction(CursorType action, Event &event) { BF_GLOBALS._player._regionBitList |= 0x10; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9985; - scene->setAction(&scene->_sequenceManager, scene, 3357, &BF_GLOBALS._player, this, NULL); + scene->setAction(&scene->_sequenceManager, scene, 3557, &BF_GLOBALS._player, this, NULL); } return true; case CURSOR_TALK: @@ -3023,14 +3054,14 @@ bool Scene355::Object6::startAction(CursorType action, Event &event) { } else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) { return false; } else { - switch (BF_GLOBALS._v4CEC2) { + switch (BF_GLOBALS._greenDay5TalkCtr++) { case 0: scene->_stripManager.start(3565, scene); break; case 1: scene->_stripManager.start(3567, scene); break; - case 2: + default: scene->_stripManager.start(3571, scene); break; } @@ -3052,25 +3083,25 @@ bool Scene355::Object6::startAction(CursorType action, Event &event) { else if (!BF_GLOBALS.getFlag(gunDrawn)) SceneItem::display2(1, 0); else { - if (BF_GLOBALS._sceneObjects->contains(&scene->_object7)) - scene->_object7.setAction(NULL); + if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle)) + scene->_lyle.setAction(NULL); BF_GLOBALS._player.disableControl(); - scene->_object6.setStrip(1); - scene->_object6.setFrame(1); + scene->_green.setStrip(1); + scene->_green.setFrame(1); scene->_sceneMode = 9981; scene->signal(); } return true; case INV_HANDCUFFS: - if (BF_GLOBALS._v4CEC2 <= 1) + if (BF_GLOBALS._greenDay5TalkCtr <= 1) SceneItem::display2(355, 38); else { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9979; scene->setAction(&scene->_sequenceManager, scene, 4551, &BF_GLOBALS._player, this, NULL); BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 355); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); _flag = 1; BF_GLOBALS._bookmark = bInvestigateBoat; } @@ -3083,7 +3114,7 @@ bool Scene355::Object6::startAction(CursorType action, Event &event) { } } -bool Scene355::Object7::startAction(CursorType action, Event &event) { +bool Scene355::Lyle::startAction(CursorType action, Event &event) { Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -3091,7 +3122,7 @@ bool Scene355::Object7::startAction(CursorType action, Event &event) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 0; - if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) { + if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) { scene->_stripManager.start((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) ? 3578 : 3577, scene); } else { switch (_flag) { @@ -3137,7 +3168,7 @@ bool Scene355::Object8::startAction(CursorType action, Event &event) { scene->_sceneMode = 9997; scene->_stripManager.start(3561, scene); } else { - SceneItem::display(1, 4); + SceneItem::display2(1, 4); } return true; default: @@ -3258,10 +3289,16 @@ bool Scene355::Item4::startAction(CursorType action, Event &event) { } -bool Scene355::Item5::startAction(CursorType action, Event &event) { +bool Scene355::Pouch::startAction(CursorType action, Event &event) { Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; switch (action) { + case CURSOR_LOOK: + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) { + SceneItem::display2(355, 29); + return true; + } + break; case CURSOR_USE: if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) { if (scene->_modeFlag) { @@ -3289,8 +3326,10 @@ bool Scene355::Item5::startAction(CursorType action, Event &event) { } return true; default: - return NamedHotspot::startAction(action, event); + break; } + + return NamedHotspot::startAction(action, event); } bool Scene355::Item11::startAction(CursorType action, Event &event) { @@ -3314,7 +3353,7 @@ bool Scene355::Item11::startAction(CursorType action, Event &event) { scene->_sceneMode = 0; BF_GLOBALS.setFlag(fTookTrailerAmmo); scene->_stripManager.start(3575, scene); - scene->_object7._flag = 1; + scene->_lyle._flag = 1; scene->_doorway._v2 = 1; break; case 1: @@ -3349,7 +3388,7 @@ bool Scene355::Item11::startAction(CursorType action, Event &event) { return NamedHotspot::startAction(action, event); } -bool Scene355::Item12::startAction(CursorType action, Event &event) { +bool Scene355::RentalExit::startAction(CursorType action, Event &event) { Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; if (!BF_GLOBALS.getFlag(gunDrawn)) { @@ -3360,6 +3399,7 @@ bool Scene355::Item12::startAction(CursorType action, Event &event) { else { scene->_nextSceneMode = 0; BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9991; scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL); } } @@ -3378,7 +3418,7 @@ void Scene355::Action1::signal() { break; case 1: _actionIndex = 0; - scene->_object7.animate(ANIM_MODE_8, 1, this); + scene->_lyle.animate(ANIM_MODE_8, 1, this); break; default: break; @@ -3527,7 +3567,7 @@ void Scene355::postInit(SceneObjectList *OwnerList) { case 4: break; case 5: - BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.enableControl(); _modeFlag = true; BF_GLOBALS._player.setPosition(Common::Point(133, 173)); BF_GLOBALS._player.fixPriority(249); @@ -3536,17 +3576,17 @@ void Scene355::postInit(SceneObjectList *OwnerList) { if (BF_GLOBALS._bookmark == bDoneAtLyles) BF_GLOBALS._bookmark = bEndDayFour; - _item5.setDetails(Rect(22, 136, 46, 146), 355, 43, -1, -1, 1, NULL); + _pouch.setDetails(Rect(22, 136, 46, 146), 355, 43, -1, -1, 1, NULL); _nextSceneMode = 0; if (!BF_GLOBALS.getFlag(fLyleOnIsland)) { - _object7.postInit(); - _object7.setVisage(847); - _object7.setPosition(Common::Point(296, 97)); - _object7.setStrip(1); - _object7.setAction(&_action1); - _object7._flag = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0; - _object7.setDetails(355, 40, 42, 41, 1, NULL); + _lyle.postInit(); + _lyle.setVisage(847); + _lyle.setPosition(Common::Point(296, 97)); + _lyle.setStrip(1); + _lyle.setAction(&_action1); + _lyle._flag = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0; + _lyle.setDetails(355, 40, 42, 41, 1, NULL); } if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) && @@ -3568,39 +3608,39 @@ void Scene355::postInit(SceneObjectList *OwnerList) { _doorway.setPosition(Common::Point(146, 107)); _doorway._v3 = 0; _doorway._v2 = 2; - _object7._flag = 2; + _lyle._flag = 2; - _object6.postInit(); - BF_GLOBALS._sceneItems.push_back(&_object6); + _green.postInit(); + BF_GLOBALS._sceneItems.push_back(&_green); if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) { - _object6.setVisage(376); - _object6.setStrip(1); - _object6.setPosition(Common::Point(193, 88)); - _object6._flag = 0; + _green.setVisage(376); + _green.setStrip(1); + _green.setPosition(Common::Point(193, 88)); + _green._flag = 0; } else { - _object6._flag = 1; + _green._flag = 1; if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1) { - _object6.setVisage(373); - _object6.setStrip(5); - _object6.setPosition(Common::Point(238, 142)); + _green.setVisage(373); + _green.setStrip(5); + _green.setPosition(Common::Point(238, 142)); } else { - _object6.setVisage(375); - _object6.setStrip(1); - _object6.setFrame(_object6.getFrameCount()); - _object6.setPosition(Common::Point(193, 147)); + _green.setVisage(375); + _green.setStrip(1); + _green.setFrame(_green.getFrameCount()); + _green.setPosition(Common::Point(193, 147)); } } - } - if ((BF_GLOBALS._bookmark == bFinishedWGreen) && BF_GLOBALS._sceneObjects->contains(&_object7) && - !BF_GLOBALS.getFlag(iWasAmbushed)) { - BF_GLOBALS.setFlag(iWasAmbushed); - BF_GLOBALS._player.disableControl(); + if ((BF_GLOBALS._bookmark == bFinishedWGreen) && BF_GLOBALS._sceneObjects->contains(&_lyle) && + !BF_GLOBALS.getFlag(iWasAmbushed)) { + BF_GLOBALS.setFlag(iWasAmbushed); + BF_GLOBALS._player.disableControl(); - _sceneMode = 0; - _stripManager.start(3582, this); + _sceneMode = 0; + _stripManager.start(3582, this); + } } break; default: @@ -3630,6 +3670,7 @@ void Scene355::postInit(SceneObjectList *OwnerList) { break; } + _item3._sceneRegionId = 18; _harrison.setDetails(355, 18, 20, 19, 1, NULL); _item6.setDetails(10, 355, 2, -1, 14, 1); _item7.setDetails(11, 355, 3, -1, 15, 1); @@ -3640,8 +3681,8 @@ void Scene355::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._sceneItems.addItems(&_item3, &_item6, &_item7, &_item8, &_item9, &_item10, &_item1, NULL); if (BF_GLOBALS._dayNumber == 5) { - _item12.setBounds(Rect(115, 101, 186, 154)); - BF_GLOBALS._sceneItems.push_front(&_item12); + _rentalExit.setBounds(Rect(115, 101, 186, 154)); + BF_GLOBALS._sceneItems.push_front(&_rentalExit); } else { _item2.setDetails(Rect(273, 53, 320, 101), 355, -1, -1, -1, 2, NULL); } @@ -3735,21 +3776,21 @@ void Scene355::signal() { case 3562: if (!BF_GLOBALS.getFlag(unlockBoat)) { BF_GLOBALS.setFlag(unlockBoat); - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); } - SceneItem::display(355, !_doorway._v3 ? 24 : 25); + SceneItem::display2(355, !_doorway._v3 ? 24 : 25); BF_GLOBALS._player.enableControl(); break; case 4550: - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); _object10.remove(); BF_GLOBALS._sound1.play(90); BF_GLOBALS._player._regionBitList |= 0x10; _doorway._v3 = 0; _doorway._v2 = 2; - _object7._flag = 2; + _lyle._flag = 2; BF_GLOBALS._player.enableControl(); break; case 4552: @@ -3762,10 +3803,10 @@ void Scene355::signal() { _sceneMode = 9980; break; case 9992: - _sceneMode = 0; + _sceneMode = 9992; break; default: - _sceneMode = 9992; + _sceneMode = 0; break; } setAction(&_sequenceManager, this, 4554, &BF_GLOBALS._player, NULL); @@ -3785,29 +3826,29 @@ void Scene355::signal() { break; case 9981: _sceneMode = 9994; - _object6.animate(ANIM_MODE_5, NULL); + _green.animate(ANIM_MODE_5, NULL); addFader((const byte *)&black, 10, this); break; case 9982: _sceneMode = 9983; if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) { if (BF_GLOBALS.getFlag(fLyleOnIsland)) { - BF_GLOBALS._player.updateAngle(_object6._position); + BF_GLOBALS._player.updateAngle(_green._position); _stripManager.start(3581, this); } else { - BF_GLOBALS._player.updateAngle(_object7._position); + BF_GLOBALS._player.updateAngle(_lyle._position); _stripManager.start(3570, this); } } else { if (BF_GLOBALS.getFlag(fLyleOnIsland)) { - if (BF_GLOBALS._sceneObjects->contains(&_object6)) { + if (BF_GLOBALS._sceneObjects->contains(&_green)) { BF_INVENTORY.setObjectScene(INV_GRENADES, 860); _stripManager.start(3583, this); } else { signal(); } } else { - BF_GLOBALS._player.updateAngle(_object7._position); + BF_GLOBALS._player.updateAngle(_lyle._position); _stripManager.start(BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 3579 : 3580, this); } } @@ -3823,7 +3864,7 @@ void Scene355::signal() { BF_GLOBALS._sound1.play(109); BF_GLOBALS.setFlag(fTookTrailerAmmo); _stripManager.start(3575, this); - _object7._flag = 1; + _lyle._flag = 1; ++_doorway._v2; break; case 1: @@ -3858,7 +3899,7 @@ void Scene355::signal() { _sceneMode = 0; _stripManager.start(3569, this); BF_INVENTORY.setObjectScene(INV_GRENADES, 1); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_GLOBALS._player._regionBitList |= 0x10; break; case 9986: @@ -3885,13 +3926,13 @@ void Scene355::signal() { } break; case 9988: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) && (BF_INVENTORY.getObjectScene(INV_FLARE) == 0)) { - _object6.postInit(); - _object6.setVisage(373); - _object6.setPosition(Common::Point(-10, -10)); - _object6._flag = 0; + _green.postInit(); + _green.setVisage(373); + _green.setPosition(Common::Point(-10, -10)); + _green._flag = 0; _object9.postInit(); _object9.setPosition(Common::Point(-10, -10)); @@ -3900,24 +3941,24 @@ void Scene355::signal() { _object11.postInit(); _object11.setPosition(Common::Point(-10, -10)); - BF_GLOBALS._sceneItems.push_front(&_object6); + BF_GLOBALS._sceneItems.push_front(&_green); BF_GLOBALS.setFlag(fTookTrailerAmmo); BF_GLOBALS._sound1.fade(0, 5, 60, true, NULL); _sceneMode = 4550; - setAction(&_sequenceManager, this, 4550, &_doorway, &_object6, &_object9, &_object10, &_object11, NULL); + setAction(&_sequenceManager, this, 4550, &_doorway, &_green, &_object9, &_object10, &_object11, NULL); } else { BF_GLOBALS._player.enableControl(); } break; case 9989: - _lockerDoor.postInit(); - _lockerDoor.setVisage(2356); - _lockerDoor.setStrip(2); - BF_GLOBALS._sceneItems.push_front(&_lockerDoor); + _lockerInset.postInit(); + _lockerInset.setVisage(2356); + _lockerInset.setStrip(2); + BF_GLOBALS._sceneItems.push_front(&_lockerInset); if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) { - _lockerDoor.setFrame(2); + _lockerInset.setFrame(2); if (BF_INVENTORY.getObjectScene(INV_FLARE) == 355) { _object5.postInit(); _object5.setVisage(2356); @@ -3927,11 +3968,11 @@ void Scene355::signal() { BF_GLOBALS._sceneItems.push_front(&_object5); } } else { - _lockerDoor.setFrame(1); + _lockerInset.setFrame(1); } - _lockerDoor.setPosition(Common::Point(82, 115)); - _lockerDoor.fixPriority(254); + _lockerInset.setPosition(Common::Point(82, 115)); + _lockerInset.fixPriority(254); BF_GLOBALS._player.enableControl(); break; case 9990: @@ -3949,7 +3990,7 @@ void Scene355::signal() { case 9993: BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 1); SceneItem::display2(355, 29); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); _sceneMode = 0; signal(); break; @@ -3987,11 +4028,11 @@ void Scene355::signal() { } void Scene355::process(Event &event) { - if (BF_GLOBALS._dayNumber == 5) { - // Handling for day 5 - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._dayNumber != 5) { + // Handling for earlier days + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit - if (_item12.contains(event.mousePos)) { + if (_rentalExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW); BF_GLOBALS._events.setCursor(surface); } else { @@ -4001,6 +4042,39 @@ void Scene355::process(Event &event) { } } + if ((_sceneMode != 2357) && (_sceneMode != 1357) && !BF_GLOBALS.getFlag(greenTaken) && + (event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45)) { + if (BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 2357; + setAction(&_sequenceManager, this, 2357, &BF_GLOBALS._player, &_harrison, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 1357; + setAction(&_sequenceManager, this, 1357, &BF_GLOBALS._player, &_harrison, NULL); + BF_GLOBALS.setFlag(gunDrawn); + } + } else { + _item11.startAction(INV_COLT45, event); + } + event.handled = true; + } + } else { + // Day 5 handling + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on the exit to the rental boat + if (_rentalExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(!_modeFlag ? EXITFRAME_SW : EXITFRAME_NE); + 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); + } + } + // Special handling of actions if (event.eventType == EVENT_BUTTON_DOWN) { switch (BF_GLOBALS._events.getCursor()) { @@ -4045,39 +4119,6 @@ void Scene355::process(Event &event) { break; } } - } else { - // All other days - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { - // Check if the cursor is on an exit - if (_item2.contains(event.mousePos)) { - GfxSurface surface = _cursorVisage.getFrame(!_modeFlag ? EXITFRAME_SW : EXITFRAME_NE); - 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 ((_sceneMode != 2357) && (_sceneMode != 1357) && !BF_GLOBALS.getFlag(greenTaken) && - (event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45)) { - if (BF_GLOBALS._player.contains(event.mousePos)) { - BF_GLOBALS._player.disableControl(); - if (BF_GLOBALS.getFlag(gunDrawn)) { - BF_GLOBALS.clearFlag(gunDrawn); - _sceneMode = 2357; - setAction(&_sequenceManager, this, 2357, &BF_GLOBALS._player, &_harrison, NULL); - } else { - BF_GLOBALS._player.disableControl(); - _sceneMode = 1357; - setAction(&_sequenceManager, this, 1357, &BF_GLOBALS._player, &_harrison, NULL); - BF_GLOBALS.setFlag(gunDrawn); - } - } else { - _item11.startAction(INV_COLT45, event); - } - event.handled = true; - } } PalettedScene::process(event); @@ -4085,8 +4126,8 @@ void Scene355::process(Event &event) { void Scene355::dispatch() { PalettedScene::dispatch(); - if (BF_GLOBALS._sceneObjects->contains(&_object7)) { - _object7.updateAngle(BF_GLOBALS._player._position); + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.updateAngle(BF_GLOBALS._player._position); } if (!_action && (BF_GLOBALS._player.getRegionIndex() == 20)) { @@ -4124,7 +4165,7 @@ bool Scene360::Item1::startAction(CursorType action, Event &event) { case CURSOR_TALK: scene->_sceneMode = 3607; BF_GLOBALS._player.disableControl(); - scene->_stripManager.start(3550, this); + scene->_stripManager.start(3550, scene); return true; case INV_COLT45: SceneItem::display2(1, 4); @@ -4233,7 +4274,7 @@ bool Scene360::Object4::startAction(CursorType action, Event &event) { } } -bool Scene360::BsseballCards::startAction(CursorType action, Event &event) { +bool Scene360::BaseballCards::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_LOOK: if (event.mousePos.x >= (_bounds.left + _bounds.width() / 2)) @@ -4249,7 +4290,7 @@ bool Scene360::BsseballCards::startAction(CursorType action, Event &event) { } } -bool Scene360::Object6::startAction(CursorType action, Event &event) { +bool Scene360::Harrison::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_LOOK: SceneItem::display2(360, 6); @@ -4291,7 +4332,7 @@ void Scene360::Action1::signal() { if (BF_INVENTORY.getObjectScene(INV_WAREHOUSE_KEYS) == 360) { SceneItem::display2(360, 20); BF_INVENTORY.setObjectScene(INV_WAREHOUSE_KEYS, 1); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } else { SceneItem::display2(360, 5); } @@ -4306,13 +4347,12 @@ void Scene360::Action1::signal() { /*--------------------------------------------------------------------------*/ -Scene360::Scene360() { - _field380 = 0; -} - void Scene360::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_field380); + if (s.getVersion() < 9) { + int tmpVar = 0; + s.syncAsSint16LE(tmpVar); + } } void Scene360::postInit(SceneObjectList *OwnerList) { @@ -4390,20 +4430,19 @@ void Scene360::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player._moveDiff.y = 4; BF_GLOBALS._player.enableControl(); - if (BF_GLOBALS._sceneManager._previousScene == 370) { - BF_GLOBALS._player.setPosition(Common::Point(62, 122)); - } else { + if ((BF_GLOBALS._sceneManager._previousScene == 355) || (BF_GLOBALS._sceneManager._previousScene != 370)) { + // The original was using there a useless variable (now removed) BF_GLOBALS._player.setPosition(Common::Point(253, 135)); BF_GLOBALS._player.setStrip(2); if (BF_GLOBALS.getFlag(fBackupIn350)) { - _object6.postInit(); - _object6.setVisage(BF_GLOBALS.getFlag(gunDrawn) ? 363 : 1363); - _object6.animate(ANIM_MODE_1, NULL); - _object6.setObjectWrapper(new SceneObjectWrapper()); - _object6.setPosition(Common::Point(235, 150)); - _object6.setStrip(2); - BF_GLOBALS._sceneItems.push_back(&_object6); + _harrison.postInit(); + _harrison.setVisage(BF_GLOBALS.getFlag(gunDrawn) ? 363 : 1363); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.setPosition(Common::Point(235, 150)); + _harrison.setStrip(2); + BF_GLOBALS._sceneItems.push_back(&_harrison); } _sceneMode = 3607; @@ -4418,13 +4457,16 @@ void Scene360::postInit(SceneObjectList *OwnerList) { _slidingDoor.setPosition(Common::Point(6, 130)); _slidingDoor.setAction(&_sequenceManager1, this, 3606, &_slidingDoor, &_object7, NULL); } + } else { + BF_GLOBALS._player.setPosition(Common::Point(62, 122)); + BF_GLOBALS._player.enableControl(); } _barometer._sceneRegionId = 9; BF_GLOBALS._sceneItems.push_back(&_barometer); _item3._sceneRegionId = 10; BF_GLOBALS._sceneItems.push_back(&_item3); - _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y)); + _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y)); BF_GLOBALS._sceneItems.push_back(&_item1); } @@ -4438,7 +4480,7 @@ void Scene360::signal() { BF_GLOBALS.setFlag(gunDrawn); BF_GLOBALS._deathReason = BF_GLOBALS.getFlag(fBackupIn350) ? 2 : 1; BF_GLOBALS._player.setPosition(Common::Point(BF_GLOBALS._player._position.x - 20, - BF_GLOBALS._player._position.y)); + BF_GLOBALS._player._position.y + 1)); _sceneMode = 3610; setAction(&_sequenceManager1, this, 3610, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL); break; @@ -4447,8 +4489,13 @@ void Scene360::signal() { setAction(&_sequenceManager1, this, 3605, &BF_GLOBALS._player, &_slidingDoor, NULL); break; case 3604: - _sceneMode = BF_GLOBALS.getFlag(fBackupIn350) ? 3603 : 3605; - setAction(&_sequenceManager1, this, _sceneMode, &_object6, NULL); + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _sceneMode = 3603; + setAction(&_sequenceManager1, this, _sceneMode, &_harrison, NULL); + } else { + _sceneMode = 3605; + setAction(&_sequenceManager1, this, _sceneMode, &BF_GLOBALS._player, &_slidingDoor, NULL); + } break; case 3605: if (BF_GLOBALS.getFlag(fBackupIn350)) { @@ -4462,11 +4509,17 @@ void Scene360::signal() { break; case 3607: case 3609: - _object6.setVisage(1363); + // Original game was only using at this place visage 1363. + // This workaround allow Harrison to keep his gun handy + // when entering the romm (if required) + if (! BF_GLOBALS.getFlag(gunDrawn)) + _harrison.setVisage(1363); + else + _harrison.setVisage(363); BF_GLOBALS._player.enableControl(); break; case 3608: - BF_GLOBALS._sceneManager.changeScene(355); + BF_GLOBALS._sceneManager.changeScene(355); break; case 3610: BF_GLOBALS._sceneManager.changeScene(666); @@ -4510,7 +4563,7 @@ void Scene360::process(Event &event) { BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount()); BF_GLOBALS._player.animate(ANIM_MODE_6, this); - _object6.setVisage(1363); + _harrison.setVisage(1363); } } else { // Handle drawing gun @@ -4525,7 +4578,7 @@ void Scene360::process(Event &event) { BF_GLOBALS.setFlag(gunDrawn); _sceneMode = 9998; - _object6.setVisage(363); + _harrison.setVisage(363); } event.handled = true; @@ -4574,7 +4627,7 @@ bool Scene370::GreensGun::startAction(CursorType action, Event &event) { case CURSOR_USE: if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) || BF_GLOBALS.getFlag(greenTaken)) { BF_GLOBALS._player.disableControl(); - BF_GLOBALS._walkRegions.proc2(3); + BF_GLOBALS._walkRegions.enableRegion(3); scene->_sceneMode = 3711; scene->setAction(&scene->_sequenceManager, scene, 3711, &BF_GLOBALS._player, this, NULL); } else { @@ -4603,7 +4656,7 @@ bool Scene370::Green::startAction(CursorType action, Event &event) { scene->_stripManager.start(3717, scene); } else { BF_GLOBALS._player.disableControl(); - BF_GLOBALS._walkRegions.proc2(3); + BF_GLOBALS._walkRegions.enableRegion(3); scene->_sceneMode = 3715; scene->setAction(&scene->_sequenceManager, scene, 3715, &BF_GLOBALS._player, this, NULL); } @@ -4658,7 +4711,7 @@ bool Scene370::Green::startAction(CursorType action, Event &event) { if (_v2 != 3) SceneItem::display2(370, 2); else { - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 3704; scene->setAction(&scene->_sequenceManager, scene, 3704, &BF_GLOBALS._player, this, &scene->_harrison, NULL); @@ -4738,37 +4791,36 @@ bool Scene370::Laura::startAction(CursorType action, Event &event) { bool Scene370::Item1::startAction(CursorType action, Event &event) { Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; - switch (action) { - case CURSOR_LOOK: + if (action == CURSOR_LOOK) { SceneItem::display2(370, 15); return true; - case CURSOR_USE: + } else if (action == CURSOR_USE) { SceneItem::display2(370, 16); return true; - case INV_COLT45: + } else if (action == INV_COLT45) { if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370)) { scene->_green.setAction(NULL); scene->_sceneMode = 3703; scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL); return true; } - // Deliberate fall-through - default: + return false; + } else if (action < CURSOR_WALK) // If any other inventory item used + return false; + else // If any other action is used return NamedHotspot::startAction(action, event); - } } bool Scene370::Item6::startAction(CursorType action, Event &event) { Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; - switch (action) { - case CURSOR_LOOK: + if (action == CURSOR_LOOK) { SceneItem::display2(370, 14); return true; - case CURSOR_USE: + } else if (action == CURSOR_USE) { SceneItem::display2(370, 29); return true; - case INV_COLT45: + } else if (action == INV_COLT45) { if (BF_GLOBALS._sceneObjects->contains(&scene->_green) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 370) && (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1)) { BF_GLOBALS._player.disableControl(); @@ -4777,10 +4829,11 @@ bool Scene370::Item6::startAction(CursorType action, Event &event) { scene->setAction(&scene->_sequenceManager, scene, 3703, &BF_GLOBALS._player, &scene->_green, &scene->_harrison, NULL); return true; } - // Deliberate fall-through - default: return SceneHotspot::startAction(action, event); - } + } else if (action < CURSOR_WALK) // If any other inventory item used + return false; + else // If any other action + return SceneHotspot::startAction(action, event); } @@ -4923,7 +4976,7 @@ void Scene370::signal() { BF_GLOBALS._player.setStrip(3); BF_GLOBALS._sceneItems.push_front(&_laura); - BF_GLOBALS._walkRegions.proc1(3); + BF_GLOBALS._walkRegions.disableRegion(3); _harrison.setAction(NULL); BF_GLOBALS._player.enableControl(); @@ -4933,15 +4986,15 @@ void Scene370::signal() { break; case 3705: _laura.remove(); - BF_GLOBALS._walkRegions.proc2(6); - BF_GLOBALS._walkRegions.proc2(1); + BF_GLOBALS._walkRegions.enableRegion(6); + BF_GLOBALS._walkRegions.enableRegion(1); BF_GLOBALS._player.enableControl(); break; case 3708: _sound1.play(6); BF_GLOBALS._sound1.changeSound(35); BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 370); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_GLOBALS._sceneItems.push_front(&_greensGun); BF_GLOBALS._player.enableControl(); @@ -4950,8 +5003,8 @@ void Scene370::signal() { _sceneMode = 0; _object5.remove(); _green.setAction(NULL); - BF_GLOBALS._walkRegions.proc1(6); - BF_GLOBALS._walkRegions.proc1(1); + BF_GLOBALS._walkRegions.disableRegion(6); + BF_GLOBALS._walkRegions.disableRegion(1); break; case 3709: BF_GLOBALS._player.disableControl(); @@ -4965,15 +5018,15 @@ void Scene370::signal() { _green.setAction(&_sequenceManager, this, 3701, NULL); break; case 3711: - BF_GLOBALS._walkRegions.proc1(3); + BF_GLOBALS._walkRegions.disableRegion(3); BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 1); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); _greensGun.remove(); BF_GLOBALS._player.enableControl(); break; case 3712: - BF_GLOBALS._uiElements._active = false; - BF_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); if (BF_GLOBALS._sceneObjects->contains(&_greensGun)) _greensGun.remove(); @@ -4985,10 +5038,10 @@ void Scene370::signal() { BF_GLOBALS._player._canWalk = false; break; case 3715: - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_INVENTORY.setObjectScene(INV_GREEN_ID, 1); BF_INVENTORY.setObjectScene(INV_GREENS_KNIFE, 1); - BF_GLOBALS._walkRegions.proc1(3); + BF_GLOBALS._walkRegions.disableRegion(3); BF_GLOBALS._player.enableControl(); break; case 3716: @@ -5009,7 +5062,7 @@ void Scene370::signal() { void Scene370::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); @@ -5079,7 +5132,7 @@ void Scene380::postInit(SceneObjectList *OwnerList) { setZoomPercents(68, 80, 131, 100); BF_GLOBALS._sound1.fadeSound(33); - BF_GLOBALS._walkRegions.proc1(9); + BF_GLOBALS._walkRegions.disableRegion(9); _door.postInit(); _door.setVisage(380); @@ -5103,13 +5156,13 @@ void Scene380::postInit(SceneObjectList *OwnerList) { _vechile.setDetails(580, 2, 3, -1, 1, NULL); BF_GLOBALS._player.setVisage(129); - BF_GLOBALS._walkRegions.proc1(12); - BF_GLOBALS._walkRegions.proc1(18); - BF_GLOBALS._walkRegions.proc1(19); - BF_GLOBALS._walkRegions.proc1(20); - BF_GLOBALS._walkRegions.proc1(25); - BF_GLOBALS._walkRegions.proc1(26); - BF_GLOBALS._walkRegions.proc1(27); + BF_GLOBALS._walkRegions.disableRegion(12); + BF_GLOBALS._walkRegions.disableRegion(18); + BF_GLOBALS._walkRegions.disableRegion(19); + BF_GLOBALS._walkRegions.disableRegion(20); + BF_GLOBALS._walkRegions.disableRegion(25); + BF_GLOBALS._walkRegions.disableRegion(26); + BF_GLOBALS._walkRegions.disableRegion(27); } else if (BF_GLOBALS.getFlag(onDuty)) { // Show on duty motorcycle _vechile.setStrip(2); @@ -5259,7 +5312,7 @@ bool Scene385::Door::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_USE: - BF_GLOBALS._walkRegions.proc2(6); + BF_GLOBALS._walkRegions.enableRegion(6); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 3850; scene->setAction(&scene->_sequenceManager, scene, 3850, &BF_GLOBALS._player, this, NULL); @@ -5272,8 +5325,7 @@ bool Scene385::Door::startAction(CursorType action, Event &event) { bool Scene385::Jim::startAction(CursorType action, Event &event) { Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; - switch (action) { - case CURSOR_TALK: + if (action == CURSOR_TALK) { if (scene->_jimFlag) { scene->_talkAction = 3867; scene->setAction(&scene->_action1); @@ -5297,24 +5349,24 @@ bool Scene385::Jim::startAction(CursorType action, Event &event) { break; } - scene->_jimFlag = 1; + scene->_jimFlag = true; scene->setAction(&scene->_action1); } return true; - case INV_PRINT_OUT: + } else if (action == INV_PRINT_OUT) { if (!BF_GLOBALS.getFlag(fGotPointsForMCard)) { - BF_GLOBALS._uiElements.addScore(30); - BF_GLOBALS.getFlag(fGotPointsForMCard); + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForMCard); scene->setAction(&scene->_action2); return true; - } - break; - default: - break; - } - - return NamedObject::startAction(action, event); + } else + return false; + } else if (action < CURSOR_WALK) + // Any other inventory item + return false; + else + return NamedObject::startAction(action, event); } bool Scene385::Dezi::startAction(CursorType action, Event &event) { @@ -5385,7 +5437,8 @@ bool Scene385::Exit::startAction(CursorType action, Event &event) { Scene385::Scene385(): SceneExt() { - _talkAction = _jimFlag = 0; + _talkAction = 0; + _jimFlag = false; } void Scene385::synchronize(Serializer &s) { @@ -5440,7 +5493,7 @@ void Scene385::postInit(SceneObjectList *OwnerList) { _door.setPosition(Common::Point(107, 27)); _door.setDetails(385, 0, -1, -1, 1, NULL); - BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.disableRegion(6); if (BF_GLOBALS._sceneManager._previousScene == 390) { BF_GLOBALS._player.setPosition(Common::Point(109, 119)); @@ -5471,7 +5524,7 @@ void Scene385::signal() { void Scene385::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); @@ -5599,7 +5652,7 @@ bool Scene390::Green::startAction(CursorType action, Event &event) { if (BF_GLOBALS.getFlag(readGreenRights)) { SceneItem::display2(390, 15); } else { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(readGreenRights); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 3904; @@ -5725,7 +5778,7 @@ bool Scene390::GangMember1::startAction(CursorType action, Event &event) { SceneItem::display2(390, 15); } else { BF_GLOBALS.setFlag(readFrankRights); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 3904; @@ -5749,7 +5802,7 @@ bool Scene390::GangMember2::startAction(CursorType action, Event &event) { if (BF_GLOBALS.getFlag(readFrankRights)) { SceneItem::display2(390, 15); } else { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(readFrankRights); BF_GLOBALS._player.disableControl(); @@ -5900,7 +5953,7 @@ void Scene390::signal() { BF_GLOBALS._player.enableControl(); break; case 3905: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); _object2.remove(); BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 1); BF_GLOBALS._player.enableControl(); diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h index 86150433fd..ea9d5f7311 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.h +++ b/engines/tsage/blue_force/blueforce_scenes3.h @@ -94,7 +94,7 @@ class Scene300: public SceneExt { virtual void signal(); }; private: - void setup(); + void setupInspection(); public: SequenceManager _sequenceManager1, _sequenceManager2; SequenceManager _sequenceManager3, _sequenceManager4; @@ -213,9 +213,9 @@ public: int _field1390; int _stripNumber; int _field1398; - int _field1B60, _field1B62, _field1B64; - int _field1B66, _field1B6C, _field139C; - bool _field1B68, _field1B6A; + int _invGreenCount, _bookGreenCount, _invGangCount; + int _bookGangCount, _field1B6C, _field139C; + bool _field1B68, _doorOpened; CursorType _currentCursor; Scene315(); @@ -363,7 +363,7 @@ public: ASoundExt _sound1, _sound2; TimerExt _timer1; Timer2 _timer2; - int _seqNumber1, _field2652, _field2654; + int _seqNumber1, _womanDialogCount, _backupPresent; Scene340(); virtual void synchronize(Serializer &s); @@ -432,7 +432,7 @@ public: class Scene350: public SceneExt { /* Items */ - class Item5: public NamedHotspot { + class FireBox: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; @@ -454,7 +454,7 @@ class Scene350: public SceneExt { public: virtual bool startAction(CursorType action, Event &event); }; - class Object5: public NamedObject { + class FireboxInset: public FocusObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -470,9 +470,9 @@ public: SceneObject _yachtDoor; BackgroundSceneObject _yachtBody; Hook _hook; - Object5 _object5; + FireboxInset _fireBoxInset; NamedHotspot _item1, _item2, _item3, _item4; - Item5 _item5; + FireBox _fireBox; Yacht _yacht; SouthWestExit _swExit; SpeakerGameText _gameTextSpeaker; @@ -505,7 +505,7 @@ class Scene355: public PalettedScene { public: virtual bool startAction(CursorType action, Event &event); }; - class LockerDoor: public NamedObject { + class LockerInset: public FocusObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -513,11 +513,11 @@ class Scene355: public PalettedScene { public: virtual bool startAction(CursorType action, Event &event); }; - class Object6: public NamedObjectExt { + class Green: public NamedObjectExt { public: virtual bool startAction(CursorType action, Event &event); }; - class Object7: public NamedObjectExt { + class Lyle: public NamedObjectExt { public: virtual bool startAction(CursorType action, Event &event); }; @@ -543,7 +543,7 @@ class Scene355: public PalettedScene { public: virtual bool startAction(CursorType action, Event &event); }; - class Item5: public NamedHotspot { + class Pouch: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; @@ -551,7 +551,7 @@ class Scene355: public PalettedScene { public: virtual bool startAction(CursorType action, Event &event); }; - class Item12: public NamedHotspot { + class RentalExit: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; @@ -576,21 +576,21 @@ public: NamedObject _harrison; Doorway _doorway; Locker _locker; - LockerDoor _lockerDoor; + LockerInset _lockerInset; Object5 _object5; - Object6 _object6; - Object7 _object7; + Green _green; + Lyle _lyle; Object8 _object8; NamedObject _object9, _object10, _object11; Item1 _item1; Item2 _item2; Item3 _item3; Item4 _item4; - Item5 _item5; + Pouch _pouch; NamedHotspot _item6, _item7, _item8; NamedHotspot _item9, _item10; Item11 _item11; - Item12 _item12; + RentalExit _rentalExit; ASoundExt _sound1, _sound2, _sound3; Action1 _action1; Action2 _action2; @@ -621,11 +621,11 @@ class Scene360: public SceneExt { public: virtual bool startAction(CursorType action, Event &event); }; - class BsseballCards: public NamedObject { + class BaseballCards: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; - class Object6: public NamedObject { + class Harrison: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -667,8 +667,8 @@ public: SceneObject _object2; Window _window; Object4 _object4; - BsseballCards _baseballCards; - Object6 _object6; + BaseballCards _baseballCards; + Harrison _harrison; Object7 _object7; Item1 _item1; Item2 _item2; @@ -676,9 +676,7 @@ public: Barometer _barometer; Action1 _action1; ASound _sound1; - int _field380; - Scene360(); virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); @@ -815,7 +813,8 @@ public: SpeakerJake385 _jake385Speaker; NamedHotspot _item1, _item2, _item3, _item4, _item5; Exit _exit; - int _talkAction, _jimFlag; + int _talkAction; + bool _jimFlag; Scene385(); virtual void synchronize(Serializer &s); diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp index 07445a7e76..deff4f2518 100644 --- a/engines/tsage/blue_force/blueforce_scenes4.cpp +++ b/engines/tsage/blue_force/blueforce_scenes4.cpp @@ -35,6 +35,7 @@ namespace BlueForce { * *--------------------------------------------------------------------------*/ +// Talk to driver with backup void Scene410::Action1::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; @@ -62,11 +63,12 @@ void Scene410::Action1::signal() { } } +// Talk to passenger with backup void Scene410::Action2::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; BF_GLOBALS._player.disableControl(); - switch (scene->_field1FB8++) { + switch (scene->_talkCount++) { case 0: scene->_sceneMode = 4105; scene->_stripManager.start(BF_GLOBALS.getFlag(fTalkedShooterNoBkup) ? 4123 : 4107, scene); @@ -90,7 +92,7 @@ void Scene410::Action2::signal() { default: SceneItem::display(410, 11, SET_WIDTH, 300, SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 10, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82, SET_EXT_FGCOLOR, 13, LIST_END); BF_GLOBALS._player.enableControl(); @@ -98,12 +100,13 @@ void Scene410::Action2::signal() { } } +// Talk to passenger without backup void Scene410::Action3::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 2; - scene->setAction(&scene->_sequenceManager1, scene, 4102, &scene->_object2, &BF_GLOBALS._player, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4102, &scene->_passenger, &BF_GLOBALS._player, NULL); } else { BF_GLOBALS.setFlag(fTalkedShooterNoBkup); scene->_sceneMode = 0; @@ -111,36 +114,23 @@ void Scene410::Action3::signal() { } } +// Talk to driver without backup void Scene410::Action4::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; - switch (_actionIndex++) { - case 0: - if (scene->_field1FC4 == 0) { - ADD_PLAYER_MOVER(114, 133); - } else { - ADD_PLAYER_MOVER(195, 139); - } - break; - case 1: - BF_GLOBALS._player.updateAngle(scene->_object2._position); - setDelay(3); - break; - case 2: - setDelay(3); - break; - case 3: - if (BF_GLOBALS.getFlag(fCalledBackup)) - scene->setAction(&scene->_action2); - else - scene->setAction(&scene->_action3); - remove(); - break; - default: - break; + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS.setFlag(fTalkedDriverNoBkup); + scene->_sceneMode = 4101; + scene->_stripManager.start(4103, scene); } } +// Talk to passenger void Scene410::Action5::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; @@ -153,7 +143,7 @@ void Scene410::Action5::signal() { } break; case 1: - BF_GLOBALS._player.updateAngle(scene->_object2._position); + BF_GLOBALS._player.updateAngle(scene->_passenger._position); setDelay(3); break; case 2: @@ -171,6 +161,7 @@ void Scene410::Action5::signal() { } } +// Talk to driver void Scene410::Action6::signal() { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; @@ -183,7 +174,7 @@ void Scene410::Action6::signal() { } break; case 1: - BF_GLOBALS._player.updateAngle(scene->_object1._position); + BF_GLOBALS._player.updateAngle(scene->_driver._position); setDelay(3); break; case 2: @@ -222,11 +213,11 @@ void Scene410::Action7::signal() { case 3: BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); - scene->setAction(&scene->_sequenceManager1, this, 4112, &scene->_object1, &scene->_object2, - &scene->_object3, NULL); + setAction(&scene->_sequenceManager1, this, 4112, &scene->_driver, &scene->_passenger, + &scene->_harrison, NULL); break; case 5: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); setAction(&scene->_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL); BF_GLOBALS._player.disableControl(); break; @@ -241,7 +232,7 @@ void Scene410::Action7::signal() { /*--------------------------------------------------------------------------*/ -bool Scene410::Item2::startAction(CursorType action, Event &event) { +bool Scene410::Motorcycle::startAction(CursorType action, Event &event) { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -249,7 +240,7 @@ bool Scene410::Item2::startAction(CursorType action, Event &event) { if (!BF_GLOBALS.getFlag(fCalledBackup)) { scene->_sceneMode = 4103; scene->signal(); - } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_object3)) { + } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_harrison)) { scene->_sceneMode = 4103; scene->signal(); } else if (scene->_field1FBC != 0) { @@ -264,7 +255,7 @@ bool Scene410::Item2::startAction(CursorType action, Event &event) { } } -bool Scene410::Item4::startAction(CursorType action, Event &event) { +bool Scene410::TruckFront::startAction(CursorType action, Event &event) { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -274,7 +265,7 @@ bool Scene410::Item4::startAction(CursorType action, Event &event) { else if (BF_GLOBALS.getFlag(fSearchedTruck)) SceneItem::display2(410, 13); else if (BF_GLOBALS.getFlag(fGangInCar)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_sceneMode = 4118; scene->signal(); } else { @@ -291,7 +282,7 @@ bool Scene410::Item4::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ -bool Scene410::Object1::startAction(CursorType action, Event &event) { +bool Scene410::Driver::startAction(CursorType action, Event &event) { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -307,7 +298,7 @@ bool Scene410::Object1::startAction(CursorType action, Event &event) { } else if (!scene->_field1FC0) { scene->_sceneMode = 4124; scene->_field1FC0 = 1; - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->signal(); } else { break; @@ -318,14 +309,14 @@ bool Scene410::Object1::startAction(CursorType action, Event &event) { return true; case INV_HANDCUFFS: if (BF_GLOBALS.getFlag(fCalledBackup)) { - if ((scene->_field1FB8 < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0)) + if ((scene->_talkCount < 5) || (scene->_field1FB6 < 1) || (scene->_field1FBC != 0)) break; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 4123; scene->_stripManager.start(4125, scene); scene->_field1FBC = 1; - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } else { if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { scene->setAction(&scene->_action4); @@ -340,15 +331,15 @@ bool Scene410::Object1::startAction(CursorType action, Event &event) { } else if (!scene->_field1FC4) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 2; - scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_object2, &BF_GLOBALS._player, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_passenger, &BF_GLOBALS._player, NULL); } else if ((scene->_field1FBC != 0) || (scene->_field1FC2 != 0)) { break; } else { scene->_field1FC2 = 1; - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 4127; - scene->setAction(&scene->_sequenceManager1, scene, 4127, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4127, &BF_GLOBALS._player, &scene->_driver, NULL); } return true; case INV_MIRANDA_CARD: @@ -359,12 +350,12 @@ bool Scene410::Object1::startAction(CursorType action, Event &event) { SceneItem::display2(390, 15); } else { BF_GLOBALS.setFlag(readFrankRights); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 0; // TODO: Original code pushes a copy of the entirety of object1 onto stack - scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 4126, &BF_GLOBALS._player, &scene->_driver, NULL); } return true; default: @@ -374,39 +365,47 @@ bool Scene410::Object1::startAction(CursorType action, Event &event) { return NamedObject::startAction(action, event); } -bool Scene410::Object2::startAction(CursorType action, Event &event) { +bool Scene410::Passenger::startAction(CursorType action, Event &event) { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_USE: if (!BF_GLOBALS.getFlag(fCalledBackup)) { - if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) scene->setAction(&scene->_action3); - } else { - SceneItem::display2(410, 5); - } + else + SceneItem::display(410, 5, SET_WIDTH, 300, + SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99, + SET_EXT_FGCOLOR, 13, LIST_END); } else if (!scene->_field1FBA) { - SceneItem::display2(410, 5); + SceneItem::display(410, 5, SET_WIDTH, 300, + SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 96, SET_EXT_BGCOLOR, 99, + SET_EXT_FGCOLOR, 13, LIST_END); } else if (!scene->_field1FBE) { scene->_sceneMode = 4121; scene->_field1FBE = 1; - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); scene->signal(); - } else { + } else break; - } return true; case CURSOR_TALK: scene->setAction(&scene->_action5); return true; case INV_HANDCUFFS: if (BF_GLOBALS.getFlag(fCalledBackup)) { - if ((scene->_field1FB8 < 5) || (scene->_field1FBA != 0)) + if ((scene->_talkCount < 5) || (scene->_field1FBA != 0)) break; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9; - ADD_PLAYER_MOVER(195, 139); + Common::Point destPos(195, 139); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { scene->setAction(&scene->_action3); } else { @@ -421,12 +420,12 @@ bool Scene410::Object2::startAction(CursorType action, Event &event) { SceneItem::display2(390, 15); } else { BF_GLOBALS.setFlag(readFrankRights); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 0; scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player, - &scene->_object2, NULL); + &scene->_passenger, NULL); } return true; default: @@ -436,7 +435,7 @@ bool Scene410::Object2::startAction(CursorType action, Event &event) { return NamedObject::startAction(action, event); } -bool Scene410::Object3::startAction(CursorType action, Event &event) { +bool Scene410::Harrison::startAction(CursorType action, Event &event) { Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -445,9 +444,16 @@ bool Scene410::Object3::startAction(CursorType action, Event &event) { if (BF_GLOBALS.getFlag(fSearchedTruck)) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 8; - ADD_PLAYER_MOVER(147, 143); + + Common::Point destPos(147, 143); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); } else { - SceneItem::display2(350, 13); + SceneItem::display(350, 13, SET_WIDTH, 300, + SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49, + SET_EXT_FGCOLOR, 13, LIST_END); } } else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) { BF_GLOBALS._player.disableControl(); @@ -457,16 +463,17 @@ bool Scene410::Object3::startAction(CursorType action, Event &event) { BF_GLOBALS.set2Flags(f1098Frankie); BF_GLOBALS.clearFlag(f1098Marina); } else if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) || - (!scene->_field1FBA && (scene->_field1FB8 < 5))) { - SceneItem::display2(350, 13); + (!scene->_field1FBA && (scene->_talkCount < 5))) { + SceneItem::display(350, 13, SET_WIDTH, 300, + SET_X, 10 + GLOBALS._sceneManager._scene->_sceneBounds.left, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 32, SET_EXT_BGCOLOR, 49, + SET_EXT_FGCOLOR, 13, LIST_END); } else if (!scene->_field1FBA) { - if (scene->_field1FBA) - error("Error - want to cuff shooter, but he's cuffed already"); - BF_GLOBALS._player.disableControl(); scene->_field1FBA = 1; scene->_field1FBE = 1; - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); scene->_sceneMode = 4122; scene->_stripManager.start(4112, scene); } else if (scene->_field1FB6 < 1) { @@ -477,7 +484,7 @@ bool Scene410::Object3::startAction(CursorType action, Event &event) { BF_GLOBALS._player.disableControl(); scene->_field1FBC = 1; scene->_field1FC0 = 1; - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); scene->_sceneMode = 4109; scene->_stripManager.start(4112, scene); } @@ -493,14 +500,14 @@ bool Scene410::Object3::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ Scene410::Scene410(): SceneExt() { - _field1FB6 = _field1FB8 = _field1FBA = _field1FBC = 0; + _field1FB6 = _talkCount = _field1FBA = _field1FBC = 0; _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0; } void Scene410::synchronize(Serializer &s) { SceneExt::synchronize(s); s.syncAsSint16LE(_field1FB6); - s.syncAsSint16LE(_field1FB8); + s.syncAsSint16LE(_talkCount); s.syncAsSint16LE(_field1FBA); s.syncAsSint16LE(_field1FBC); s.syncAsSint16LE(_field1FBE); @@ -524,6 +531,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_jakeUniformSpeaker); _stripManager.addSpeaker(&_harrisonSpeaker); _stripManager.addSpeaker(&_shooterSpeaker); + _stripManager.addSpeaker(&_driverSpeaker); BF_GLOBALS._player.postInit(); BF_GLOBALS._player.setVisage(1341); @@ -533,20 +541,20 @@ void Scene410::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.setPosition(Common::Point(114, 133)); BF_GLOBALS._player.changeZoom(-1); - _item2.setDetails(8, 410, 15, -1, -1, 1); + _motorcycle.setDetails(8, 410, 15, -1, -1, 1); - _object2.postInit(); - _object2.setVisage(415); - _object2.setStrip(1); - _object2.setPosition(Common::Point(278, 92)); - _object2.setDetails(410, 4, -1, 5, 1, NULL); + _passenger.postInit(); + _passenger.setVisage(415); + _passenger.setStrip(1); + _passenger.setPosition(Common::Point(278, 92)); + _passenger.setDetails(410, 4, -1, 5, 1, NULL); - _object1.postInit(); - _object1.setVisage(416); - _object1.setStrip(2); - _object1.setPosition(Common::Point(244, 85)); - _object1.setDetails(410, 6, -1, 7, 1, NULL); - _object1.changeZoom(-1); + _driver.postInit(); + _driver.setVisage(416); + _driver.setStrip(2); + _driver.setPosition(Common::Point(244, 85)); + _driver.setDetails(410, 6, -1, 7, 1, NULL); + _driver.changeZoom(-1); _object5.postInit(); _object5.setVisage(410); @@ -558,32 +566,32 @@ void Scene410::postInit(SceneObjectList *OwnerList) { _object6.setStrip(4); _object6.setPosition(Common::Point(240, 43)); - _item4.setDetails(6, 410, 3, -1, -1, 1); - _item3.setDetails(7, 410, 3, -1, -1, 1); + _truckFront.setDetails(6, 410, 3, -1, -1, 1); + _truckBack.setDetails(7, 410, 3, -1, -1, 1); switch (BF_GLOBALS._sceneManager._previousScene) { case 415: BF_GLOBALS.setFlag(fSearchedTruck); BF_GLOBALS._player.setPosition(Common::Point(210, 90)); - _object2.remove(); - _object1.remove(); - BF_GLOBALS._walkRegions.proc1(21); - BF_GLOBALS._walkRegions.proc1(22); - - _object3.postInit(); - _object3.setVisage(343); - _object3.setObjectWrapper(new SceneObjectWrapper()); - _object3.animate(ANIM_MODE_1, NULL); - _object3.setDetails(350, 12, 13, 14, 1, NULL); - _object3.setPosition(Common::Point(97, 185)); - _object3.changeZoom(-1); - - _object4.postInit(); - _object4.setVisage(410); - _object4.setDetails(410, 8, 9, 10, 1, NULL); - _object4.fixPriority(148); - _object4.setPosition(Common::Point(39, 168)); + _passenger.remove(); + _driver.remove(); + BF_GLOBALS._walkRegions.disableRegion(21); + BF_GLOBALS._walkRegions.disableRegion(22); + + _harrison.postInit(); + _harrison.setVisage(343); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setDetails(350, 12, 13, 14, 1, NULL); + _harrison.setPosition(Common::Point(97, 185)); + _harrison.changeZoom(-1); + + _patrolCar.postInit(); + _patrolCar.setVisage(410); + _patrolCar.setDetails(410, 8, 9, 10, 1, NULL); + _patrolCar.fixPriority(148); + _patrolCar.setPosition(Common::Point(39, 168)); _field1FC4 = 1; _sceneMode = 0; @@ -591,62 +599,62 @@ void Scene410::postInit(SceneObjectList *OwnerList) { break; case 60: if (BF_GLOBALS.getFlag(fSearchedTruck)) { - _object2.remove(); - _object1.remove(); + _passenger.remove(); + _driver.remove(); _sceneMode = 0; } else { _field1FC4 = BF_GLOBALS._v50CC8; _field1FBA = BF_GLOBALS._v50CC2; - _field1FB8 = BF_GLOBALS._v50CC6; + _talkCount = BF_GLOBALS._v50CC6; _field1FB6 = BF_GLOBALS._v50CC4; - _object2.setVisage(418); - _object2.setStrip(6); - _object2.setPosition(Common::Point(227, 137)); + _passenger.setVisage(418); + _passenger.setStrip(6); + _passenger.setPosition(Common::Point(227, 137)); - if (_field1FB8 > 0) { - _object2.setVisage(415); - _object2.setStrip(2); - _object2.setFrame(5); + if (_talkCount > 0) { + _passenger.setVisage(415); + _passenger.setStrip(2); + _passenger.setFrame(5); } if (_field1FBA) { - _object2.setVisage(415); - _object2.setStrip(6); - _object2.setFrame(8); + _passenger.setVisage(415); + _passenger.setStrip(6); + _passenger.setFrame(8); } - BF_GLOBALS._walkRegions.proc1(16); + BF_GLOBALS._walkRegions.disableRegion(16); if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) { - _object1.setVisage(417); - _object1.setStrip(1); - _object1.setPosition(Common::Point(152, 97)); + _driver.setVisage(417); + _driver.setStrip(1); + _driver.setPosition(Common::Point(152, 97)); - BF_GLOBALS._walkRegions.proc1(7); + BF_GLOBALS._walkRegions.disableRegion(7); } if (BF_GLOBALS.getFlag(fCalledBackup)) { - BF_GLOBALS._walkRegions.proc1(21); - BF_GLOBALS._walkRegions.proc1(22); + BF_GLOBALS._walkRegions.disableRegion(21); + BF_GLOBALS._walkRegions.disableRegion(22); - _object3.postInit(); - _object3.setVisage(343); - _object3.setObjectWrapper(new SceneObjectWrapper()); - _object3.animate(ANIM_MODE_1, NULL); - _object3.setDetails(350, 12, 13, 14, 1, NULL); - BF_GLOBALS._sceneItems.addBefore(&_object1, &_object3); + _harrison.postInit(); + _harrison.setVisage(343); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setDetails(350, 12, 13, 14, 1, NULL); + BF_GLOBALS._sceneItems.addBefore(&_driver, &_harrison); - _object3.setPosition(Common::Point(-10, 124)); - _object3.changeZoom(-1); + _harrison.setPosition(Common::Point(-10, 124)); + _harrison.changeZoom(-1); - _object4.postInit(); - _object4.setVisage(410); - _object4.setDetails(410, 8, 9, 10, 1, NULL); - _object4.fixPriority(148); + _patrolCar.postInit(); + _patrolCar.setVisage(410); + _patrolCar.setDetails(410, 8, 9, 10, 1, NULL); + _patrolCar.fixPriority(148); if (_field1FC4) { - _object3.setPosition(Common::Point(108, 112)); - _object4.fixPriority(148); - _object4.setPosition(Common::Point(39, 168)); + _harrison.setPosition(Common::Point(108, 112)); + _patrolCar.fixPriority(148); + _patrolCar.setPosition(Common::Point(39, 168)); _sceneMode = 0; } else { @@ -669,7 +677,7 @@ void Scene410::postInit(SceneObjectList *OwnerList) { signal(); - _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 410, 0, 1, 2, 1, NULL); + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 410, 0, 1, 2, 1, NULL); } void Scene410::signal() { @@ -680,7 +688,7 @@ void Scene410::signal() { BF_GLOBALS._v50CC8 = _field1FC4; BF_GLOBALS._v50CC2 = _field1FBA; - BF_GLOBALS._v50CC6 = _field1FB8; + BF_GLOBALS._v50CC6 = _talkCount; BF_GLOBALS._v50CC4 = _field1FB6; BF_GLOBALS._sceneManager.changeScene(60); break; @@ -709,12 +717,13 @@ void Scene410::signal() { break; case 7: BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1); + _sceneMode = 0; signal(); break; case 8: - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); BF_GLOBALS._player.changeAngle(225); - _object3.changeAngle(45); + _harrison.changeAngle(45); _sceneMode = 4114; _stripManager.start(4120, this); break; @@ -723,74 +732,82 @@ void Scene410::signal() { _stripManager.start(4111, this); _field1FBA = 1; BF_GLOBALS.setFlag(fCuffedFrankie); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); break; case 10: - BF_GLOBALS._player.updateAngle(_object3._position); + BF_GLOBALS._player.updateAngle(_harrison._position); _sceneMode = 0; break; case 4100: BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4100, &_object2, &_object5, NULL); - BF_GLOBALS._walkRegions.proc1(16); + setAction(&_sequenceManager1, this, 4100, &_passenger, &_object5, NULL); + BF_GLOBALS._walkRegions.disableRegion(16); break; case 4101: + // Driver gets out of the car BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4100, &_object1, &_object6, NULL); + setAction(&_sequenceManager1, this, 4101, &_driver, &_object6, NULL); BF_GLOBALS.setFlag(fDriverOutOfTruck); - BF_GLOBALS._walkRegions.proc1(7); + BF_GLOBALS._walkRegions.disableRegion(7); break; case 4103: + // Click on moto to ask for backup BF_GLOBALS._player.disableControl(); _sceneMode = 1; setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL); break; case 4104: + // After call for backup, patrol car is coming _field1FC4 = 1; BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4104, &_object4, &_object3, NULL); + setAction(&_sequenceManager1, this, 4104, &_patrolCar, &_harrison, NULL); break; case 4105: + // Second guy gets nervous BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4105, &_object2, NULL); + setAction(&_sequenceManager1, this, 4105, &_passenger, NULL); + break; case 4106: BF_GLOBALS._player.disableControl(); _sceneMode = 4119; - setAction(&_sequenceManager1, this, 4106, &_object2, NULL); + setAction(&_sequenceManager1, this, 4106, &_passenger, NULL); break; case 4107: BF_GLOBALS._player.disableControl(); _sceneMode = 5; - setAction(&_sequenceManager1, this, 4107, &_object2, NULL); + setAction(&_sequenceManager1, this, 4107, &BF_GLOBALS._player, &_passenger, NULL); break; case 4108: BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); - BF_GLOBALS._walkRegions.proc2(22); - BF_GLOBALS._walkRegions.proc2(16); + BF_GLOBALS._walkRegions.enableRegion(22); + BF_GLOBALS._walkRegions.enableRegion(7); + BF_GLOBALS._walkRegions.enableRegion(16); BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4108, &_object3, NULL); + setAction(&_sequenceManager1, this, 4108, &_harrison, NULL); break; case 4109: + // Harrison puts handcuffs to driver if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) && (BF_GLOBALS._player._position.y != 139)) { - ADD_PLAYER_MOVER(195, 139); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 195, 139); } - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4109, &_object1, &_object3, NULL); + setAction(&_sequenceManager1, this, 4109, &_driver, &_harrison, NULL); break; case 4110: + // Harrisson takes care of the driver BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4110, &_object3, &_object1, NULL); + setAction(&_sequenceManager1, this, 4110, &_harrison, &_driver, NULL); break; case 4112: BF_GLOBALS.setFlag(fGangInCar); @@ -798,21 +815,21 @@ void Scene410::signal() { BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); BF_GLOBALS._player.disableControl(); _sceneMode = 4108; - setAction(&_sequenceManager1, this, 4112, &_object1, &_object2, &_object3, NULL); + setAction(&_sequenceManager1, this, 4112, &_driver, &_passenger, &_harrison, NULL); break; case 4114: - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); BF_GLOBALS._player.disableControl(); _sceneMode = 4116; - setAction(&_sequenceManager1, this, 4114, &_object3, &_object4, NULL); + setAction(&_sequenceManager1, this, 4114, &_harrison, &_patrolCar, NULL); break; case 4116: - BF_GLOBALS._walkRegions.proc2(21); - BF_GLOBALS._walkRegions.proc2(22); - _object3.remove(); + BF_GLOBALS._walkRegions.enableRegion(21); + BF_GLOBALS._walkRegions.enableRegion(22); + _harrison.remove(); BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4116, &_object4, NULL); + setAction(&_sequenceManager1, this, 4116, &_patrolCar, NULL); break; case 4118: BF_GLOBALS._player.disableControl(); @@ -822,30 +839,30 @@ void Scene410::signal() { case 4119: BF_GLOBALS._player.disableControl(); _sceneMode = 4107; - setAction(&_sequenceManager1, this, 4119, &_object2, NULL); + setAction(&_sequenceManager1, this, 4119, &BF_GLOBALS._player, &_passenger, NULL); break; case 4121: BF_GLOBALS._player.disableControl(); _sceneMode = 6; - setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_object2, NULL); + setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_passenger, NULL); break; case 4122: - BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._walkRegions.enableRegion(22); BF_INVENTORY.setObjectScene(INV_22_SNUB, 0); BF_GLOBALS._player.disableControl(); _sceneMode = 0; - setAction(&_sequenceManager1, this, 4122, &_object2, &_object3, NULL); + setAction(&_sequenceManager1, this, 4122, &_passenger, &_harrison, NULL); break; case 4123: BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 0); BF_GLOBALS._player.disableControl(); _sceneMode = 5; - setAction(&_sequenceManager1, this, 4123, &_object1, &BF_GLOBALS._player, NULL); + setAction(&_sequenceManager1, this, 4123, &_driver, &BF_GLOBALS._player, NULL); break; case 4124: BF_GLOBALS._player.disableControl(); _sceneMode = 7; - setAction(&_sequenceManager1, this, 4124, &_object1, &BF_GLOBALS._player, NULL); + setAction(&_sequenceManager1, this, 4124, &_driver, &BF_GLOBALS._player, NULL); break; case 4127: SceneItem::display2(410, 16); @@ -867,14 +884,14 @@ void Scene410::process(Event &event) { event.handled = true; BF_GLOBALS._player.disableControl(); _sceneMode = 2; - setAction(&_sequenceManager1, this, 4102, &_object2, &BF_GLOBALS._player, NULL); + setAction(&_sequenceManager1, this, 4102, &_passenger, &BF_GLOBALS._player, NULL); } } else if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { if (!_action) { _sceneMode = 1; BF_GLOBALS._player.disableControl(); _sceneMode = 2; - setAction(&_sequenceManager1, this, 4120, &_object2, &BF_GLOBALS._player, NULL); + setAction(&_sequenceManager1, this, 4120, &_passenger, &BF_GLOBALS._player, NULL); } } } @@ -886,7 +903,7 @@ void Scene410::process(Event &event) { void Scene410::dispatch() { SceneExt::dispatch(); if ((_sceneMode == 4112) || (_sceneMode == 4101)) { - _object3.updateAngle(_object1._position); + _harrison.updateAngle(_driver._position); } } @@ -911,6 +928,17 @@ bool Scene415::GunInset::startAction(CursorType action, Event &event) { } } +void Scene415::GunInset::remove() { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_gunAndWig.remove(); + FocusObject::remove(); + + scene->_sceneMode = 0; + scene->_animatedSeat.animate(ANIM_MODE_6, scene); +} + bool Scene415::GunAndWig::startAction(CursorType action, Event &event) { Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; @@ -920,19 +948,19 @@ bool Scene415::GunAndWig::startAction(CursorType action, Event &event) { BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1); BF_INVENTORY.setObjectScene(INV_WIG, 1); BF_GLOBALS.setFlag(fGotAutoWeapon); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); remove(); return true; case INV_FOREST_RAP: - if (scene->_fieldE14) + if (scene->_scoreWigRapFlag) break; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 0; scene->_stripManager.start(4126, scene); - BF_GLOBALS._uiElements.addScore(50); - scene->_fieldE14 = true; + T2_GLOBALS._uiElements.addScore(50); + scene->_scoreWigRapFlag = true; return true; default: break; @@ -945,7 +973,7 @@ bool Scene415::BulletsInset::startAction(CursorType action, Event &event) { Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; if (action == CURSOR_USE) { - if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + if (BF_GLOBALS.getFlag(fGotBulletsFromDash)) { FocusObject::startAction(action, event); } else { remove(); @@ -957,6 +985,13 @@ bool Scene415::BulletsInset::startAction(CursorType action, Event &event) { } } +void Scene415::BulletsInset::remove() { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + scene->_theBullets.remove(); + FocusObject::remove(); +} + bool Scene415::DashDrawer::startAction(CursorType action, Event &event) { Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; @@ -976,23 +1011,22 @@ bool Scene415::TheBullets::startAction(CursorType action, Event &event) { NamedObject::startAction(action, event); BF_INVENTORY.setObjectScene(INV_22_BULLET, 1); BF_GLOBALS.setFlag(fGotBulletsFromDash); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); remove(); scene->_dashDrawer.remove(); return true; case INV_FOREST_RAP: - if (scene->_fieldE16) { + if (scene->_scoreBulletRapFlag) { SceneItem::display2(415, 35); - return true; } else { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 0; scene->_stripManager.start(4122, scene); - BF_GLOBALS._uiElements.addScore(50); - scene->_fieldE16 = true; + T2_GLOBALS._uiElements.addScore(50); + scene->_scoreBulletRapFlag = true; } - break; + return true; default: break; } @@ -1012,7 +1046,7 @@ bool Scene415::Lever::startAction(CursorType action, Event &event) { } else { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 2; - scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_object6, NULL); + scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_animatedSeat, NULL); } return true; default: @@ -1023,13 +1057,13 @@ bool Scene415::Lever::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ Scene415::Scene415(): SceneExt() { - _fieldE14 = _fieldE16 = false; + _scoreWigRapFlag = _scoreBulletRapFlag = false; } void Scene415::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_fieldE14); - s.syncAsSint16LE(_fieldE16); + s.syncAsSint16LE(_scoreWigRapFlag); + s.syncAsSint16LE(_scoreBulletRapFlag); } void Scene415::postInit(SceneObjectList *OwnerList) { @@ -1044,11 +1078,11 @@ void Scene415::postInit(SceneObjectList *OwnerList) { _dashDrawer.setPosition(Common::Point(151, 97)); _dashDrawer.setDetails(415, 22, -1, -1, 1, NULL); - _object6.postInit(); - _object6.setVisage(419); - _object6.setStrip(1); - _object6.setPosition(Common::Point(306, 116)); - _object6.fixPriority(80); + _animatedSeat.postInit(); + _animatedSeat.setVisage(419); + _animatedSeat.setStrip(1); + _animatedSeat.setPosition(Common::Point(306, 116)); + _animatedSeat.fixPriority(80); _windowLever.setDetails(16, 415, 25, -1, 26, 1); _item7.setDetails(17, 415, 32, -1, 33, 1); @@ -1058,7 +1092,7 @@ void Scene415::postInit(SceneObjectList *OwnerList) { _dashboard.setDetails(20, 415, 11, 12, 19, 1); _steeringWheel.setDetails(15, 415, 5, 6, 7, 1); _horn.setDetails(31, 415, 8, 9, 10, 1); - _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 415, 0, 1, 2, 1, NULL); + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 415, 0, 1, 2, 1, NULL); BF_GLOBALS._player.enableControl(); BF_GLOBALS._player._canWalk = false; @@ -1241,8 +1275,8 @@ void Scene440::postInit(SceneObjectList *OwnerList) { _lyle.setPosition(Common::Point(135, 128)); _lyle.show(); - BF_GLOBALS._walkRegions.proc1(12); - BF_GLOBALS._walkRegions.proc1(13); + BF_GLOBALS._walkRegions.disableRegion(12); + BF_GLOBALS._walkRegions.disableRegion(13); } else { _vechile.setPosition(Common::Point(169, 121)); _vechile.fixPriority(117); @@ -1263,7 +1297,7 @@ void Scene440::postInit(SceneObjectList *OwnerList) { } BF_GLOBALS._sceneItems.push_back(&_vechile); - BF_GLOBALS._walkRegions.proc1(11); + BF_GLOBALS._walkRegions.disableRegion(11); _doorway.postInit(); _doorway.setVisage(440); @@ -1287,7 +1321,7 @@ void Scene440::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.enableControl(); } - _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y - 1)); + _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y - 1)); BF_GLOBALS._sceneItems.push_back(&_item1); } @@ -1314,7 +1348,7 @@ void Scene440::signal() { * *--------------------------------------------------------------------------*/ -bool Scene450::Object1::startAction(CursorType action, Event &event) { +bool Scene450::Weasel::startAction(CursorType action, Event &event) { Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -1338,7 +1372,7 @@ bool Scene450::Object1::startAction(CursorType action, Event &event) { case INV_FOREST_RAP: BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 450); BF_GLOBALS._player.disableControl(); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_sceneMode = 4505; scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this, @@ -1349,7 +1383,7 @@ bool Scene450::Object1::startAction(CursorType action, Event &event) { } } -bool Scene450::Object3::startAction(CursorType action, Event &event) { +bool Scene450::PinBoy::startAction(CursorType action, Event &event) { Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -1378,7 +1412,7 @@ bool Scene450::Object3::startAction(CursorType action, Event &event) { } } -bool Scene450::Object4::startAction(CursorType action, Event &event) { +bool Scene450::Manager::startAction(CursorType action, Event &event) { Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -1438,7 +1472,7 @@ bool Scene450::Object4::startAction(CursorType action, Event &event) { SceneItem::display2(450, 16); BF_GLOBALS._player.enableControl(); } else { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_sceneMode = 4510; BF_INVENTORY.setObjectScene(INV_NAPKIN, 450); scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL); @@ -1453,12 +1487,12 @@ bool Scene450::Object4::startAction(CursorType action, Event &event) { BF_GLOBALS._player.disableControl(); if (!BF_GLOBALS.getFlag(showEugeneID)) - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(showEugeneID); if ((BF_GLOBALS.getFlag(showRapEugene) || BF_GLOBALS.getFlag(showEugeneNapkin)) && !BF_GLOBALS.getFlag(fMgrCallsWeasel)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_sceneMode = 4511; scene->setAction(&scene->_sequenceManager, scene, 4511, &BF_GLOBALS._player, this, NULL); } else { @@ -1474,7 +1508,7 @@ bool Scene450::Object4::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ -bool Scene450::Item1::startAction(CursorType action, Event &event) { +bool Scene450::Exit::startAction(CursorType action, Event &event) { Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; if (event.eventType == EVENT_BUTTON_DOWN) { @@ -1534,26 +1568,27 @@ void Scene450::postInit(SceneObjectList *OwnerList) { _counterDoor.setDetails(450, 12, -1, 13, 1, NULL); if (BF_GLOBALS._dayNumber != 3) { - _object3.postInit(); - _object3.setVisage(463); - _object3.setPosition(Common::Point(138, 121)); - _object3.fixPriority(100); - _object3.setFrame(_object3.getFrameCount()); - BF_GLOBALS._sceneItems.push_back(&_object3); + _pinBoy.postInit(); + _pinBoy.setVisage(463); + _pinBoy.setPosition(Common::Point(138, 121)); + _pinBoy.fixPriority(100); + _pinBoy.setFrame(_pinBoy.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_pinBoy); } else if (!BF_GLOBALS.getFlag(fWithLyle) || !BF_GLOBALS.getFlag(fGivenNapkin) || - (BF_INVENTORY.getObjectScene(BF_ITEM_67) == 1)) { - _object3.postInit(); - _object3.setVisage(463); - _object3.setPosition(Common::Point(138, 121)); - _object3.fixPriority(100); - _object3.setFrame(_object3.getFrameCount()); - BF_GLOBALS._sceneItems.push_back(&_object3); + (BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1)) { + _pinBoy.postInit(); + _pinBoy.setVisage(463); + _pinBoy.setPosition(Common::Point(138, 121)); + _pinBoy.fixPriority(100); + _pinBoy.setFrame(_pinBoy.getFrameCount()); + BF_GLOBALS._sceneItems.push_back(&_pinBoy); } else { - _object4.postInit(); - _object4.setVisage(467); - _object4.setPosition(Common::Point(138, 121)); - _object4.changeZoom(-1); - BF_GLOBALS._sceneItems.push_back(&_object4); + _manager.postInit(); + _manager.setVisage(467); + _manager.setPosition(Common::Point(138, 121)); + _manager.changeZoom(-1); + _manager.fixPriority(100); + BF_GLOBALS._sceneItems.push_back(&_manager); if (!BF_GLOBALS.getFlag(takenWeasel)) { _object2.postInit(); @@ -1565,18 +1600,18 @@ void Scene450::postInit(SceneObjectList *OwnerList) { _object2.changeZoom(-1); _object2.setDetails(450, 2, 18, 3, 1, NULL); - BF_GLOBALS._walkRegions.proc1(4); - - _object1.postInit(); - _object1.setVisage(466); - _object1.animate(ANIM_MODE_1, NULL); - _object1.setObjectWrapper(new SceneObjectWrapper()); - _object1.setPosition(Common::Point(70, 80)); - _object1.setStrip(5); - _object1.changeZoom(90); - _object1.fixPriority(65); - _object1._flag = 0; - BF_GLOBALS._sceneItems.push_back(&_object1); + BF_GLOBALS._walkRegions.disableRegion(4); + + _weasel.postInit(); + _weasel.setVisage(466); + _weasel.animate(ANIM_MODE_1, NULL); + _weasel.setObjectWrapper(new SceneObjectWrapper()); + _weasel.setPosition(Common::Point(70, 80)); + _weasel.setStrip(5); + _weasel.changeZoom(90); + _weasel.fixPriority(65); + _weasel._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_weasel); } } @@ -1597,20 +1632,22 @@ void Scene450::signal() { break; case 4501: if (BF_GLOBALS._sceneObjects->contains(&_object2)) { + _sceneMode = 450; ADD_MOVER(_object2, -20, 135); } else { + _sceneMode = 451; ADD_PLAYER_MOVER(0, 160); } break; case 4503: - _object1.fixPriority(100); + _weasel.fixPriority(100); BF_GLOBALS._player.enableControl(); break; case 4505: BF_GLOBALS.setFlag(takenWeasel); - _object1.remove(); + _weasel.remove(); _object2.remove(); - BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._walkRegions.enableRegion(4); BF_GLOBALS._player.enableControl(); break; case 4507: @@ -1619,18 +1656,18 @@ void Scene450::signal() { BF_GLOBALS.setFlag(fMgrCallsWeasel); _field19AC = 1; _sceneMode = 4503; - setAction(&_sequenceManager, this, 4503, &_object1, &_door, &_object4, NULL); + setAction(&_sequenceManager, this, 4503, &_weasel, &_door, &_manager, NULL); break; case 4508: - _object4.remove(); + _manager.remove(); BF_GLOBALS._player.enableControl(); BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); break; case 4517: BF_GLOBALS.setFlag(gotTrailer450); - BF_INVENTORY.setObjectScene(BF_ITEM_67, 1); + BF_INVENTORY.setObjectScene(INV_CARAVAN_KEY, 1); _sceneMode = 4508; - setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_object4, &_door, NULL); + setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_manager, &_door, NULL); break; default: BF_GLOBALS._player.enableControl(); @@ -1641,7 +1678,7 @@ void Scene450::signal() { void Scene450::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h index 5da61cfaa0..937c015a4c 100644 --- a/engines/tsage/blue_force/blueforce_scenes4.h +++ b/engines/tsage/blue_force/blueforce_scenes4.h @@ -71,38 +71,38 @@ class Scene410: public SceneExt { }; /* Objects */ - class Object1: public NamedObject { + class Driver: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; - class Object2: public NamedObject { + class Passenger: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; - class Object3: public NamedObject { + class Harrison: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; /* Items */ - class Item2: public NamedHotspot { + class Motorcycle: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; - class Item4: public NamedHotspot { + class TruckFront: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; public: SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; - Object1 _object1; - Object2 _object2; - Object3 _object3; - NamedObject _object4, _object5, _object6; - NamedHotspot _item1; - Item2 _item2; - NamedHotspot _item3; - Item4 _item4; + Driver _driver; + Passenger _passenger; + Harrison _harrison; + NamedObject _patrolCar, _object5, _object6; + NamedHotspot _background; + Motorcycle _motorcycle; + NamedHotspot _truckBack; + TruckFront _truckFront; Action1 _action1; Action2 _action2; Action3 _action3; @@ -116,7 +116,7 @@ public: SpeakerDriver _driverSpeaker; SpeakerShooter _shooterSpeaker; ASoundExt _sound1; - int _field1FB6, _field1FB8, _field1FBA; + int _field1FB6, _talkCount, _field1FBA; int _field1FBC, _field1FBE; int _field1FC0, _field1FC2, _field1FC4; @@ -133,6 +133,7 @@ class Scene415: public SceneExt { class GunInset: public FocusObject { public: virtual bool startAction(CursorType action, Event &event); + virtual void remove(); }; class GunAndWig: public NamedObject { public: @@ -141,6 +142,7 @@ class Scene415: public SceneExt { class BulletsInset: public FocusObject { public: virtual bool startAction(CursorType action, Event &event); + virtual void remove(); }; class DashDrawer: public NamedObject { public: @@ -166,12 +168,12 @@ public: BulletsInset _bulletsInset; DashDrawer _dashDrawer; TheBullets _theBullets; - NamedObject _object6; + NamedObject _animatedSeat; NamedHotspot _item1, _steeringWheel, _horn, _dashboard; NamedHotspot _seat, _windowLever, _item7, _seatBelt; Lever _lever; SpeakerJakeRadio _jakeRadioSpeaker; - bool _fieldE14, _fieldE16; + bool _scoreWigRapFlag, _scoreBulletRapFlag; Scene415(); virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -214,7 +216,7 @@ public: class Scene450: public SceneExt { /* Objects */ - class Object1: public NamedObjectExt { + class Weasel: public NamedObjectExt { public: virtual bool startAction(CursorType action, Event &event); }; @@ -222,17 +224,17 @@ class Scene450: public SceneExt { public: virtual bool startAction(CursorType action, Event &event); }; - class Object3: public NamedObject { + class PinBoy: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; - class Object4: public NamedObject { + class Manager: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; /* Items */ - class Item1: public NamedHotspot { + class Exit: public NamedHotspot { public: virtual bool startAction(CursorType action, Event &event); }; @@ -245,12 +247,13 @@ public: SpeakerEugene _eugeneSpeaker; SpeakerWeasel _weaselSpeaker; SpeakerBilly _billySpeaker; - Object1 _object1; + Weasel _weasel; NamedObject _object2; - Object3 _object3; - Object4 _object4; + PinBoy _pinBoy; + Manager _manager; NamedObject _door, _counterDoor; - NamedHotspot _exit, _interior, _shelf, _counter; + Exit _exit; + NamedHotspot _interior, _shelf, _counter; int _field19AC, _field19AE; Scene450(); diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp index 9b67159f9b..7a250e2233 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.cpp +++ b/engines/tsage/blue_force/blueforce_scenes5.cpp @@ -55,7 +55,7 @@ void Scene550::Action1::signal() { /*--------------------------------------------------------------------------*/ -bool Scene550::Object1::startAction(CursorType action, Event &event) { +bool Scene550::Lyle::startAction(CursorType action, Event &event) { Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -76,8 +76,8 @@ bool Scene550::Object1::startAction(CursorType action, Event &event) { scene->_sceneMode = 5512; scene->setAction(&scene->_action1); } else { - scene->_sceneMode = BF_INVENTORY.getObjectScene(BF_ITEM_67) == 1 ? 5513 : 5512; - scene->_stripManager.setAction(&scene->_action1); + scene->_sceneMode = BF_INVENTORY.getObjectScene(INV_CARAVAN_KEY) == 1 ? 5513 : 5512; + scene->setAction(&scene->_action1); } return true; case INV_SCHEDULE: @@ -101,8 +101,8 @@ bool Scene550::CaravanDoor::startAction(CursorType action, Event &event) { case CURSOR_USE: SceneItem::display2(550, 7); return true; - case BF_ITEM_67: - if ((BF_GLOBALS._dayNumber == 3) || !BF_GLOBALS.getFlag(fWithLyle)) + case INV_CARAVAN_KEY: + if ((BF_GLOBALS._dayNumber != 3) || !BF_GLOBALS.getFlag(fWithLyle)) SceneItem::display2(550, 33); else { BF_GLOBALS._player.disableControl(); @@ -189,8 +189,8 @@ void Scene550::postInit(SceneObjectList *OwnerList) { _vechile.fixPriority(70); if (BF_GLOBALS.getFlag(fWithLyle)) { - BF_GLOBALS._walkRegions.proc1(10); - BF_GLOBALS._walkRegions.proc1(11); + BF_GLOBALS._walkRegions.disableRegion(10); + BF_GLOBALS._walkRegions.disableRegion(11); _vechile.setVisage(444); _vechile.setStrip(4); @@ -198,17 +198,17 @@ void Scene550::postInit(SceneObjectList *OwnerList) { _vechile.setPosition(Common::Point(110, 85)); _vechile.fixPriority(76); - _object1.postInit(); - _object1.setVisage(835); - _object1.setPosition(Common::Point(139, 83)); - _object1.setDetails(550, 29, 30, 31, 1, NULL); - _object1.setStrip(8); + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setPosition(Common::Point(139, 83)); + _lyle.setDetails(550, 29, 30, 31, 1, NULL); + _lyle.setStrip(8); BF_GLOBALS._player.setVisage(303); BF_GLOBALS._player.setPosition(Common::Point(89, 76)); - BF_GLOBALS._player.updateAngle(_object1._position); + BF_GLOBALS._player.updateAngle(_lyle._position); } else { - BF_GLOBALS._walkRegions.proc1(12); + BF_GLOBALS._walkRegions.disableRegion(12); _vechile.setPosition(Common::Point(205, 77)); _vechile.changeZoom(80); @@ -225,28 +225,28 @@ void Scene550::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.setVisage(303); } + } - BF_GLOBALS._sceneItems.push_back(&_vechile); + BF_GLOBALS._sceneItems.push_back(&_vechile); - if (BF_GLOBALS._sceneManager._previousScene == 930) { - _caravanDoor.setFrame(_caravanDoor.getFrameCount()); - BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._sceneManager._previousScene == 930) { + _caravanDoor.setFrame(_caravanDoor.getFrameCount()); + BF_GLOBALS._player.disableControl(); - _sceneMode = 0; - setAction(&_sequenceManager, this, 5512, &BF_GLOBALS._player, &_caravanDoor, NULL); - } else if (BF_GLOBALS.getFlag(onDuty)) { - BF_GLOBALS._player.disableControl(); - _sceneMode = 0; - setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile, NULL); - } else if (!BF_GLOBALS.getFlag(fWithLyle)) { - BF_GLOBALS._player.setPosition(Common::Point(185, 70)); - } else if (BF_GLOBALS._bookmark == bFlashBackOne) { - BF_GLOBALS._player.disableControl(); - _sceneMode = 0; - setAction(&_sequenceManager, this, 5513, &_object1, NULL); - } else { - _sceneMode = 0; - } + _sceneMode = 0; + setAction(&_sequenceManager, this, 5512, &BF_GLOBALS._player, &_caravanDoor, NULL); + } else if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile, NULL); + } else if (!BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.setPosition(Common::Point(185, 70)); + } else if (BF_GLOBALS._bookmark == bFlashBackOne) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 5513, &_lyle, NULL); + } else { + _sceneMode = 0; } _item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL); @@ -296,8 +296,8 @@ void Scene551::Action2::signal() { switch (_actionIndex++) { case 0: - BF_GLOBALS._walkRegions.proc2(18); - BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._walkRegions.enableRegion(18); + BF_GLOBALS._walkRegions.enableRegion(4); scene->_field1CD2 = 1; scene->_harrison.setObjectWrapper(new SceneObjectWrapper()); @@ -316,7 +316,7 @@ void Scene551::Action2::signal() { scene->_harrison.updateAngle(BF_GLOBALS._player._position); if (scene->_drunkStanding._flag == 1) { - BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._walkRegions.disableRegion(4); ADD_PLAYER_MOVER(71, 97); } else { ADD_PLAYER_MOVER(141, 87); @@ -465,7 +465,7 @@ bool Scene551::Drunk::startAction(CursorType action, Event &event) { BF_GLOBALS.set2Flags(f1098Drunk); BF_GLOBALS.setFlag(didDrunk); _flag = 1; - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 5506; @@ -486,7 +486,7 @@ bool Scene551::PatrolCarTrunk::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_USE: if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) != 1) { - BF_GLOBALS._walkRegions.proc2(18); + BF_GLOBALS._walkRegions.enableRegion(18); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 2; scene->setAction(&scene->_sequenceManager, scene, 5503, &BF_GLOBALS._player, &scene->_harrison, this, NULL); @@ -560,7 +560,7 @@ bool Scene551::TrunkKits::startAction(CursorType action, Event &event) { break; case 2: if (!BF_GLOBALS.getFlag(fShowedBluePrint)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(fShowedBluePrint); } @@ -681,7 +681,7 @@ void Scene551::postInit(SceneObjectList *OwnerList) { _vechile2.changeZoom(80); BF_GLOBALS._sceneItems.push_back(&_vechile2); - BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.disableRegion(14); _drunk.postInit(); _drunk.setVisage(550); @@ -812,7 +812,7 @@ void Scene551::signal() { BF_GLOBALS._sceneManager.changeScene(60); break; case 2: - BF_GLOBALS._walkRegions.proc1(18); + BF_GLOBALS._walkRegions.disableRegion(18); _trunkInset.postInit(); _trunkInset.setVisage(553); @@ -850,8 +850,8 @@ void Scene551::signal() { setAction(&_sequenceManager, this, 5507, &BF_GLOBALS._player, &_drunk, &_drunkStanding, NULL); break; case 5507: - BF_GLOBALS._walkRegions.proc1(2); - BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._walkRegions.disableRegion(2); + BF_GLOBALS._walkRegions.disableRegion(4); _drunkStanding._flag = 1; BF_GLOBALS._sceneItems.push_front(&_drunkStanding); @@ -924,7 +924,7 @@ void Scene560::Action1::signal() { scene->_deskChair.setStrip(BF_GLOBALS._player._strip); scene->_deskChair.setPosition(BF_GLOBALS._player._position); - scene->_field380 = 1; + scene->_field380 = true; BF_GLOBALS._player.enableControl(); remove(); break; @@ -950,7 +950,7 @@ void Scene560::Action2::signal() { BF_GLOBALS._player.animate(ANIM_MODE_6, this); break; case 2: - scene->_field380 = 0; + scene->_field380 = false; scene->_deskChair.setPosition(Common::Point(81, 149)); scene->_deskChair.setVisage(561); scene->_deskChair.setStrip(3); @@ -1175,7 +1175,7 @@ void Scene560::SafeInset::signal() { BF_GLOBALS._sceneObjects->draw(); if (!BF_GLOBALS.getFlag(fGotPointsForBank)) { - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_GLOBALS.setFlag(fGotPointsForBank); } @@ -1228,7 +1228,7 @@ void Scene560::SafeInset::process(Event &event) { GfxSurface cursor = _cursorVisage.getFrame(7); BF_GLOBALS._events.setCursor(cursor); - if ((event.mousePos.y < BF_INTERFACE_Y) && (event.eventType == EVENT_BUTTON_DOWN)) { + if ((event.mousePos.y < UI_INTERFACE_Y) && (event.eventType == EVENT_BUTTON_DOWN)) { // Leave the safe view event.handled = true; remove(); @@ -1305,7 +1305,7 @@ bool Scene560::SafeInset::Item::startAction(CursorType action, Event &event) { bool Scene560::Nickel::startAction(CursorType action, Event &event) { if (action == CURSOR_USE) { BF_INVENTORY.setObjectScene(INV_NICKEL, 1); - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); remove(); return true; } else { @@ -1335,7 +1335,7 @@ bool Scene560::BoxInset::Item1::startAction(CursorType action, Event &event) { if (action == CURSOR_USE) { if (!BF_GLOBALS.getFlag(fGotPointsForBox)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fGotPointsForBox); } @@ -1378,7 +1378,7 @@ bool Scene560::Computer::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ Scene560::Scene560(): SceneExt() { - _field380 = _field11EA = 0; + _field380 = _field11EA = false; } void Scene560::postInit(SceneObjectList *OwnerList) { @@ -1433,12 +1433,12 @@ void Scene560::postInit(SceneObjectList *OwnerList) { _deskChair.setStrip(BF_GLOBALS._player._strip); _deskChair.setPosition(BF_GLOBALS._player._position); - _field11EA = 0; - _field380 = 1; + _field11EA = false; + _field380 = true; } else { // Entering study through doorway - _field11EA = 0; - _field380 = 0; + _field11EA = false; + _field380 = false; BF_GLOBALS._player.postInit(); BF_GLOBALS._player.setVisage(563); @@ -1513,7 +1513,7 @@ void Scene560::signal() { } } else if ((_sceneMode != 3) && (_sceneMode != 4)) { if (!BF_GLOBALS.getFlag(fGotPointsForPunch)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fGotPointsForPunch); } @@ -1529,7 +1529,7 @@ void Scene560::signal() { } break; case 10: - _field11EA = 0; + _field11EA = false; BF_GLOBALS._player.enableControl(); break; case 11: @@ -1540,7 +1540,7 @@ void Scene560::signal() { void Scene560::process(Event &event) { if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && - (_field380 == 1) && !_action) { + (_field380) && !_action) { _destPosition = event.mousePos; BF_GLOBALS._player.disableControl(); setAction(&_action2); @@ -1553,7 +1553,7 @@ void Scene560::process(Event &event) { void Scene560::dispatch() { if (!_field11EA && (BF_GLOBALS._player._position.y < 105)) { - _field11EA = 1; + _field11EA = true; BF_GLOBALS._player.disableControl(); BF_GLOBALS._sceneManager.changeScene(270); } @@ -1664,12 +1664,12 @@ void Scene570::PasswordEntry::checkPassword() { if (!_entryBuffer.compareTo("JACKIE") || !_entryBuffer.compareTo("SCUMMVM")) { // Password was correct - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS._player.disableControl(); scene->_sound1.play(73); - BF_GLOBALS._uiElements.hide(); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; scene->_sceneMode = 5701; scene->setAction(&scene->_sequenceManager, scene, 5701, &scene->_object3, NULL); } else { @@ -1846,20 +1846,20 @@ bool Scene570::Icon::startAction(CursorType action, Event &event) { scene->_iconManager.hideList(); switch (_folderId) { case 8: - BF_GLOBALS._uiElements.hide(); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; scene->_sceneMode = 5705; scene->setAction(&scene->_sequenceManager, scene, 5705, &scene->_object3, NULL); break; case 10: - BF_GLOBALS._uiElements.hide(); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; scene->_sceneMode = 5706; scene->setAction(&scene->_sequenceManager, scene, 5706, &scene->_object3, NULL); break; case 12: - BF_GLOBALS._uiElements.hide(); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; scene->_sceneMode = 5707; scene->setAction(&scene->_sequenceManager, scene, 5707, &scene->_object3, NULL); break; @@ -1869,8 +1869,8 @@ bool Scene570::Icon::startAction(CursorType action, Event &event) { break; case 7: scene->_iconManager.hideList(); - BF_GLOBALS._uiElements.hide(); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements.hide(); + T2_GLOBALS._uiElements._active = false; scene->_sceneMode = 5704; scene->setAction(&scene->_sequenceManager, scene, 5704, &scene->_object3, NULL); break; @@ -1889,7 +1889,7 @@ bool Scene570::Icon::startAction(CursorType action, Event &event) { scene->_sound1.play(74); if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 570) { SceneItem::display2(570, 6); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1); } else { SceneItem::display2(570, 7); @@ -1938,7 +1938,7 @@ bool Scene570::PowerSwitch::startAction(CursorType action, Event &event) { scene->_object3.remove(); } else { if (!BF_GLOBALS.getFlag(fGotPointsForCoin)) { - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_GLOBALS.setFlag(fGotPointsForCoin); } @@ -2106,16 +2106,16 @@ void Scene570::signal() { _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB); _iconManager.refreshList(); - BF_GLOBALS._uiElements._active = true; - BF_GLOBALS._uiElements.show(); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); BF_GLOBALS._player.enableControl(); break; case 5704: case 5705: case 5706: case 5707: - BF_GLOBALS._uiElements._active = true; - BF_GLOBALS._uiElements.show(); + T2_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements.show(); _object3.setPosition(Common::Point(220, 75)); _object3.setVisage(572); _object3.setStrip(4); @@ -2220,14 +2220,13 @@ void Scene580::postInit(SceneObjectList *OwnerList) { _vechile.setStrip(3); _vechile.setPosition(Common::Point(165, 76)); _vechile.setDetails(580, 2, 3, -1, 1, NULL); - _vechile.setVisage(303); BF_GLOBALS._player.setVisage(303); - BF_GLOBALS._walkRegions.proc1(8); - BF_GLOBALS._walkRegions.proc1(9); - BF_GLOBALS._walkRegions.proc1(10); - BF_GLOBALS._walkRegions.proc1(11); + BF_GLOBALS._walkRegions.disableRegion(8); + BF_GLOBALS._walkRegions.disableRegion(9); + BF_GLOBALS._walkRegions.disableRegion(10); + BF_GLOBALS._walkRegions.disableRegion(11); } else { _vechile.setPosition(Common::Point(159, 72)); @@ -2333,7 +2332,7 @@ bool Scene590::Skip::startAction(CursorType action, Event &event) { return true; case INV_BASEBALL_CARD: scene->_field17DE = 1; - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2); BF_GLOBALS._player.disableControl(); @@ -2529,7 +2528,7 @@ void Scene590::signal() { void Scene590::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); @@ -2542,6 +2541,14 @@ void Scene590::process(Event &event) { } } +void Scene590::dispatch() { + if (!_action && (BF_GLOBALS._player._position.x < 182) && (BF_GLOBALS._player._position.y > 158)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 5901, &BF_GLOBALS._player, NULL); + } +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes5.h b/engines/tsage/blue_force/blueforce_scenes5.h index 8ff5b40657..76bf4cdbc3 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.h +++ b/engines/tsage/blue_force/blueforce_scenes5.h @@ -41,7 +41,7 @@ using namespace TsAGE; class Scene550: public SceneExt { /* Objects */ - class Object1: public NamedObject { + class Lyle: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -61,7 +61,7 @@ class Scene550: public SceneExt { }; public: SequenceManager _sequenceManager; - Object1 _object1; + Lyle _lyle; CaravanDoor _caravanDoor; Vechile _vechile; NamedHotspot _item1, _item2, _item3; @@ -228,7 +228,8 @@ public: NamedHotspot _chair, _lamp, _item4, _trophy, _watercolours, _fileCabinets; NamedHotspot _certificate, _bookcase, _desk, _carpet, _item12, _office; ASound _sound1; - int _field380, _field11EA; + bool _field380; + bool _field11EA; Common::Point _destPosition; Scene560(); @@ -397,6 +398,7 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); virtual void process(Event &event); + virtual void dispatch(); }; } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp index 0d6587daa9..5fb1b562e0 100644 --- a/engines/tsage/blue_force/blueforce_scenes6.cpp +++ b/engines/tsage/blue_force/blueforce_scenes6.cpp @@ -37,7 +37,7 @@ namespace BlueForce { void Scene600::Action1::signal() { Scene600 *scene = (Scene600 *)BF_GLOBALS._sceneManager._scene; - static const uint32 black = 0; + static byte red[3] = {220, 0, 0}; switch (_actionIndex++) { case 0: @@ -49,8 +49,8 @@ void Scene600::Action1::signal() { break; case 2: scene->_sound1.play(59); - setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_object1, - &BF_GLOBALS._player, &scene->_object3, NULL); + setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_ryan, + &BF_GLOBALS._player, &scene->_skidMarks, NULL); break; case 3: BF_GLOBALS._sound1.play(61); @@ -61,13 +61,13 @@ void Scene600::Action1::signal() { break; case 5: { BF_GLOBALS._player.remove(); - scene->_object1.remove(); + scene->_ryan.remove(); scene->_object2.remove(); - scene->_object3.remove(); + scene->_skidMarks.remove(); - for (int percent = 100; percent >= 0; percent -= 5) { - BF_GLOBALS._scenePalette.fade((byte *)&black, false, percent); - g_system->delayMillis(10); + for (int percent = 100; percent >= 0; percent -= 2) { + BF_GLOBALS._scenePalette.fade((const byte *)&red, false, percent); + g_system->delayMillis(5); } SynchronizedList<SceneObject *>::iterator i; @@ -91,6 +91,8 @@ void Scene600::Action1::signal() { BF_GLOBALS._v51C44 = 0; remove(); break; + default: + break; } } @@ -110,14 +112,14 @@ void Scene600::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.setPosition(Common::Point(639, 0)); BF_GLOBALS._player.disableControl(); - _object3.postInit(); - _object3.hide(); + _skidMarks.postInit(); + _skidMarks.hide(); _object2.postInit(); - - _object1.postInit(); - _object1.setVisage(600); - _object1.setStrip(7); - _object1.setPosition(Common::Point(417, 82)); + + _ryan.postInit(); + _ryan.setVisage(600); + _ryan.setStrip(7); + _ryan.setPosition(Common::Point(417, 82)); BF_GLOBALS.clearFlag(onDuty); BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60); @@ -131,6 +133,14 @@ void Scene600::signal() { BF_GLOBALS._sceneManager.changeScene(620); } +// WORKAROUND: Fix for original game bug where the global scrolling object follower +// remains set to an object within the scene that is no longer active +void Scene600::remove() { + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + + SceneExt::remove(); +} + /*-------------------------------------------------------------------------- * Scene 620 - Hospital cut-scene * @@ -173,7 +183,7 @@ void Scene620::signal() { _object1.postInit(); _object1.setVisage(622); _object1.setPosition(Common::Point(101, 41)); - addFader((const byte *)&black, 2, this); + add2Faders((const byte *)&black, 2, 622, this); break; case 5: _object1.remove(); @@ -232,6 +242,8 @@ void Scene620::signal() { BF_GLOBALS._dayNumber = 3; BF_GLOBALS._sceneManager.changeScene(271); break; + default: + break; } } @@ -273,7 +285,7 @@ void Scene666::postInit(SceneObjectList *OwnerList) { } BF_GLOBALS._scenePalette.loadPalette(BF_GLOBALS._sceneManager._previousScene); - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements._active = false; _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 666, -1, -1, -1, 1, NULL); BF_GLOBALS._player.postInit(); @@ -342,7 +354,7 @@ void Scene666::remove() { BF_GLOBALS._sound1.fadeOut2(NULL); BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; SceneExt::remove(); - BF_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements._active = true; } void Scene666::signal() { @@ -378,8 +390,8 @@ bool Scene690::Object1::startAction(CursorType action, Event &event) { if ((action == CURSOR_USE) && (scene->_object2._strip == 1)) { BF_GLOBALS._player.disableControl(); - BF_GLOBALS._walkRegions.proc2(1); - BF_GLOBALS._walkRegions.proc2(6); + BF_GLOBALS._walkRegions.enableRegion(1); + BF_GLOBALS._walkRegions.enableRegion(6); scene->_sceneMode = 6901; scene->setAction(&scene->_sequenceManager, scene, 6901, &BF_GLOBALS._player, &scene->_object2, &scene->_object1, &scene->_object4, &scene->_object5, NULL); @@ -492,8 +504,8 @@ void Scene690::signal() { BF_GLOBALS._player.enableControl(); break; case 6903: - BF_GLOBALS._walkRegions.proc1(1); - BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.disableRegion(1); + BF_GLOBALS._walkRegions.disableRegion(6); BF_GLOBALS._player.enableControl(); break; default: diff --git a/engines/tsage/blue_force/blueforce_scenes6.h b/engines/tsage/blue_force/blueforce_scenes6.h index 7c35b75053..3f9c14aa11 100644 --- a/engines/tsage/blue_force/blueforce_scenes6.h +++ b/engines/tsage/blue_force/blueforce_scenes6.h @@ -49,12 +49,13 @@ public: SequenceManager _sequenceManager; Action1 _action1; ASoundExt _sound1; - NamedObject _object1, _object2, _object3; + NamedObject _ryan, _object2, _skidMarks; BackgroundSceneObject _object4, _object5; BackgroundSceneObject _object6, _object7, _object8; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); + virtual void remove(); }; class Scene620 : public PalettedScene { diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp index 1d94211871..7b84e3ccdd 100644 --- a/engines/tsage/blue_force/blueforce_scenes7.cpp +++ b/engines/tsage/blue_force/blueforce_scenes7.cpp @@ -31,12 +31,13 @@ namespace TsAGE { namespace BlueForce { /*-------------------------------------------------------------------------- - * Scene 710 - + * Scene 710 - Beach * *--------------------------------------------------------------------------*/ + void Scene710::Timer1::signal() { PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1); - rotation->setDelay(25); + rotation->setDelay(20); rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1); rotation->setDelay(30); rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1); @@ -58,8 +59,7 @@ void Scene710::Action1::signal() { setDelay(3); break; case 1: { - PlayerMover *mover = new PlayerMover(); - BF_GLOBALS._player.addMover(mover, &scene->_laura._position, scene); + ADD_MOVER(BF_GLOBALS._player, scene->_laura._position.x + 8, scene->_laura._position.y + 8); break; } case 2: @@ -67,7 +67,7 @@ void Scene710::Action1::signal() { scene->_stripManager.start(_state, this); break; case 3: - if (_state == 7105) + if (_state != 7105) BF_GLOBALS._player.enableControl(); else { BF_GLOBALS._player.disableControl(); @@ -76,7 +76,7 @@ void Scene710::Action1::signal() { } if (_state < 7104) { _state++; - if ((_state != 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) + if ((_state == 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) _state = 7105; } remove(); @@ -101,7 +101,7 @@ bool Scene710::Object4::startAction(CursorType action, Event &event) { Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene; if ((action == CURSOR_LOOK) && (scene->_kid._position.x < 0)) { - SceneItem::display(710, 13); + SceneItem::display2(710, 13); return true; } else return NamedObject::startAction(action, event); @@ -113,19 +113,19 @@ bool Scene710::Object5::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_LOOK: - if (scene->_v1D64 <= 2) + if (scene->_stickThrowCount <= 2) return NamedObject::startAction(action, event); else { - SceneItem::display(710, 3); - scene->_v1D66 = 1; + SceneItem::display2(710, 3); + scene->_watchCrate = true; return true; } case CURSOR_USE: - if ((scene->_kid._position.x < 0) && (scene->_v1D62 == 1)) { - scene->_v1D64++; - if (scene->_v1D66 == 0) { + if ((scene->_kid._position.x < 0) && (scene->_dogLying)) { + scene->_stickThrowCount++; + if (!scene->_watchCrate) { BF_GLOBALS._player.disableControl(); - scene->_v1D62 = 0; + scene->_dogLying = false; scene->_sceneMode = 7105; scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL); } else { @@ -144,8 +144,8 @@ bool Scene710::Object5::startAction(CursorType action, Event &event) { void Scene710::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); loadScene(710); - _sceneBounds.moveTo(320, 0); + BF_GLOBALS._sound1.fadeSound(14); _soundExt1.fadeSound(48); _v51C34.set(40, 0, 280, 240); @@ -187,7 +187,8 @@ void Scene710::postInit(SceneObjectList *OwnerList) { _item7.setDetails(Rect(0, 0, 640, 52), 710, 11, 17, -1, 1, NULL); _item9.setDetails(Rect(0, 0, 640, 128), 710, 5, 15, -1, 1, NULL); - _v1D62 = _v1D64 = _v1D66 = _v1D68 = 0; + _stickThrowCount = 0; + _dogLying = _watchCrate = _throwStick = false; _action1._state = 7100; _timer1.set(2, NULL); _sceneMode = 7100; @@ -195,7 +196,7 @@ void Scene710::postInit(SceneObjectList *OwnerList) { } void Scene710::signal() { - switch (_sceneMode++) { + switch (_sceneMode) { case 0: BF_GLOBALS._player.enableControl(); break; @@ -205,28 +206,29 @@ void Scene710::signal() { setAction(&_sequenceManager1, this, 7102, &_dog, NULL); break; case 7101: + // Pick up crate part BF_GLOBALS._player.enableControl(); - BF_INVENTORY.setObjectScene(288, 36); + BF_INVENTORY.setObjectScene(INV_CRATE1, 1); _stick.remove(); - BF_GLOBALS._walkRegions.proc2(2); + BF_GLOBALS._walkRegions.enableRegion(2); break; case 7102: _stick.setPosition(Common::Point(100, 122)); _stick.animate(ANIM_MODE_NONE, NULL); _stick._strip = 2; - if (_v1D64 <= 2) + if (_stickThrowCount <= 2) _stick._frame = 2; else { - if (_v1D64 == 3) { + if (_stickThrowCount == 3) { BF_GLOBALS._player.disableControl(); _sceneMode = 0; _stripManager.start(7108, this); } _stick._frame = 1; } - _v1D62 = 1; - BF_GLOBALS._walkRegions.proc1(2); - if ((_v1D68 != 0) && (_sceneMode != 0)) + _dogLying = true; + BF_GLOBALS._walkRegions.disableRegion(2); + if ((_throwStick) && (_sceneMode != 0)) BF_GLOBALS._player.enableControl(); break; case 7103: @@ -239,12 +241,12 @@ void Scene710::signal() { } break; case 7105: - _v1D68 = 1; + _throwStick = true; // No break on purpose case 7104: _sceneMode = 7102; setAction(&_sequenceManager1, this, 7102, &_dog, NULL); - BF_GLOBALS._walkRegions.proc2(2); + BF_GLOBALS._walkRegions.enableRegion(2); break; case 7106: BF_GLOBALS._sound1.fadeOut2(NULL); @@ -256,8 +258,8 @@ void Scene710::signal() { } void Scene710::dispatch() { - if ((_kid._position.x > 0) && (_v1D62 == 1) && (_sceneMode != 7106)) { - _v1D62 = 0; + if ((_kid._position.x > 0) && (_dogLying) && (_sceneMode != 7106)) { + _dogLying = false; _sceneMode = 7103; setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL); } @@ -266,10 +268,10 @@ void Scene710::dispatch() { void Scene710::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_v1D62); - s.syncAsSint16LE(_v1D64); - s.syncAsSint16LE(_v1D66); - s.syncAsSint16LE(_v1D68); + s.syncAsSint16LE(_dogLying); + s.syncAsSint16LE(_stickThrowCount); + s.syncAsSint16LE(_watchCrate); + s.syncAsSint16LE(_throwStick); } diff --git a/engines/tsage/blue_force/blueforce_scenes7.h b/engines/tsage/blue_force/blueforce_scenes7.h index 9bb43453ef..161d94cc2c 100644 --- a/engines/tsage/blue_force/blueforce_scenes7.h +++ b/engines/tsage/blue_force/blueforce_scenes7.h @@ -89,12 +89,15 @@ public: NamedHotspot _item7; NamedHotspot _item8; NamedHotspot _item9; - int _v1D62, _v1D64, _v1D66, _v1D68; + int _stickThrowCount; + bool _dogLying; + bool _watchCrate; + bool _throwStick; - void postInit(SceneObjectList *OwnerList = NULL); - void signal(); - void dispatch(); - void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void synchronize(Serializer &s); }; } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp index 49de0be65c..32cd376891 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.cpp +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -69,7 +69,7 @@ bool Scene800::Doorway::startAction(CursorType action, Event &event) { SceneItem::display2(800, BF_GLOBALS.getFlag(onDuty) ? 6 : 15); else if (((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._dayNumber == 3)) || (BF_GLOBALS._bookmark == bDoneWithIsland)) - SceneItem::display(800, 5); + SceneItem::display2(800, 5); else { if (BF_GLOBALS.getFlag(fWithLyle)) { ADD_PLAYER_MOVER_NULL(scene->_lyle, 277, 145); @@ -103,7 +103,7 @@ bool Scene800::Car1::startAction(CursorType action, Event &event) { else { BF_GLOBALS.setFlag(ticketVW); BF_GLOBALS._player.disableControl(); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); scene->_sceneMode = 8005; scene->setAction(&scene->_action1); } @@ -252,12 +252,12 @@ void Scene800::postInit(SceneObjectList *OwnerList) { _car2.fixPriority(158); BF_GLOBALS._sceneItems.push_back(&_car2); - BF_GLOBALS._walkRegions.proc1(8); + BF_GLOBALS._walkRegions.disableRegion(8); } if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) { _car2.remove(); - BF_GLOBALS._walkRegions.proc2(8); + BF_GLOBALS._walkRegions.enableRegion(8); } if (BF_GLOBALS.getFlag(fWithLyle)) { @@ -305,7 +305,7 @@ void Scene800::postInit(SceneObjectList *OwnerList) { _sceneMode = 8001; setAction(&_sequenceManager, this, 8001, &BF_GLOBALS._player, &_doorway, NULL); } - } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._bookmark == bFlashBackThree)) { + } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && (BF_GLOBALS._bookmark < bFlashBackThree)) { BF_GLOBALS._bookmark = bFlashBackThree; BF_GLOBALS._player.disableControl(); BF_GLOBALS._player.setPosition(Common::Point(231, 150)); @@ -314,7 +314,7 @@ void Scene800::postInit(SceneObjectList *OwnerList) { _lyle.setPosition(Common::Point(244, 162)); _lyle.setStrip(4); _sceneMode = 8004; - setAction(&_sequenceManager, this, 8001, &_lyle, &_doorway, NULL); + setAction(&_sequenceManager, this, 8004, &_lyle, &_doorway, NULL); } else { BF_GLOBALS._player.updateAngle(_motorcycle._position); BF_GLOBALS._player.enableControl(); @@ -344,6 +344,8 @@ void Scene800::signal() { case 8004: BF_GLOBALS.clearFlag(fWithLyle); _lyle.remove(); + BF_GLOBALS._player.enableControl(); + break; } } @@ -357,6 +359,1142 @@ void Scene800::dispatch() { } /*-------------------------------------------------------------------------- + * Scene 810 - Lyle's Office + * + *--------------------------------------------------------------------------*/ + +void Scene810::Action1::signal() { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_lyle._position.x == 115) { + ADD_PLAYER_MOVER(174, 142); + } else if (scene->_lyle._position.x < 160) { + ADD_PLAYER_MOVER(scene->_lyle._position.x + 20, scene->_lyle._position.y + 15); + } else { + ADD_PLAYER_MOVER(scene->_lyle._position.x - 20, scene->_lyle._position.y + 15); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_lyle._position); + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 2: + if (BF_GLOBALS.getFlag(shownFax) && (BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(fWithLyle)) + BF_GLOBALS.setFlag(showMugAround); + + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene810::Action2::signal() { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (!BF_GLOBALS.getFlag(shownLyleCrate1Day1)) + T2_GLOBALS._uiElements.addScore(30); + + if (scene->_lyle._position.x == 115) { + ADD_PLAYER_MOVER(174, 142); + } else { + ADD_PLAYER_MOVER(193, 105); + } + break; + case 1: + BF_GLOBALS._player.setStrip(8); + if (scene->_lyle._position.x != 115) + _actionIndex = 3; + + if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) { + if (BF_GLOBALS.getFlag(onDuty)) { + scene->_stripManager.start(8138, this); + } else { + scene->_stripManager.start((BF_GLOBALS._dayNumber == 3) ? 8110 : 8126, this); + } + } else if (BF_GLOBALS._dayNumber >= 3) { + scene->_stripManager.start(8110, this); + } else { + scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8140 : 8128, this); + } + break; + case 2: + setAction(&scene->_sequenceManager1, this, 8117, &scene->_lyle, &scene->_chair, NULL); + break; + case 3: + BF_GLOBALS._walkRegions.enableRegion(4); + ADD_PLAYER_MOVER_THIS(scene->_lyle, 27, 124); + break; + case 4: + scene->_lyle.setVisage(813); + scene->_lyle.setStrip(2); + scene->_lyle.setFrame(1); + + ADD_PLAYER_MOVER(84, 113); + break; + case 5: + BF_GLOBALS._player.setStrip(8); + scene->_lyle.animate(ANIM_MODE_4, 5, 1, this); + break; + case 6: + scene->_lyle.animate(ANIM_MODE_5, NULL); + scene->_stripManager.start(8111, this); + break; + case 7: + scene->_lyle.setVisage(845); + scene->_lyle.setStrip(1); + scene->_lyle.setFrame(1); + scene->_lyle.animate(ANIM_MODE_1, NULL); + + scene->_stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8137 : 8112, this); + break; + case 8: + BF_GLOBALS._walkRegions.disableRegion(13); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene810::Lyle::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 26); + return true; + + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.updateAngle(_position); + + switch (BF_GLOBALS._dayNumber) { + case 4: + scene->_sceneMode = (BF_INVENTORY.getObjectScene(INV_AUTO_RIFLE) == 810) ? 8001 : 8123; + break; + case 2: + if (BF_GLOBALS.getFlag(shownFax)) + scene->_sceneMode = 8151; + else if (BF_GLOBALS.getFlag(onDuty)) { + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8145 : 8154; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8145; + } else if (!_flag) { + ++_flag; + scene->_sceneMode = 8139; + } else { + scene->_sceneMode = 8152; + } + } else { + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLyleCrate1Day1) ? 8133 : 8153; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8133; + } else if (!_flag) { + ++_flag; + scene->_sceneMode = 8127; + } else { + scene->_sceneMode = 8152; + } + } + break; + default: + if (BF_GLOBALS.getFlag(shownFax)) + scene->_sceneMode = 8146; + else if (BF_GLOBALS.getFlag(shownLylePO) || BF_GLOBALS.getFlag(shownLyleRapsheet) || BF_GLOBALS.getFlag(shownLyleCrate1)) + scene->_sceneMode = 8108; + else if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) + scene->_sceneMode = 8107; + else + scene->_sceneMode = 8155; + break; + } + + scene->setAction(&scene->_action1); + return true; + + case INV_FOREST_RAP: + if (BF_GLOBALS.getFlag(shownLyleRapsheet)) + scene->_sceneMode = 8148; + else { + BF_GLOBALS.setFlag(shownLyleRapsheet); + if (BF_GLOBALS._dayNumber != 2) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8122 : 8101; + } else if (BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8142 : 8143; + } else { + scene->_sceneMode = BF_GLOBALS.getFlag(shownLylePO) ? 8130 : 8131; + } + } + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_COBB_RAP: + if (BF_GLOBALS.getFlag(shownFax)) { + scene->_sceneMode = 8151; + } else { + BF_GLOBALS.setFlag(shownFax); + scene->_sceneMode = 8118; + } + + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_AUTO_RIFLE: + BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 810); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8116; + scene->setAction(&scene->_sequenceManager1, scene, 8116, &BF_GLOBALS._player, NULL); + return true; + + case INV_PRINT_OUT: + if (BF_GLOBALS.getFlag(shownLylePO)) { + scene->_sceneMode = 8149; + } else { + BF_GLOBALS.setFlag(shownLylePO); + if (BF_GLOBALS._dayNumber == 3) { + if (BF_GLOBALS.getFlag(shownFax)) { + BF_GLOBALS.setFlag(shownFax); + scene->_sceneMode = 8125; + } else if (BF_GLOBALS.getFlag(shownLyleRapsheet)) { + scene->_sceneMode = 8104; + } else { + scene->_sceneMode = 8121; + } + } else if (BF_GLOBALS.getFlag(onDuty)) { + if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))){ + scene->_sceneMode = 8141; + } else { + // Doublecheck on shownLyleCrate1 removed: useless + scene->_sceneMode = 8144; + } + } else { + if ((BF_GLOBALS.getFlag(shownLyleRapsheet)) || (BF_GLOBALS.getFlag(shownLyleCrate1))) { + scene->_sceneMode = 8129; + } else { // if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + scene->_sceneMode = 8132; + // doublecheck Present in the original, may hide a bug in the original + //} else + // scene->_sceneMode = 8121; + } + } + } + + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action1); + return true; + + case INV_CRATE1: + if (BF_GLOBALS.getFlag(shownLyleCrate1)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8147; + scene->setAction(&scene->_action1); + } else { + BF_GLOBALS.setFlag(shownLyleCrate1); + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_action2); + } + return true; + + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene810::Chair::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 28); + return true; + case CURSOR_USE: + SceneItem::display2(810, 29); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object3::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 30); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(seenFolder)) { + BF_GLOBALS.setFlag(seenFolder); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8104; + scene->setAction(&scene->_sequenceManager1, scene, 8104, &BF_GLOBALS._player, this, NULL); + } else if (BF_INVENTORY.getObjectScene(INV_MICROFILM) == 810) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8114; + scene->setAction(&scene->_sequenceManager1, scene, 8114, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display2(810, 38); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::FaxMachineInset::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_LOOK: + SceneItem::display2(810, 32); + return true; + case CURSOR_USE: + if (scene->_rect3.contains(event.mousePos)) { + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + T2_GLOBALS._uiElements.addScore(50); + scene->_sound1.play(77); + scene->_fieldA70 = 1; + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8109; + scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player, + &scene->_object6, &scene->_object5, NULL); + scene->_fieldA74 = 1; + remove(); + } else { + SceneItem::display2(810, 39); + } + } + + if (scene->_rect1.contains(event.mousePos) || scene->_rect2.contains(event.mousePos)) { + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + scene->_sound1.play(77); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8109; + scene->setAction(&scene->_sequenceManager1, scene, 8109, &BF_GLOBALS._player, + &scene->_object6, &scene->_object5, NULL); + scene->_fieldA74 = 1; + remove(); + } else { + SceneItem::display2(810, 39); + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object5::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 33); + return true; + case CURSOR_USE: { + scene->_sceneMode = 8195; + BF_GLOBALS._player.disableControl(); + + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(67, 111); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + return true; + } + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene810::Object7::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8113; + scene->setAction(&scene->_sequenceManager1, scene, 8113, &BF_GLOBALS._player, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene810::Map::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 0); + return true; + case CURSOR_USE: + SceneItem::display2(810, 1); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Window::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 2); + return true; + case CURSOR_USE: + SceneItem::display2(810, 3); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Bookcase::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 4); + return true; + case CURSOR_USE: + SceneItem::display2(810, 5); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::FaxMachine::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 6); + return true; + case CURSOR_USE: + if (scene->_fieldA74 == 1) { + scene->_object5.startAction(action, event); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8105; + + Common::Point destPos(67, 111); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } + return true; + case INV_PRINT_OUT: + if (BF_INVENTORY.getObjectScene(INV_COBB_RAP) == 1) + SceneItem::display2(810, 31); + else { + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 811); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 811; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_lyle)) { + scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8108 : 8105, + &BF_GLOBALS._player, &scene->_object6, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 8111, &BF_GLOBALS._player, + &scene->_object6, NULL); + } + } + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::GarbageCan::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 8); + return true; + case CURSOR_USE: + SceneItem::display2(810, 9); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::FileCabinets::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 10); + return true; + case CURSOR_USE: + SceneItem::display2(810, 11); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::CoffeeMaker::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 12); + return true; + case CURSOR_USE: + SceneItem::display2(810, 13); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Shelves::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 14); + return true; + case CURSOR_USE: + SceneItem::display2(810, 15); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::MicroficheReader::startAction(CursorType action, Event &event) { + Scene810 *scene = (Scene810 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 16); + return true; + case CURSOR_USE: + SceneItem::display2(810, 17); + return true; + case INV_MICROFILM: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8106; + scene->setAction(&scene->_sequenceManager1, scene, 8106, &BF_GLOBALS._player, NULL); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Item10::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 18); + return true; + case CURSOR_USE: + SceneItem::display2(810, 19); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Pictures::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 20); + return true; + case CURSOR_USE: + SceneItem::display2(810, 21); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Item12::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 22); + return true; + case CURSOR_USE: + SceneItem::display2(810, 23); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Background::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 24); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Desk::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(810, 36); + return true; + case CURSOR_USE: + SceneItem::display2(810, 37); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene810::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(event.mousePos.x + 30, event.mousePos.y); + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene810::Scene810(): SceneExt() { + _fieldA70 = _fieldA74 = 0; + _rect1 = Rect(68, 12, 120, 22); + _rect2 = Rect(59, 27, 117, 37); + _rect3 = Rect(49, 43, 112, 54); +} + +void Scene810::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldA70); + s.syncAsSint16LE(_fieldA72); + s.syncAsSint16LE(_fieldA74); +} + +void Scene810::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(810); + setZoomPercents(90, 80, 135, 100); + if (BF_GLOBALS._sceneManager._previousScene != 820) + BF_GLOBALS._sound1.fadeSound(76); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + 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.changeZoom(-1); + BF_GLOBALS._player._moveDiff = Common::Point(5, 3); + BF_GLOBALS._player.enableControl(); + + if (BF_GLOBALS._dayNumber == 2) + BF_GLOBALS.setFlag(beenToJRDay2); + + if (BF_GLOBALS._dayNumber == 3) { + _object3.postInit(); + _object3.setVisage(810); + _object3.setStrip(3); + _object3.setPosition(Common::Point(154, 97)); + _object3.fixPriority(128); + BF_GLOBALS._sceneItems.push_back(&_object3); + } + + if (BF_GLOBALS._dayNumber == 4) { + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 0); + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 0); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 0); + BF_INVENTORY.setObjectScene(INV_CRATE1, 0); + } + + _desk._sceneRegionId = 12; + BF_GLOBALS._sceneItems.push_back(&_desk); + + _lyle.postInit(); + _lyle.setVisage(812); + _lyle.setPosition(Common::Point(115, 112)); + _lyle._moveDiff = Common::Point(4, 2); + _lyle.changeZoom(-1); + _lyle._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_lyle); + + _chair.postInit(); + _chair.setVisage(810); + _chair.setStrip(2); + _chair.setPosition(Common::Point(113, 126)); + _chair.hide(); + BF_GLOBALS._sceneItems.push_back(&_chair); + + _object6.postInit(); + _object6.setVisage(810); + _object6.setStrip(6); + _object6.setPosition(Common::Point(51, 65)); + _object6._numFrames = 3; + _object6.hide(); + + _object5.postInit(); + _object5.setVisage(810); + _object5.setStrip(5); + _object5.setPosition(Common::Point(58, 82)); + _object5._numFrames = 3; + _object5.fixPriority(108); + _object5.hide(); + + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 811) { + _object5.show(); + BF_GLOBALS._sceneItems.push_back(&_object5); + } + + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) { + _lyle.remove(); + _chair.show(); + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 820: + BF_GLOBALS._player.setStrip(7); + BF_GLOBALS._player.setPosition(Common::Point(278, 116)); + + _lyle.setVisage(845); + _lyle.setPosition(Common::Point(340, 175)); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + + _chair.show(); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 8107; + setAction(&_sequenceManager1, this, 8107, &BF_GLOBALS._player, &_lyle, NULL); + break; + case 935: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._scenePalette.loadPalette(2); + _lyle.remove(); + + BF_GLOBALS._player.setPosition(Common::Point(174, 142)); + BF_GLOBALS._player.setStrip(8); + BF_GLOBALS._player.enableControl(); + + _chair.remove(); + break; + default: + BF_GLOBALS._player.setPosition(Common::Point(340, 180)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8100; + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.setVisage(845); + _lyle.setPosition(Common::Point(340, 175)); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + + _chair.show(); + _sceneMode = 8196; + setAction(&_sequenceManager1, NULL, 8100, &BF_GLOBALS._player, NULL); + _lyle.setAction(&_sequenceManager2, this, 8107, &BF_GLOBALS._player, &_lyle, NULL); + } else { + setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL); + } + break; + } + + _exit.setDetails(Rect(315, 117, 320, 154), 810, -1, -1, -1, 1, NULL); + _map.setBounds(Rect(10, 10, 81, 52)); + _window.setBounds(Rect(96, 10, 155, 49)); + _bookcase.setBounds(Rect(5, 70, 74, 105)); + _garbageCan.setBounds(Rect(84, 118, 101, 142)); + _fileCabinets.setBounds(Rect(203, 41, 255, 100)); + _coffeeMaker.setBounds(Rect(182, 54, 202, 89)); + _shelves.setBounds(Rect(265, 10, 319, 41)); + _microficheReader.setBounds(Rect(283, 47, 314, 73)); + + _faxMachine._sceneRegionId = 8; + BF_GLOBALS._sceneItems.push_back(&_faxMachine); + _item10._sceneRegionId = 9; + BF_GLOBALS._sceneItems.push_back(&_item10); + _pictures._sceneRegionId = 10; + BF_GLOBALS._sceneItems.push_back(&_pictures); + _item12._sceneRegionId = 8; + BF_GLOBALS._sceneItems.push_back(&_item12); + + BF_GLOBALS._sceneItems.addItems(&_microficheReader, &_map, &_window, &_bookcase, &_garbageCan, + &_fileCabinets, &_coffeeMaker, &_shelves, &_background, NULL); + _background.setBounds(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y)); +} + +void Scene810::signal() { + switch (_sceneMode) { + case 811: + case 8105: + _faxMachineInset.postInit(); + _faxMachineInset.setVisage(810); + _faxMachineInset.setPosition(Common::Point(77, 94)); + _faxMachineInset.setStrip(8); + _faxMachineInset.fixPriority(250); + BF_GLOBALS._sceneItems.push_back(&_faxMachineInset); + BF_GLOBALS._player.enableControl(); + break; + case 8100: + if (BF_GLOBALS.getFlag(examinedFile810)) { + if ((BF_GLOBALS._dayNumber == 4) && BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8115; + setAction(&_sequenceManager1, this, 8115, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + } else { + if ((BF_GLOBALS._dayNumber == 3) && BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8103; + setAction(&_sequenceManager1, this, 8103, &BF_GLOBALS._player, &_lyle, &_chair, NULL); + } else if (BF_GLOBALS.getFlag(shownLyleCrate1Day1) && !BF_GLOBALS.getFlag(shownLyleCrate1)) { + BF_GLOBALS.setFlag(shownLyleCrate1); + setAction(&_action2); + } else { + BF_GLOBALS._player.enableControl(); + } + } + break; + case 8101: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(800); + break; + case 8103: + _lyle.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 8104: + BF_GLOBALS.setFlag(examinedFile810); + _object7.postInit(); + _object7.setVisage(810); + _object7.setPosition(Common::Point(54, 101)); + _object7.fixPriority(200); + BF_GLOBALS._sceneItems.push_front(&_object7); + BF_GLOBALS._player.enableControl(); + break; + case 8106: + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_MICROFILM, 820); + BF_GLOBALS._sceneManager.changeScene(820); + break; + case 8107: + if (BF_GLOBALS.getFlag(shownFax)) { + BF_GLOBALS.setFlag(showMugAround); + } else { + BF_GLOBALS._walkRegions.disableRegion(4); + BF_GLOBALS._player.enableControl(); + } + break; + case 8109: + _object6.setFrame(1); + BF_GLOBALS._sceneItems.push_front(&_object5); + BF_GLOBALS._player.enableControl(); + break; + case 8110: + case 8115: + BF_GLOBALS._player.enableControl(); + break; + case 8112: + BF_GLOBALS.setFlag(fWithLyle); + BF_GLOBALS._sceneManager.changeScene(800); + break; + case 8113: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(935); + break; + case 8114: + T2_GLOBALS._uiElements.addScore(10); + BF_INVENTORY.setObjectScene(INV_MICROFILM, 1); + BF_GLOBALS._player.enableControl(); + break; + case 8116: + BF_GLOBALS._bookmark = bDoneWithIsland; + BF_GLOBALS._player.enableControl(); + break; + case 8195: + BF_GLOBALS._player.setStrip(8); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1); + if (_fieldA70 == 1) { + BF_INVENTORY.setObjectScene(INV_COBB_RAP, 1); + _sceneMode = 8110; + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _sceneMode = 8198; + BF_GLOBALS.setFlag(shownFax); + _stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8135 : 8106, this); + } else { + _stripManager.start(8117, this); + } + } else { + SceneItem::display2(810, 34); + BF_GLOBALS._player.enableControl(); + } + + _fieldA74 = 0; + _object5.hide(); + _object5.setFrame(1); + break; + case 8196: + BF_GLOBALS._walkRegions.disableRegion(4); + BF_GLOBALS._player.enableControl(); + break; + case 8198: + if (BF_GLOBALS._dayNumber == 3) { + BF_GLOBALS.setFlag(showMugAround); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + default: + break; + } +} + +void Scene810::process(Event &event) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); + 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.handled) + SceneExt::process(event); +} + +void Scene810::dispatch() { + SceneExt::dispatch(); + + if (BF_GLOBALS._sceneObjects->contains(&_lyle) && (BF_GLOBALS._player._position.x != 115) && !_lyle._mover) { + _lyle.updateAngle(BF_GLOBALS._player._position); + } + + if (BF_GLOBALS._sceneObjects->contains(&_faxMachineInset) && (BF_GLOBALS._player._position.x != 67) && + (BF_GLOBALS._player._position.y != 111)) { + _faxMachineInset.remove(); + } + + if (!_action) { + if (BF_GLOBALS.getFlag(showMugAround)) { + if (_lyle._position.y == 115) { + BF_GLOBALS._player.disableControl(); + + _sceneMode = 8110; + setAction(&_sequenceManager1, this, 8117, &_lyle, &_chair, NULL); + } else { + BF_GLOBALS.clearFlag(showMugAround); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.enableRegion(4); + BF_GLOBALS._walkRegions.enableRegion(13); + + _sceneMode = 8112; + setAction(&_sequenceManager1, this, 8112, &BF_GLOBALS._player, &_lyle, NULL); + } + } + + if (BF_GLOBALS._player._position.x >= 318) { + BF_GLOBALS._player.disableControl(); + + if ((BF_GLOBALS._dayNumber == 3) && !BF_GLOBALS.getFlag(examinedFile810)) { + SceneItem::display2(810, 35); + _sceneMode = 8100; + setAction(&_sequenceManager1, this, 8100, &BF_GLOBALS._player, NULL); + } else { + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._walkRegions.enableRegion(4); + BF_GLOBALS._walkRegions.enableRegion(13); + + ADD_MOVER_NULL(_lyle, 320, 155); + } + + _sceneMode = 8101; + setAction(&_sequenceManager1, this, 8101, &BF_GLOBALS._player, NULL); + } + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 820 - Microfiche Reader + * + *--------------------------------------------------------------------------*/ + +bool Scene820::PowerButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 5); + return true; + case CURSOR_USE: + scene->_sound1.play(69); + if (_flags & OBJFLAG_HIDING) { + scene->_pageNumber = 0; + show(); + BF_GLOBALS._scenePalette.loadPalette(821); + BF_GLOBALS._scenePalette.refresh(); + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + } else { + BF_GLOBALS._scenePalette.loadPalette(820); + BF_GLOBALS._scenePalette.refresh(); + + scene->_object4.remove(); + scene->_object5.remove(); + + SceneItem::display(0, 0); + hide(); + + BF_GLOBALS._sceneManager.changeScene(810); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene820::BackButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 7); + return true; + case CURSOR_USE: + // WORKAROUND: The original game had a bug where you could see the microfiche text by directly + // using the paging buttons, but then you had to use the power button twice to 'turn on' the + // reader and then off again. This check prevents the paging buttons being used until the + // reader is properly turned on. + if (scene->_powerButton._flags & OBJFLAG_HIDING) + return true; + + scene->_sound1.play(72); + show(); + scene->_sceneMode = 8200; + scene->setAction(&scene->_sequenceManager, scene, 8200, NULL); + + if (scene->_pageNumber) + --scene->_pageNumber; + if (scene->_pageNumber == 3) { + scene->_object4.hide(); + scene->_object5.hide(); + } + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene820::ForwardButton::startAction(CursorType action, Event &event) { + Scene820 *scene = (Scene820 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(820, 6); + return true; + case CURSOR_USE: + // WORKAROUND: The original game had a bug where you could see the microfiche text by directly + // using the paging buttons, but then you had to use the power button twice to 'turn on' the + // reader and then off again. This check prevents the paging buttons being used until the + // reader is properly turned on. + if (scene->_powerButton._flags & OBJFLAG_HIDING) + return true; + + scene->_sound1.play(72); + show(); + scene->_sceneMode = 8200; + scene->setAction(&scene->_sequenceManager, scene, 8200, NULL); + + if (scene->_pageNumber < 4) + ++scene->_pageNumber; + + SceneItem::display(820, scene->_pageNumber, SET_WIDTH, 240, SET_X, 41, SET_Y, 0, + SET_FONT, 50, SET_FG_COLOR, 18, SET_EXT_BGCOLOR, 12, SET_KEEP_ONSCREEN, true, LIST_END); + + if (scene->_pageNumber == 4) { + scene->_object4.show(); + scene->_object5.show(); + } + + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene820::Scene820(): SceneExt() { + _pageNumber = 0; +} + +void Scene820::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_pageNumber); +} + +void Scene820::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(820); + + _stripManager.addSpeaker(&_gameTextSpeaker); + + _powerButton.postInit(); + _powerButton.setVisage(820); + _powerButton.setPosition(Common::Point(42, 163)); + _powerButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_powerButton); + + _backButton.postInit(); + _backButton.setVisage(820); + _backButton.setStrip(2); + _backButton.setPosition(Common::Point(278, 155)); + _backButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_backButton); + + _forwardButton.postInit(); + _forwardButton.setVisage(820); + _forwardButton.setStrip(3); + _forwardButton.setPosition(Common::Point(278, 164)); + _forwardButton.hide(); + BF_GLOBALS._sceneItems.push_back(&_forwardButton); + + _object4.postInit(); + _object4.setVisage(821); + _object4.setPosition(Common::Point(96, 130)); + _object4.hide(); + + _object5.postInit(); + _object5.setVisage(821); + _object5.setStrip(2); + _object5.setPosition(Common::Point(223, 130)); + _object5.hide(); + + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, UI_INTERFACE_Y), 820, -1, -1, -1, 1, NULL); +} + +void Scene820::signal() { + if (_sceneMode == 8200) { + _forwardButton.hide(); + _backButton.hide(); + } +} + +/*-------------------------------------------------------------------------- * Scene 830 - Outside Boat Rentals * *--------------------------------------------------------------------------*/ @@ -421,7 +1559,7 @@ bool Scene830::Door::startAction(CursorType action, Event &event) { return NamedObject::startAction(action, event); } -bool Scene830::Object4::startAction(CursorType action, Event &event) { +bool Scene830::RentalBoat::startAction(CursorType action, Event &event) { Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; if (action == INV_RENTAL_KEYS) { @@ -431,7 +1569,7 @@ bool Scene830::Object4::startAction(CursorType action, Event &event) { scene->setAction(&scene->_sequenceManager, scene, 8300, &BF_GLOBALS._player, &scene->_lyle, NULL); } else { scene->_sceneMode = 834; - scene->setAction(&scene->_sequenceManager, scene, 8300, &BF_GLOBALS._player, &scene->_object4, NULL); + scene->setAction(&scene->_sequenceManager, scene, 834, &BF_GLOBALS._player, &scene->_rentalBoat, NULL); } return true; } else { @@ -529,12 +1667,12 @@ void Scene830::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.disableControl(); if (_field18A8) { - _object4.postInit(); - _object4.setVisage(830); - _object4.setStrip(1); - _object4.setPosition(Common::Point(271, 146)); - _object4.fixPriority(90); - _object4.setDetails(830, 0, 1, 2, 1, NULL); + _rentalBoat.postInit(); + _rentalBoat.setVisage(830); + _rentalBoat.setStrip(1); + _rentalBoat.setPosition(Common::Point(271, 146)); + _rentalBoat.fixPriority(90); + _rentalBoat.setDetails(830, 0, 1, 2, 1, NULL); } _door.postInit(); @@ -573,7 +1711,7 @@ void Scene830::postInit(SceneObjectList *OwnerList) { _field18A4 = 0; _lyle.postInit(); - _lyle._flags = OBJFLAG_CHECK_REGION; +// _lyle._flags = OBJFLAG_CHECK_REGION; _lyle.setVisage(835); _lyle.setObjectWrapper(new SceneObjectWrapper()); _lyle.animate(ANIM_MODE_1, NULL); @@ -727,13 +1865,13 @@ void Scene830::signal() { BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); BF_GLOBALS._player._strip = 7; - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 1); break; case 8307: BF_GLOBALS._player.enableControl(); _object5.remove(); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); break; case 8309: @@ -754,7 +1892,9 @@ void Scene830::process(Event &event) { event.handled = true; } - if (BF_GLOBALS._player._enabled && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { // Check if the cursor is on an exit if (_seExit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SE); @@ -800,7 +1940,7 @@ void Scene830::dispatch() { * *--------------------------------------------------------------------------*/ -void Scene840::Object2::postInit(SceneObjectList *OwnerList) { +void Scene840::BoatKeysInset::postInit(SceneObjectList *OwnerList) { FocusObject::postInit(OwnerList); if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) != 1) { @@ -826,18 +1966,19 @@ void Scene840::Object2::postInit(SceneObjectList *OwnerList) { _v1B4 = _v1B6 = 0; } -void Scene840::Object2::remove() { +void Scene840::BoatKeysInset::remove() { Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; _rentalKeys.remove(); _waveKeys.remove(); + FocusObject::remove(); BF_GLOBALS._player.disableControl(); scene->_sceneMode = 8412; scene->setAction(&scene->_sequenceManager1, scene, 8412, &BF_GLOBALS._player, NULL); } -void Scene840::Object2::process(Event &event) { +void Scene840::BoatKeysInset::process(Event &event) { if (BF_GLOBALS._player._enabled) { if (_bounds.contains(event.mousePos)) { CursorType cursorId = BF_GLOBALS._events.getCursor(); @@ -859,7 +2000,7 @@ void Scene840::Object2::process(Event &event) { FocusObject::process(event); } -bool Scene840::Object2::startAction(CursorType action, Event &event) { +bool Scene840::BoatKeysInset::startAction(CursorType action, Event &event) { switch (action) { case CURSOR_LOOK: if ((event.mousePos.y > 43) && (event.mousePos.y < 92)) { @@ -882,9 +2023,9 @@ bool Scene840::Object2::startAction(CursorType action, Event &event) { break; case INV_WAVE_KEYS: if ((BF_GLOBALS._dayNumber != 4) || (BF_GLOBALS._bookmark != bEndDayThree)) - SceneItem::display(840, 47); + SceneItem::display2(840, 47); else { - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) { // Replace rental keys @@ -919,7 +2060,7 @@ bool Scene840::Object2::startAction(CursorType action, Event &event) { return FocusObject::startAction(action, event); } -bool Scene840::Object2::RentalKeys::startAction(CursorType action, Event &event) { +bool Scene840::BoatKeysInset::RentalKeys::startAction(CursorType action, Event &event) { Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -929,9 +2070,9 @@ bool Scene840::Object2::RentalKeys::startAction(CursorType action, Event &event) } else { SceneItem::display2(840, 55); BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 1); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); - scene->_object2._v1B4 = 1; + scene->_boatKeysInset._v1B4 = 1; remove(); } return true; @@ -940,16 +2081,16 @@ bool Scene840::Object2::RentalKeys::startAction(CursorType action, Event &event) } } -bool Scene840::Object2::WaveKeys::startAction(CursorType action, Event &event) { +bool Scene840::BoatKeysInset::WaveKeys::startAction(CursorType action, Event &event) { Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_USE: if (scene->_field1AC2) { - SceneItem::display(840, 56); + SceneItem::display2(840, 56); BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 1); - BF_GLOBALS._uiElements.addScore(50); - scene->_object2._v1B6 = 1; + T2_GLOBALS._uiElements.addScore(50); + scene->_boatKeysInset._v1B6 = 1; remove(); } else { SceneItem::display2(840, 9); @@ -960,7 +2101,7 @@ bool Scene840::Object2::WaveKeys::startAction(CursorType action, Event &event) { } } -bool Scene840::Object6::startAction(CursorType action, Event &event) { +bool Scene840::BoatKeys::startAction(CursorType action, Event &event) { Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -1021,7 +2162,7 @@ bool Scene840::Carter::startAction(CursorType action, Event &event) { if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) { if (!BF_GLOBALS.getFlag(fGotPointsForCombo)) { - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_GLOBALS.setFlag(fGotPointsForCombo); } } @@ -1145,16 +2286,16 @@ void Scene840::postInit(SceneObjectList *OwnerList) { _item16.setDetails(4, 840, 44, 45, 46, 1); _item17.setDetails(5, 840, 26, 27, 28, 1); _item12.setDetails(7, 840, 35, 36, 37, 1); - _item13.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, BF_INTERFACE_Y), 840, 41, 42, 43, 1, NULL); + _item13.setDetails(Rect(0, 0, SCREEN_WIDTH - 1, UI_INTERFACE_Y), 840, 41, 42, 43, 1, NULL); if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) { - _object6.postInit(); - _object6.setVisage(840); - _object6.setStrip(4); - _object6.setFrame(1); - _object6.setPosition(Common::Point(250, 83)); - _object6.fixPriority(120); - _object6.setDetails(840, -1, 8, 9, 2, NULL); + _boatKeys.postInit(); + _boatKeys.setVisage(840); + _boatKeys.setStrip(4); + _boatKeys.setFrame(1); + _boatKeys.setPosition(Common::Point(250, 83)); + _boatKeys.fixPriority(120); + _boatKeys.setDetails(840, -1, 8, 9, 2, NULL); _field1AC0 = 1; } @@ -1245,9 +2386,9 @@ void Scene840::signal() { break; case 4: _sceneMode = 8403; - _object6.postInit(); - _object6.setDetails(840, -1, 8, 9, 2, NULL); - setAction(&_sequenceManager1, this, 8403, &_carter, &_object6, NULL); + _boatKeys.postInit(); + _boatKeys.setDetails(840, -1, 8, 9, 2, NULL); + setAction(&_sequenceManager1, this, 8403, &_carter, &_boatKeys, NULL); break; case 5: _sceneMode = 8408; @@ -1261,7 +2402,7 @@ void Scene840::signal() { if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) { _stripManager.start(8440, this); _sceneMode = 3; - } else if (BF_GLOBALS._sceneObjects->contains(&_object6)) { + } else if (BF_GLOBALS._sceneObjects->contains(&_boatKeys)) { _stripManager.start(8442, this); _sceneMode = 3; } else if (_field1AC6) { @@ -1280,13 +2421,13 @@ void Scene840::signal() { break; case 8402: BF_GLOBALS._player.enableControl(); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_INVENTORY.setObjectScene(INV_CARTER_NOTE, 3); BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1); BF_INVENTORY.setObjectScene(INV_RENTAL_COUPON, 1); break; case 8403: - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); _sceneMode = 3; _field1AC0 = 1; _stripManager.start(8441, this); @@ -1323,18 +2464,18 @@ void Scene840::signal() { break; case 8411: BF_GLOBALS._player.enableControl(); - _object2.postInit(); - _object2.setVisage(840); - _object2.setStrip(2); - _object2.setPosition(Common::Point(160, 140)); - _object2.fixPriority(254); - _object2.setDetails(840, 50, 8, 51); + _boatKeysInset.postInit(); + _boatKeysInset.setVisage(840); + _boatKeysInset.setStrip(2); + _boatKeysInset.setPosition(Common::Point(160, 140)); + _boatKeysInset.fixPriority(254); + _boatKeysInset.setDetails(840, 50, 8, 51); break; case 8412: - if (_object2._v1B6) { + if (_boatKeysInset._v1B6) { _sceneMode = 8409; setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); - } else if (!_object2._v1B4) { + } else if (!_boatKeysInset._v1B4) { BF_GLOBALS._player.enableControl(); } else { _sceneMode = 3; @@ -1348,13 +2489,13 @@ void Scene840::signal() { } break; case 8413: - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); _sceneMode = 8409; setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); break; case 8417: _field1ABA = 1; - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0); BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 0); BF_GLOBALS._player.enableControl(); @@ -1365,7 +2506,7 @@ void Scene840::signal() { void Scene840::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { if (_exit.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); BF_GLOBALS._events.setCursor(surface); @@ -1392,6 +2533,1092 @@ void Scene840::dispatch() { } } +/*-------------------------------------------------------------------------- + * Scene 850 - Boat Leaving/Entering Marina + * + *--------------------------------------------------------------------------*/ + +void Scene850::Timer1::signal() { + PaletteRotation *rot = BF_GLOBALS._scenePalette.addRotation(240, 254, 1); + rot->setDelay(25); + + remove(); +} + +/*--------------------------------------------------------------------------*/ + +void Scene850::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(850); + BF_GLOBALS._sound1.fadeSound(35); + + BF_GLOBALS._player.disableControl(); + _timer.set(2, NULL); + + _object1.postInit(); + if (BF_GLOBALS._sceneManager._previousScene == 830) { + _sceneMode = 8500; + setAction(&_sequenceManager, this, 8500, &_object1, NULL); + } else { + BF_GLOBALS._sound1.changeSound(10); + _sceneMode = 8501; + setAction(&_sequenceManager, this, 8501, &_object1, NULL); + } +} + +void Scene850::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene850::signal() { + switch (_sceneMode) { + case 8500: + BF_GLOBALS._sceneManager.changeScene(860); + break; + case 8501: + BF_GLOBALS._sceneManager.changeScene(830); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * 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); + + _swRect.synchronize(s); + _neRect.synchronize(s); + _yachtRect.synchronize(s); +} + +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); + } +} + +/*-------------------------------------------------------------------------- + * Scene 870 - Cove Beach + * + *--------------------------------------------------------------------------*/ + +bool Scene870::Lyle::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + if (BF_GLOBALS.getFlag(fTookTrailerAmmo)) { + scene->startStrip((BF_GLOBALS._bookmark >= bFinishedWGreen) ? 8704 : 8701); + } else { + scene->startStrip(8700); + } + return true; + } else { + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene870::Green::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + if (!BF_GLOBALS.getFlag(fLyleOnIsland) && !scene->_field1664 && (BF_GLOBALS._bookmark == bFinishedWGreen)) { + scene->startStrip(8703); + ++scene->_field1664; + } else { + scene->startStrip(8705); + } + return true; + } else { + return NamedObjectExt::startAction(action, event); + } +} + +void Scene870::CrateInset::postInit(SceneObjectList *OwnerList) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + setVisage(870); + setStrip(5); + setFrame(scene->_field1662); + setPosition(Common::Point(160, 130)); + fixPriority(250); + + if (scene->_field1662 == 3) { + initContents(); + } +} + +void Scene870::CrateInset::initContents() { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (BF_INVENTORY.getObjectScene(INV_JAR) == 870) { + // Jar still in crate, so display it + _jar.postInit(); + _jar.setVisage(870); + _jar.setStrip(4); + _jar.setFrame(5); + _jar.setPosition(Common::Point(scene->_crateInset._position.x + 5, + scene->_crateInset._position.y - 26)); + _jar.fixPriority(251); + _jar.setDetails(870, 39, 40, 41, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_jar); + BF_GLOBALS._sceneItems.push_front(&_jar); + } + + if (BF_INVENTORY.getObjectScene(INV_RAGS) == 870) { + // Rags still in crate, so display it + _rags.postInit(); + _rags.setVisage(870); + _rags.setStrip(4); + _rags.setFrame(6); + _rags.setPosition(Common::Point(scene->_crateInset._position.x - 18, + scene->_crateInset._position.y - 18)); + _rags.fixPriority(251); + _rags.setDetails(870, 42, 43, 44, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_rags); + BF_GLOBALS._sceneItems.push_front(&_rags); + } +} + +void Scene870::CrateInset::remove() { + _jar.remove(); + _rags.remove(); + FocusObject::remove(); +} + +bool Scene870::CrateInset::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_LOOK: + if (scene->_field1662 != 2) + break; + + scene->_field1662 = 3; + setFrame(3); + initContents(); + return true; + case CURSOR_USE: + if (scene->_field1662 == 2) { + setFrame(1); + scene->_field1662 = 1; + } else { + setFrame(2); + scene->_field1662 = 2; + _jar.remove(); + _rags.remove(); + } + return true; + default: + break; + } + + return FocusObject::startAction(action, event); +} + +bool Scene870::CrateInset::Jar::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_INVENTORY.setObjectScene(INV_JAR, 1); + remove(); + T2_GLOBALS._uiElements.addScore(30); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene870::CrateInset::Rags::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_INVENTORY.setObjectScene(INV_RAGS, 1); + remove(); + T2_GLOBALS._uiElements.addScore(30); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene870::Boat::startAction(CursorType action, Event &event) { + if (action == INV_RENTAL_KEYS) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sceneManager.changeScene(860); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene870::Crate::startAction(CursorType action, Event &event) { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + Common::Point destPos(163, 164); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene870::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(event.mousePos.x, event.mousePos.y); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene870::Action1::signal() { + Scene870 *scene = (Scene870 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + scene->_yacht.setStrip(6); + scene->_yacht.setFrame(1); + scene->_yacht._numFrames = 6; + scene->_yacht.animate(ANIM_MODE_5, this); + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(666); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene870::Scene870(): SceneExt() { + _field1662 = 1; + _field1664 = 0; +} + +void Scene870::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1662); + s.syncAsSint16LE(_field1664); +} + +void Scene870::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(870); + BF_GLOBALS._sound1.changeSound(90); + + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(235, 235, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(237, 238, 1); + rot->setDelay(40); + rot = BF_GLOBALS._scenePalette.addRotation(242, 243, 1); + rot->setDelay(30); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 5; + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(831); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._moveDiff = Common::Point(2, 1); + + _exit.setDetails(Rect(305, 150, 320, 168), 870, -1, -1, -1, 1, NULL); + _lumber.setDetails(9, 870, 36, 37, 38, 1); + _firePit.setDetails(8, 870, 9, 10, 11, 1); + + if (BF_GLOBALS._dayNumber == 5) { + if (!BF_GLOBALS.getFlag(fLyleOnIsland) && (BF_GLOBALS._bookmark != bFinishedWGreen) && + (!BF_GLOBALS.getFlag(fTookTrailerAmmo) || (BF_GLOBALS._bookmark >= bInvestigateBoat))) { + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle._moveDiff = Common::Point(2, 1); + _lyle.setDetails(870, 27, 28, 29, 1, NULL); + } + + _yacht.postInit(); + _yacht.setVisage(870); + _yacht.setStrip(4); + _yacht.setFrame(4); + _yacht.setPosition(Common::Point(232, 19)); + _yacht.setDetails(870, 30, 31, 32, 1, NULL); + + if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_FLARE) == 0) && + (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355)) { + _green.postInit(); + _green.setVisage(870); + _green.setStrip(7); + _green.setPosition(Common::Point(127, 109)); + + if (BF_GLOBALS._bookmark == bFinishedWGreen) { + _green.setDetails(870, 51, 54, 53, 1, NULL); + } else { + _green.setDetails(870, 51, 52, 53, 1, NULL); + } + } + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 355: + _object6.postInit(); + _object6.setVisage(870); + _object6.setPosition(Common::Point(142, 154)); + _object6.fixPriority(148); + + BF_GLOBALS._player.remove(); + _lyle.remove(); + setAction(&_action1); + break; + case 880: + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.setPosition(Common::Point(330, 169)); + ADD_PLAYER_MOVER_NULL(_lyle, 303, 169); + } + + BF_GLOBALS._player.setPosition(Common::Point(330, 139)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8700; + setAction(&_sequenceManager, this, 8700, &BF_GLOBALS._player, NULL); + break; + default: + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.setPosition(Common::Point(156, 148)); + _lyle.fixPriority(149); + } + + if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) && + (BF_INVENTORY.getObjectScene(INV_GRENADES) == 355)) { + _object4.postInit(); + _object4.hide(); + _object5.postInit(); + _object5.hide(); + + BF_GLOBALS._deathReason = 7; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 8703, &BF_GLOBALS._player, &_lyle, &_green, + &_object4, &_object5, NULL); + } else { + BF_GLOBALS._player.changeAngle(135); + BF_GLOBALS._player.setPosition(Common::Point(214, 139)); + BF_GLOBALS._player.enableControl(); + } + break; + } + + _boat.setDetails(7, 870, 3, 4, 5, 1); + _crate.setDetails(14, 870, 12, 13, 14, 1); + _water.setDetails(5, 870, 24, 25, 26, 1); + _palmTrees.setDetails(4, 870, 45, 46, 47, 1); + _sand.setDetails(3, 870, 21, 22, 23, 1); + _boulders.setDetails(2, 870, 18, 19, 20, 1); + _farShore.setDetails(1, 870, 48, 49, 50, 1); +} + +void Scene870::startStrip(int stripNumber) { + _sceneMode = 3; + BF_GLOBALS._player.disableControl(); + _stripManager.start(stripNumber, this); +} + +void Scene870::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene870::signal() { + switch (_sceneMode) { + case 0: + case 3: + case 8700: + BF_GLOBALS._player.enableControl(); + break; + case 1: + _crateInset.postInit(); + _crateInset.setDetails(870, -1, -1, -1); + BF_GLOBALS._player.enableControl(); + break; + case 2: + _yacht.setStrip(6); + _yacht.setFrame(1); + _yacht._numFrames = 6; + _yacht.animate(ANIM_MODE_5, this); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 8701: + BF_GLOBALS._sceneManager.changeScene(880); + break; + default: + break; + } +} + +void Scene870::process(Event &event) { + SceneExt::process(event); + + if (!event.handled && BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); + 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); + } + } +} + +void Scene870::dispatch() { + SceneExt::dispatch(); + + if (BF_GLOBALS._sceneObjects->contains(&_lyle) && _lyle.isNoMover()) { + _lyle.updateAngle(BF_GLOBALS._player._position); + } + + if (!_action && (BF_GLOBALS._player._position.x > 305)) { + if (BF_GLOBALS._sceneObjects->contains(&_lyle)) { + _lyle.animate(ANIM_MODE_1, NULL); + ADD_PLAYER_MOVER_NULL(_lyle, BF_GLOBALS._player._position.x, BF_GLOBALS._player._position.y + 5); + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 8701; + 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: + T2_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.clearFlag(gunDrawn); + BF_INVENTORY.setObjectScene(INV_GRENADES, 880); + _sceneMode = 0; + signal(); + break; + case 4: + T2_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); + T2_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 < (UI_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; + default: + 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); + } + } +} + } // 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 84a11805a2..ef5ef81563 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.h +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -99,6 +99,177 @@ public: virtual void dispatch(); }; +class Scene810: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + + /* Items */ + class Map: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Window: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Bookcase: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FaxMachine: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GarbageCan: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FileCabinets: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CoffeeMaker: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Shelves: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class MicroficheReader: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item10: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Pictures: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item12: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Background: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Desk: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Lyle: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Chair: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FaxMachineInset: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object7: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + Action1 _action1; + Action2 _action2; + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Lyle _lyle; + Chair _chair; + Object3 _object3; + FaxMachineInset _faxMachineInset; + Object5 _object5; + NamedObject _object6; + Object7 _object7; + Map _map; + Window _window; + Bookcase _bookcase; + FaxMachine _faxMachine; + GarbageCan _garbageCan; + FileCabinets _fileCabinets; + CoffeeMaker _coffeeMaker; + Shelves _shelves; + MicroficheReader _microficheReader; + Item10 _item10; + Pictures _pictures; + Item12 _item12; + Background _background; + Desk _desk; + Exit _exit; + ASoundExt _sound1; + Rect _rect1, _rect2, _rect3; + int _fieldA70, _fieldA72, _fieldA74; + + Scene810(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene820: public SceneExt { + /* Objects */ + class PowerButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class ForwardButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BackButton: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + ASoundExt _sound1; + SpeakerGameText _gameTextSpeaker; + PowerButton _powerButton; + BackButton _backButton; + ForwardButton _forwardButton; + NamedObject _object4, _object5; + NamedHotspot _item1; + int _pageNumber; + + Scene820(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + class Scene830: public PalettedScene { /* Items */ class SouthEastExit: public NamedHotspot { @@ -119,7 +290,7 @@ class Scene830: public PalettedScene { public: virtual bool startAction(CursorType action, Event &event); }; - class Object4: public NamedObject { + class RentalBoat: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -135,7 +306,7 @@ public: SpeakerLyleHat _lyleHatSpeaker; NamedObject _object1, _lyle, _object6; Door _door; - Object4 _object4; + RentalBoat _rentalBoat; Object5 _object5; SouthEastExit _seExit; NoteBoard _noteBoard; @@ -165,7 +336,7 @@ class Scene840: public PalettedScene { }; /* Objects */ - class Object2: public FocusObject { + class BoatKeysInset: public FocusObject { class RentalKeys: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); @@ -184,7 +355,7 @@ class Scene840: public PalettedScene { virtual void process(Event &event); virtual bool startAction(CursorType action, Event &event); }; - class Object6: public NamedObject { + class BoatKeys: public NamedObject { public: virtual bool startAction(CursorType action, Event &event); }; @@ -196,9 +367,9 @@ class Scene840: public PalettedScene { public: SequenceManager _sequenceManager1, _sequenceManager2; NamedObject _object1; - Object2 _object2; + BoatKeysInset _boatKeysInset; NamedObject _doors; - Object6 _object6; + BoatKeys _boatKeys; Carter _carter; NamedObject _lyle; Coins _coins; @@ -222,6 +393,173 @@ public: virtual void dispatch(); }; +class Scene850: public SceneExt { + /* Timers */ + class Timer1: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Timer1 _timer; + NamedObject _object1; + ASoundExt _sound1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + 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(); +}; + +class Scene870: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Lyle: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Green: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CrateInset: public FocusObject { + class Jar: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Rags: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + private: + void initContents(); + public: + Jar _jar; + Rags _rags; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Boat: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Crate: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerGreen _greenSpeaker; + Boat _boat; + Crate _crate; + Exit _exit; + NamedObject _yacht; + Lyle _lyle; + Green _green; + NamedObject _object4, _object5, _object6; + CrateInset _crateInset; + NamedHotspot _lumber, _firePit, _water, _boulders; + NamedHotspot _palmTrees, _sand, _farShore, _item11; + Action1 _action1; + int _field1662, _field1664; + + Scene870(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + + 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 diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp index a449600b63..ea54bf6b1d 100644 --- a/engines/tsage/blue_force/blueforce_scenes9.cpp +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -57,50 +57,50 @@ bool Scene900::Item4::startAction(CursorType action, Event &event) { } /*--------------------------------------------------------------------------*/ -bool Scene900::Object1::startAction(CursorType action, Event &event) { +bool Scene900::Gate::startAction(CursorType action, Event &event) { Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_USE: - if (BF_GLOBALS._v4CEC0 == 0) { + if (BF_GLOBALS._gateStatus == 0) { return NamedObject::startAction(action, event); } else { BF_GLOBALS._player.disableControl(); - if (BF_GLOBALS._v4CEC0 == 2) { + if (BF_GLOBALS._gateStatus == 2) { scene->_sceneMode = 9006; - BF_GLOBALS._v4CEC0 = 1; + BF_GLOBALS._gateStatus = 1; scene->setAction(&scene->_sequenceManager1, scene, 9006, &BF_GLOBALS._player, this, NULL); } else { - BF_GLOBALS._v4CEC0 = 2; - if (scene->_object3._flag == false) { + BF_GLOBALS._gateStatus = 2; + if (scene->_dog._flag == false) { BF_GLOBALS._player.setAction(&scene->_action4); } else { scene->_sceneMode = 9005; scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, this, NULL); - BF_GLOBALS._walkRegions.proc2(24); + BF_GLOBALS._walkRegions.enableRegion(24); } } return true; } break; case INV_WAREHOUSE_KEYS: - if (BF_GLOBALS._v4CEC0 == 2) { + if (BF_GLOBALS._gateStatus == 2) { SceneItem::display2(900, 14); } else { - if (BF_GLOBALS._v4CEC0 == 0) { + if (BF_GLOBALS._gateStatus == 0) { if (!BF_GLOBALS.getFlag(fGotPointsForUnlockGate)) { BF_GLOBALS.setFlag(fGotPointsForUnlockGate); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } - BF_GLOBALS._v4CEC0 = 1; + BF_GLOBALS._gateStatus = 1; } else { if (!BF_GLOBALS.getFlag(fGotPointsForLockGate)) { if (BF_GLOBALS._bookmark == bEndDayThree) { BF_GLOBALS.setFlag(fGotPointsForLockGate); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } } - BF_GLOBALS._v4CEC0 = 0; + BF_GLOBALS._gateStatus = 0; } scene->_sceneMode = 9004; BF_GLOBALS._player.disableControl(); @@ -112,29 +112,29 @@ bool Scene900::Object1::startAction(CursorType action, Event &event) { } } -bool Scene900::Object2::startAction(CursorType action, Event &event) { +bool Scene900::Door::startAction(CursorType action, Event &event) { Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_USE: - if (BF_GLOBALS._v4CEC0 == 2) { + if (BF_GLOBALS._gateStatus == 2) { if (_flag) { SceneItem::display2(900, 1); } else { BF_GLOBALS._player.disableControl(); - BF_GLOBALS._walkRegions.proc2(26); + BF_GLOBALS._walkRegions.enableRegion(26); scene->_sceneMode = 9007; - scene->setAction(&scene->_sequenceManager1, scene, 9007, &BF_GLOBALS._player, &scene->_object2, this, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 9007, &BF_GLOBALS._player, &scene->_door, this, NULL); } return true; } else return NamedObject::startAction(action, event); break; case INV_WAREHOUSE_KEYS: - if (BF_GLOBALS._v4CEC0 == 2) { + if (BF_GLOBALS._gateStatus == 2) { BF_GLOBALS._player.disableControl(); scene->_sceneMode = 9012; - scene->setAction(&scene->_sequenceManager1, scene, 9012, &BF_GLOBALS._player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 9012, &BF_GLOBALS._player, &scene->_door, NULL); } else SceneItem::display2(900, 5); return true; @@ -143,7 +143,7 @@ bool Scene900::Object2::startAction(CursorType action, Event &event) { } } -bool Scene900::Object3::startAction(CursorType action, Event &event) { +bool Scene900::Dog::startAction(CursorType action, Event &event) { Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -174,31 +174,31 @@ bool Scene900::Object3::startAction(CursorType action, Event &event) { } } -bool Scene900::Object6::startAction(CursorType action, Event &event) { +bool Scene900::Lyle::startAction(CursorType action, Event &event) { Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; if (action == CURSOR_TALK) { - if (BF_GLOBALS._sceneManager._sceneLoadCount == 0) { - if (!_action) { - if (scene->_object3._flag) { - if (BF_GLOBALS._v4CEC0 == 0) - scene->_stripManager.start(9004, &BF_GLOBALS._stripProxy); - else { - if (scene->_object2._flag == 1) { - if (BF_GLOBALS._v4CEC0 == 2) - scene->_stripManager.start(9005, &BF_GLOBALS._stripProxy); - else - scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy); - } else + if (!_action) { + if (scene->_dog._flag) { + // Dog is no longer there + if (BF_GLOBALS._gateStatus == 0) + scene->_stripManager.start(9004, &BF_GLOBALS._stripProxy); + else { + if (scene->_door._flag == 1) { + if (BF_GLOBALS._gateStatus == 2) + scene->_stripManager.start(9005, &BF_GLOBALS._stripProxy); + else scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy); - } - } else { - if (scene->_field1974) - scene->_stripManager.start(9003, &BF_GLOBALS._stripProxy); - else { - ++scene->_field1974; - scene->_stripManager.start(9002, &BF_GLOBALS._stripProxy); - } + } else + scene->_stripManager.start(9001, &BF_GLOBALS._stripProxy); + } + } else { + // Dog is there + if (scene->_lyleDialogCtr) + scene->_stripManager.start(9003, &BF_GLOBALS._stripProxy); + else { + ++scene->_lyleDialogCtr; + scene->_stripManager.start(9002, &BF_GLOBALS._stripProxy); } } } @@ -207,7 +207,7 @@ bool Scene900::Object6::startAction(CursorType action, Event &event) { return NamedObject::startAction(action, event); } -bool Scene900::Object7::startAction(CursorType action, Event &event) { +bool Scene900::Body::startAction(CursorType action, Event &event) { Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; if (action == CURSOR_USE) { @@ -225,25 +225,25 @@ void Scene900::Action1::signal() { switch (_actionIndex++) { case 0: - if (scene->_object3._flag == 0) { - scene->_object3.setStrip(3); + if (scene->_dog._flag == 0) { + scene->_dog.setStrip(3); if ((BF_GLOBALS._randomSource.getRandomNumber(3) == 1) || (BF_GLOBALS._player._position.x > 790) || (scene->_field1976 != 0)) { Common::Point pt(864, 130); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); } else { _actionIndex = 4; Common::Point pt(775, 107); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); } } break; case 1: - scene->_object3.setPosition(Common::Point(864, 117)); - scene->_object3.setStrip(7); - scene->_object3.setFrame(1); - scene->_object3.animate(ANIM_MODE_5, this); + scene->_dog.setPosition(Common::Point(864, 117)); + scene->_dog.setStrip(7); + scene->_dog.setFrame(1); + scene->_dog.animate(ANIM_MODE_5, this); if (BF_GLOBALS._randomSource.getRandomNumber(3) == 1) scene->_sound1.play(92); else @@ -252,16 +252,16 @@ void Scene900::Action1::signal() { _actionIndex = 7; break; case 2: - scene->_object3.animate(ANIM_MODE_6, this); + scene->_dog.animate(ANIM_MODE_6, this); break; case 3: { - scene->_object3.setStrip(3); - scene->_object3.setPosition(Common::Point(864, 130)); - scene->_object3.fixPriority(122); - scene->_object3.animate(ANIM_MODE_1, NULL); + scene->_dog.setStrip(3); + scene->_dog.setPosition(Common::Point(864, 130)); + scene->_dog.fixPriority(122); + scene->_dog.animate(ANIM_MODE_1, NULL); Common::Point pt(775, 107); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); break; } case 6: @@ -271,10 +271,10 @@ void Scene900::Action1::signal() { setDelay(30); break; case 5: { - scene->_object3.setStrip(4); + scene->_dog.setStrip(4); Common::Point pt(940, 145); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); break; } case 7: @@ -286,17 +286,17 @@ void Scene900::Action1::signal() { _actionIndex = 8; break; case 8: - scene->_object3.setStrip(1); - scene->_object3.setFrame(7); - scene->_object3.animate(ANIM_MODE_6, NULL); + scene->_dog.setStrip(1); + scene->_dog.setFrame(7); + scene->_dog.animate(ANIM_MODE_6, NULL); break; case 9: scene->_field1976 = 0; - scene->_object3._flag = 0; + scene->_dog._flag = 0; _actionIndex = 7; - scene->_object3.setStrip(1); - scene->_object3.setFrame(1); - scene->_object3.animate(ANIM_MODE_5, this); + scene->_dog.setStrip(1); + scene->_dog.setFrame(1); + scene->_dog.animate(ANIM_MODE_5, this); break; default: break; @@ -309,7 +309,7 @@ void Scene900::Action2::signal() { switch (_actionIndex++) { case 0: scene->_field1976 = 1; - if (scene->_object3._action->getActionIndex() == 8) + if (scene->_dog._action->getActionIndex() != 8) _actionIndex = 0; setDelay(5); break; @@ -319,18 +319,18 @@ void Scene900::Action2::signal() { scene->_object5.setStrip(2); scene->_object5.setPosition(Common::Point(-20, -20)); scene->_object5._moveDiff.y = 10; - setAction(&scene->_sequenceManager1, this, 9009, &BF_GLOBALS._player, &scene->_object5, &scene->_object3, NULL); + setAction(&scene->_sequenceManager1, this, 9009, &BF_GLOBALS._player, &scene->_object5, &scene->_dog, NULL); BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900); break; case 2: BF_GLOBALS._player._strip = 7; if (!BF_GLOBALS.getFlag(fGotPointsForTrapDog)) { BF_GLOBALS.setFlag(fGotPointsForTrapDog); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); } SceneItem::display2(900, 10); - scene->_object3._flag = 1; - scene->_object3.fixPriority(130); + scene->_dog._flag = 1; + scene->_dog.fixPriority(130); BF_GLOBALS._player.enableControl(); remove(); break; @@ -349,44 +349,44 @@ void Scene900::Action3::signal() { PlayerMover *mover = new PlayerMover(); BF_GLOBALS._player.addMover(mover, &pt, 0); } - if (scene->_object3._action->getActionIndex() != 7) { + if (scene->_dog._action->getActionIndex() != 7) { _actionIndex = 0; } setDelay(5); break; case 1: - if (scene->_object3._strip == 3) { + if (scene->_dog._strip == 3) { _actionIndex = 3; Common::Point pt(775, 107); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); } else - scene->_object3.animate(ANIM_MODE_6, this); + scene->_dog.animate(ANIM_MODE_6, this); break; case 2: { - scene->_object3.setStrip(3); - scene->_object3.setPosition(Common::Point(864, 130)); - scene->_object3.fixPriority(122); - scene->_object3.animate(ANIM_MODE_1, NULL); + scene->_dog.setStrip(3); + scene->_dog.setPosition(Common::Point(864, 130)); + scene->_dog.fixPriority(122); + scene->_dog.animate(ANIM_MODE_1, NULL); Common::Point pt(775, 107); NpcMover *mover = new NpcMover(); - scene->_object3.addMover(mover, &pt, this); + scene->_dog.addMover(mover, &pt, this); break; } case 3: - scene->_object3.remove(); - scene->_object3._flag = 1; + scene->_dog.remove(); + scene->_dog._flag = 1; SceneItem::display2(900, 24); if (!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) { BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); - BF_GLOBALS._uiElements.addScore(10); + T2_GLOBALS._uiElements.addScore(10); } BF_GLOBALS._player.enableControl(); remove(); break; default: break; - } + } } void Scene900::Action4::signal() { @@ -395,15 +395,15 @@ void Scene900::Action4::signal() { switch (_actionIndex++) { case 0: scene->_field1976 = 1; - if (scene->_object3._action->getActionIndex() != 8) + if (scene->_dog._action->getActionIndex() != 8) _actionIndex = 0; setDelay(5); break; case 1: - scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager1, this, 9005, &BF_GLOBALS._player, &scene->_gate, NULL); break; case 2: - scene->setAction(&scene->_sequenceManager1, scene, 9008, &BF_GLOBALS._player, &scene->_object3, NULL); + scene->setAction(&scene->_sequenceManager1, this, 9008, &BF_GLOBALS._player, &scene->_dog, NULL); break; case 3: BF_GLOBALS._deathReason = 5; @@ -418,40 +418,41 @@ void Scene900::Action4::signal() { /*--------------------------------------------------------------------------*/ Scene900::Scene900(): PalettedScene() { - _field1974 = _field1976 = 0; + _lyleDialogCtr = _field1976 = 0; } void Scene900::postInit(SceneObjectList *OwnerList) { - PalettedScene::postInit(); + PalettedScene::postInit(OwnerList); loadScene(900); if (BF_GLOBALS._sceneManager._previousScene == 910) BF_GLOBALS._sound1.changeSound(91); - _field1974 = 0; + _lyleDialogCtr = 0; _field1976 = 0; - BF_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements._active = true; BF_GLOBALS.clearFlag(fCanDrawGun); if (BF_GLOBALS._dayNumber == 0) { BF_GLOBALS._dayNumber = 4; BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); BF_INVENTORY.setObjectScene(INV_HOOK, 1); } - _object3._flag = 0; + _dog._flag = 0; if (BF_GLOBALS._bookmark >= bFinishedWGreen) { - _object7.postInit(); - _object7.fixPriority(120); - _object7.setVisage(901); - _object7.setPosition(Common::Point(159,128)); - _object7.setDetails(900, 15, 16, 17, ANIM_MODE_1, NULL); + _body.postInit(); + _body.fixPriority(120); + _body.setVisage(901); + _body.setPosition(Common::Point(159,128)); + _body.setDetails(900, 15, 16, 17, ANIM_MODE_1, NULL); } if (BF_GLOBALS._sceneManager._previousScene == 910) { - _sceneBounds.moveTo(640, 0); - BF_GLOBALS._v4CEC0 = 2; + _sceneBounds.moveTo(639, 0); + + BF_GLOBALS._gateStatus = 2; BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900); - _object3._flag = 1; + _dog._flag = 1; } if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) - _object3._flag = 1; + _dog._flag = 1; _stripManager.addSpeaker(&_gameTextSpeaker); _stripManager.addSpeaker(&_jakeJacketSpeaker); @@ -460,37 +461,37 @@ void Scene900::postInit(SceneObjectList *OwnerList) { _item4.setDetails(Rect(0, 85, 20, 130), 900, -1, -1, -1, 1, 0); BF_GLOBALS._player.postInit(); - _object3.postInit(); - _object3.setVisage(902); - _object3.setPosition(Common::Point(845, 135)); - _object3.fixPriority(122); - _object3.setDetails(900, 8, -1, 9, 1, NULL); - - if (_object3._flag == 0) { - _object3.animate(ANIM_MODE_1, NULL); - _object3.setAction(&_action1); + _dog.postInit(); + _dog.setVisage(902); + _dog.setPosition(Common::Point(845, 135)); + _dog.fixPriority(122); + _dog.setDetails(900, 8, -1, 9, 1, NULL); + + if (_dog._flag == 0) { + _dog.animate(ANIM_MODE_1, NULL); + _dog.setAction(&_action1); } else { - _object3.setAction(&_action1); - _object3.fixPriority(130); + _dog.setAction(&_action1); + _dog.fixPriority(130); if (BF_GLOBALS._dayNumber == 4) { - _object3.setPosition(Common::Point(879, 120)); - _object3.setStrip(2); + _dog.setPosition(Common::Point(879, 120)); + _dog.setStrip(2); } else { - _object3.setPosition(Common::Point(864, 117)); - _object3.setStrip(6); - _object3.setFrame(6); + _dog.setPosition(Common::Point(864, 117)); + _dog.setStrip(6); + _dog.setFrame(6); } } - _object1.postInit(); - _object1.setVisage(900); - _object1.setStrip(2); + _gate.postInit(); + _gate.setVisage(900); + _gate.setStrip(2); - if (BF_GLOBALS._v4CEC0 == 2) - _object1.setPosition(Common::Point(758, 127)); + if (BF_GLOBALS._gateStatus == 2) + _gate.setPosition(Common::Point(758, 127)); else { - BF_GLOBALS._walkRegions.proc1(24); - _object1.setPosition(Common::Point(804, 132)); + BF_GLOBALS._walkRegions.disableRegion(24); + _gate.setPosition(Common::Point(804, 132)); } if (BF_GLOBALS._dayNumber == 5) @@ -504,59 +505,62 @@ void Scene900::postInit(SceneObjectList *OwnerList) { _object4.setPosition(Common::Point(866, 117)); } - _object2.postInit(); - _object2.setVisage(900); + _door.postInit(); + _door.setVisage(900); if (BF_GLOBALS._v4CEC8 == 0) - _object2.setStrip(4); + _door.setStrip(4); else - _object2.setStrip(1); + _door.setStrip(1); - _object2.setPosition(Common::Point(847, 45)); - _object2._flag = 1; + _door.setPosition(Common::Point(847, 45)); + _door._flag = 1; if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) { - BF_GLOBALS._walkRegions.proc1(26); + BF_GLOBALS._walkRegions.disableRegion(26); BF_GLOBALS._player.disableControl(); if (BF_GLOBALS._bookmark == bFinishedWGreen) { _sceneMode = 9013; _lyle.postInit(); _lyle._moveDiff.y = 7; - _lyle._flags |= 0x1000; + _lyle._flags |= OBJFLAG_CHECK_REGION; _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); _lyleHatSpeaker._xp = 210; _jakeJacketSpeaker._xp = 75; setAction(&_sequenceManager1, this, 9013, &BF_GLOBALS._player, &_lyle, NULL); BF_GLOBALS._bookmark = bAmbushed; BF_GLOBALS.setFlag(fWithLyle); - } else if (BF_GLOBALS._bookmark > bFinishedWGreen) { - _lyle.postInit(); - _lyle.setVisage(811); - _lyle.setPosition(Common::Point(780, 153)); - _lyle._moveDiff.y = 7; - _lyle._flags |= 0x1000; - _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); - _lyle.animate(ANIM_MODE_1, NULL); - _lyle.setObjectWrapper(new SceneObjectWrapper()); - } // no else on purpose - _sceneMode = 9000; - setAction(&_sequenceManager1, this, 9000, &BF_GLOBALS._player, NULL); + } else { + if (BF_GLOBALS._bookmark > bFinishedWGreen) { + _lyle.postInit(); + _lyle.setVisage(811); + _lyle.setPosition(Common::Point(780, 153)); + _lyle._moveDiff.y = 7; + _lyle._flags |= 0x1000; + _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + } + + _sceneMode = 9000; + setAction(&_sequenceManager1, this, 9000, &BF_GLOBALS._player, NULL); + } } else { - _object2._flag = 0; - _object2.setFrame(_object2.getFrameCount()); + _door._flag = 0; + _door.setFrame(_door.getFrameCount()); BF_GLOBALS._player.disableControl(); _sceneMode = 9002; if (BF_GLOBALS.getFlag(fWithLyle)) { _lyle.postInit(); _lyle._flags |= 0x1000; _lyle.setDetails(900, 19, 20, 21, ANIM_MODE_1, NULL); - setAction(&_sequenceManager1, this, 9014, &BF_GLOBALS._player, &_object2, &_lyle, NULL); + setAction(&_sequenceManager1, this, 9014, &BF_GLOBALS._player, &_door, &_lyle, NULL); } else - setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_object2, NULL); + setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_door, NULL); } - _object1.setDetails(900, 0, -1, 1, 1, 0); - _object2.setDetails(900, 2, -1, 5, 1, 0); + _gate.setDetails(900, 0, -1, 1, 1, 0); + _door.setDetails(900, 2, -1, 5, 1, 0); _item2.setDetails(Rect(0, 0, 225, 21), 666, 25, -1, -1, 1, NULL); _item3.setDetails(Rect(37, 21, 324, 50), 666, 26, -1, -1, 1, NULL); _item1.setDetails(Rect(0, 0, 960, 200), 900, 7, -1, -1, 1, NULL); @@ -570,16 +574,16 @@ void Scene900::signal() { BF_GLOBALS._sceneManager.changeScene(910); break; case 3: - BF_GLOBALS._walkRegions.proc1(24); + BF_GLOBALS._walkRegions.disableRegion(24); _sceneMode = 9004; - setAction(&_sequenceManager1, this, 9006, &BF_GLOBALS._player, &_object1, NULL); + setAction(&_sequenceManager1, this, 9006, &BF_GLOBALS._player, &_gate, NULL); break; case 9000: BF_GLOBALS._player.enableControl(); break; case 9001: - if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._v4CEC0 != 0) || - (_object2._flag == 0)) + if ((BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) || (BF_GLOBALS._gateStatus != 0) || + (_door._flag == 0)) BF_GLOBALS.setFlag(fLeftTraceIn900); else BF_GLOBALS.clearFlag(fLeftTraceIn900); @@ -587,24 +591,24 @@ void Scene900::signal() { BF_GLOBALS._sceneManager.changeScene(880); break; case 9002: - BF_GLOBALS._walkRegions.proc1(26); + BF_GLOBALS._walkRegions.disableRegion(26); BF_GLOBALS._player.enableControl(); break; case 9004: - if (BF_GLOBALS._v4CEC0 == 0) + if (BF_GLOBALS._gateStatus == 0) SceneItem::display2(900, 3); else SceneItem::display2(900, 4); BF_GLOBALS._player.enableControl(); break; case 9005: - if (_object3._flag == 0) + if (_dog._flag == 0) BF_GLOBALS._player.setAction(&_action4); else BF_GLOBALS._player.enableControl(); break; case 9006: - BF_GLOBALS._walkRegions.proc1(24); + BF_GLOBALS._walkRegions.disableRegion(24); BF_GLOBALS._player.enableControl(); break; case 9007: @@ -623,16 +627,16 @@ void Scene900::signal() { break; case 9010: _sound1.play(92); - if (BF_GLOBALS._v4CEC0 == 2) { + if (BF_GLOBALS._gateStatus == 2) { _sceneMode = 9008; - setAction(&_sequenceManager1, this, 9008, &BF_GLOBALS._player, &_object3, NULL); + setAction(&_sequenceManager1, this, 9008, &BF_GLOBALS._player, &_dog, NULL); } else { BF_GLOBALS._player._strip = 7; _action1.setActionIndex(9); - _object3.signal(); + _dog.signal(); if ((!BF_GLOBALS.getFlag(fGotPointsForFreeDog)) && (BF_GLOBALS._bookmark == bEndDayThree)) { BF_GLOBALS.setFlag(fGotPointsForFreeDog); - BF_GLOBALS._uiElements.addScore(50); + T2_GLOBALS._uiElements.addScore(50); } BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); SceneItem::display2(900, 11); @@ -640,19 +644,19 @@ void Scene900::signal() { } break; case 9012: - if (_object2._flag == 0) { + if (_door._flag == 0) { SceneItem::display2(900, 12); - _object2._flag = 1; + _door._flag = 1; if ((!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) && (BF_GLOBALS._bookmark == bEndDayThree)) { BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } } else { SceneItem::display2(900, 13); - _object2._flag = 0; + _door._flag = 0; if (!BF_GLOBALS.getFlag(fGotPointsForUnlockWarehouse)) { BF_GLOBALS.setFlag(fGotPointsForUnlockWarehouse); - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); } } BF_GLOBALS._player.enableControl(); @@ -664,9 +668,9 @@ void Scene900::signal() { BF_GLOBALS._player.enableControl(); break; case 9016: - if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)){ - BF_GLOBALS._clip1Bullets = 8; + if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)) { BF_GLOBALS._clip1Bullets = 8; + BF_GLOBALS._clip2Bullets = 8; SceneItem::display2(900, 25); } else if (BF_GLOBALS._clip1Bullets == 0) { BF_GLOBALS._clip1Bullets = 8; @@ -687,9 +691,9 @@ void Scene900::signal() { void Scene900::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_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(); @@ -716,11 +720,2201 @@ void Scene900::dispatch() { void Scene900::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_field1974); + s.syncAsSint16LE(_lyleDialogCtr); s.syncAsSint16LE(_field1976); } /*-------------------------------------------------------------------------- + * Scene 910 - Inside the warehouse + * + *--------------------------------------------------------------------------*/ +/* Actions */ +void Scene910::Action1::signal() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex - 1) { + case 0: + scene->_vent.setStrip(1); + scene->_vent.animate(ANIM_MODE_5, this); + break; + case 1: + if (scene->_vent._strip == 2) + scene->_vent.setFrame(4); + scene->_vent.setStrip(1); + scene->_vent.animate(ANIM_MODE_6, NULL); + break; + case 2: + scene->_vent.setStrip(2); + scene->_vent.animate(ANIM_MODE_2, NULL); + break; + default: + break; + } +} + +void Scene910::Action2::signal() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_shadow.postInit(); + scene->_shadow.setVisage(919); + scene->_shadow.setPosition(Common::Point(267, 51)); + scene->_shadow.fixPriority(40); + signal(); + break; + case 1: + scene->_shadow.hide(); + setDelay(600); + break; + case 2: + scene->_shadow.setStrip(BF_GLOBALS._randomSource.getRandomNumber(2) + 2); + scene->_shadow.setFrame(1); + scene->_shadow.show(); + setDelay(6); + break; + case 3: + _actionIndex = 1; + scene->_shadow.setStrip(BF_GLOBALS._randomSource.getRandomNumber(2) + 2); + scene->_shadow.animate(ANIM_MODE_5, this); + break; + default: + break; + } +} + +/* Objects */ + +void Scene910::Lyle::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); +} + +bool Scene910::Lyle::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS._v4CEE2 == 0) + return NamedObject::startAction(action, event); + else + return false; + } else if (action == CURSOR_TALK) { + if ((BF_GLOBALS._hiddenDoorStatus != 0) || (BF_GLOBALS._v4CEE2 != 0)) { + scene->_stripManager.start(9100 + _field90, &BF_GLOBALS._stripProxy); + if (_field90 < 1) + _field90++; + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9130; + if (BF_GLOBALS.getFlag(gunDrawn)) + scene->setAction(&scene->_sequenceManager1, scene, 9138, &BF_GLOBALS._player, &scene->_lyle, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 9130, &BF_GLOBALS._player, &scene->_lyle, NULL); + return true; + } + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene910::Nico::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneSubMode = 6; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + break; + case CURSOR_TALK: + if (BF_GLOBALS._v4CEE2 >= 4) + return NamedObject::startAction(action, event); + + if (BF_GLOBALS._v4CEE6 < 4) + BF_GLOBALS._v4CEE6++; + + if (BF_GLOBALS._v4CEE6 == 2) { + scene->_sceneMode = 13; + scene->_stripManager.start(9105, scene); + } else + scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy); + return true; + break; + case INV_COLT45: + if (BF_GLOBALS._v4CEE2 > 1) { + if (BF_GLOBALS._v4CEE2 != 4) { + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())) { + if (scene->_field2DE0 == 0) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9126; + scene->setAction(&scene->_sequenceManager1, scene, 9126, &scene->_nico, NULL); + return NamedObject::startAction(action, event); + } else { + scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy); + return NamedObject::startAction(action, event); + } + } else + return NamedObject::startAction(action, event); + } else { + SceneItem::display(910, 90, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + } else { + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9125; + scene->setAction(&scene->_sequenceManager1, scene, 9125, &scene->_nico, NULL); + } + return NamedObject::startAction(action, event); + } + break; + case INV_BADGE: + case INV_ID: + if (BF_GLOBALS._v4CEE2 >= 4) + return NamedObject::startAction(action, event); + + if (BF_GLOBALS._v4CEE6 < 4) + BF_GLOBALS._v4CEE6++; + + if (BF_GLOBALS._v4CEE6 == 2) { + scene->_sceneMode = 13; + scene->_stripManager.start(9105, scene); + } else + scene->_stripManager.start(9103 + BF_GLOBALS._v4CEE6, &BF_GLOBALS._stripProxy); + + return true; + break; + case INV_YELLOW_CORD: + if (BF_GLOBALS._v4CEE2 < 4) { + BF_GLOBALS._player.disableControl(); + scene->_yellowCord.fixPriority(121); + scene->_sceneSubMode = 10; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + + return true; + } else { + SceneItem::display(910, 95, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + + return true; + } + break; + case INV_HALF_YELLOW_CORD: + if (BF_GLOBALS._v4CECC == 1) + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneItem::display(910, 82, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + case INV_BLACK_CORD: + case INV_HALF_BLACK_CORD: + SceneItem::display(910, 83, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::Stuart::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneSubMode = 7; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + break; + case CURSOR_TALK: + if (BF_GLOBALS._v4CEE8 < 3) + BF_GLOBALS._v4CEE8++; + + scene->_stripManager.start(9107 + BF_GLOBALS._v4CEE8, &BF_GLOBALS._stripProxy); + return true; + break; + case INV_COLT45: + if ((BF_GLOBALS.getFlag(gunDrawn)) && (BF_GLOBALS.getFlag(fGunLoaded)) && (BF_GLOBALS.getHasBullets())){ + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEE4 == 2) { + scene->_sceneMode = 9132; + scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL); + return NamedObject::startAction(action, event); + } else { + if (scene->_field2DE0 == 0) { + scene->_sceneMode = 9132; + scene->setAction(&scene->_sequenceManager1, scene, 9132, &scene->_stuart, NULL); + } else + scene->_stripManager.start(9117, &BF_GLOBALS._stripProxy); + return NamedObject::startAction(action, event); + } + } else + return NamedObject::startAction(action, event); + break; + case INV_YELLOW_CORD: + if (BF_GLOBALS._v4CECC == 1) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEE2 == 4) { + scene->_sceneSubMode = 11; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else { + scene->_sceneSubMode = 12; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } + } + break; + case INV_HALF_YELLOW_CORD: + if (BF_GLOBALS._v4CECC == 1) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneSubMode = 11; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } + break; + case INV_BLACK_CORD: + case INV_HALF_BLACK_CORD: + SceneItem::display(910, 83, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::Forbes::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.enableRegion(1); + BF_GLOBALS._walkRegions.enableRegion(16); + scene->_sceneMode = 9140; + scene->setAction(&scene->_sequenceManager1, scene, 9140, &scene->_forbes, &BF_GLOBALS._player, &scene->_lyle, NULL); + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerCord::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); + s.syncAsSint16LE(_field92); +} + +bool Scene910::PowerCord::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + // the last check is used in order to replace a check on CURSOR_1000, which is replaced + // directly by its sub-check. All items have an id inferior to 100h. + if ((action == CURSOR_LOOK) || (action == CURSOR_TALK) || (action < CURSOR_WALK)) { + if (_field90 == 1) + return false; + if ((_field92 != 1) || (BF_GLOBALS._hiddenDoorStatus == 0 )) + return NamedObject::startAction(action, event); + return false; + } else if (action == CURSOR_USE) { + if (_field90 == 0) { + if ((BF_GLOBALS._hiddenDoorStatus == 0) || (_field92 != 1)) { + BF_GLOBALS._player.disableControl(); + if (_field92 == 1) { + scene->_sceneSubMode = 8; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + _field90 = 1; + return true; + } else { + scene->_destPos = Common::Point(151, 186); + scene->_sceneSubMode = 4; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + _field90 = 1; + return true; + } + } else + return false; + } else if (_field90 == 1) + return false; + else + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerCord::init(int val) { + NamedObject::postInit(); + + _field92 = val; + _field90 = 0; +} + +bool Scene910::BreakerBox::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS._v4CEC8 == 0) + SceneItem::display2(910, 7); + else + SceneItem::display2(910, 6); + return true; + break; + case CURSOR_USE: + if (scene->_lyle._position.x == 115) { + SceneItem::display2(910, 62); + return true; + } else if (scene->_sceneMode != 9120) { + if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9118; + scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9102; + if (BF_GLOBALS.getFlag(gunDrawn)) { + scene->_sceneSubMode = 1; + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + return true; + } else { + scene->setAction(&scene->_sequenceManager1, scene, 9102, &BF_GLOBALS._player, NULL); + return true; + } + } + } else { + SceneItem::display(910, 62, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + break; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene910::FakeWall::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == INV_YELLOW_CORD) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(285, 114); + scene->_sceneSubMode = 9; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::BreakerBoxInset::postInit(SceneObjectList *OwnerList) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + _resNum = 910; + _lookLineNum = 7; + _useLineNum = 8; + BF_GLOBALS._sceneItems.push_back(this); + scene->_breakerButtonCtr = 0; + + _object13.setupBreaker(115, 44, 1, BF_GLOBALS._breakerBoxStatusArr[0]); + _object14.setupBreaker(116, 63, 2, BF_GLOBALS._breakerBoxStatusArr[1]); + _object15.setupBreaker(116, 69, 2, BF_GLOBALS._breakerBoxStatusArr[2]); + _object16.setupBreaker(115, 76, 1, BF_GLOBALS._breakerBoxStatusArr[3]); + _object17.setupBreaker(115, 95, 1, BF_GLOBALS._breakerBoxStatusArr[4]); + _object18.setupBreaker(116, 114, 2, BF_GLOBALS._breakerBoxStatusArr[5]); + _object19.setupBreaker(116, 120, 2, BF_GLOBALS._breakerBoxStatusArr[6]); + _object20.setupBreaker(188, 45, 2, BF_GLOBALS._breakerBoxStatusArr[7]); + _object21.setupBreaker(188, 51, 2, BF_GLOBALS._breakerBoxStatusArr[8]); + _object22.setupBreaker(179, 59, 1, BF_GLOBALS._breakerBoxStatusArr[9]); + _object23.setupBreaker(187, 78, 2, BF_GLOBALS._breakerBoxStatusArr[10]); + _object24.setupBreaker(187, 84, 2, BF_GLOBALS._breakerBoxStatusArr[11]); + + _object25.setupHiddenSwitch(178, 90, 1, BF_GLOBALS._breakerBoxStatusArr[12]); + _object26.setupHiddenSwitch(178, 108, 2, BF_GLOBALS._breakerBoxStatusArr[13]); +} + +void Scene910::BreakerBoxInset::remove() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + _object13.remove(); + _object14.remove(); + _object15.remove(); + _object16.remove(); + _object17.remove(); + _object18.remove(); + _object19.remove(); + _object20.remove(); + _object21.remove(); + _object22.remove(); + _object23.remove(); + _object24.remove(); + _object25.remove(); + _object26.remove(); + _object27.remove(); + _object28.remove(); + + if ((BF_GLOBALS._breakerBoxStatusArr[13] < 4) && (scene->_breakerBox._frame > 1)) + scene->_breakerBox.animate(ANIM_MODE_6, NULL); + + FocusObject::remove(); +} + +void Scene910::Object13::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_state); + s.syncAsSint16LE(_mode); +} + +bool Scene910::Object13::startAction(CursorType action, Event &event) { + static uint32 black = 0; + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + int8 xDiff; + + if (_mode == 1) + xDiff = 12; + else + xDiff = 7; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(910, 9, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + scene->_sound2.play(101); + if (event.mousePos.x <= _position.x + xDiff) { + if (_mode != 1) { + if (_frame > 6) + setFrame(_frame - 1); + } else { + if (_frame > 1) + setFrame(_frame - 1); + } + } else { + if (_mode == 1) { + if (_frame < 3) + setFrame(_frame + 1); + } else { + if (_frame < 8) + setFrame(_frame + 1); + } + } + + if (_mode != 1) + BF_GLOBALS._breakerBoxStatusArr[_state - 1] = (_state + 251) % 256; + else + BF_GLOBALS._breakerBoxStatusArr[_state - 1] = _state; + + switch (_state) { + case 1: + if (BF_GLOBALS._v4CEE2 < 1) { + if (_frame == 2) { + if (!BF_GLOBALS.getFlag(fGotPointsForClosingDoor)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForClosingDoor); + } + scene->_sceneMode = 0; + if (BF_GLOBALS._dayNumber == 5) { + if (BF_GLOBALS._v4CEE2 == 0) { + scene->_breakerBoxInset.remove(); + // _objectList.draw(); + BF_GLOBALS._player.disableControl(); + scene->_lyle.setVisage(912); + scene->_shadow.remove(); + scene->_action2.remove(); + scene->_nico.postInit(); + scene->_sceneMode = 9129; + scene->setAction(&scene->_sequenceManager1, scene, 9129, &BF_GLOBALS._player, &scene->_nico, NULL); + } else if (BF_GLOBALS._v4CEE2 == 2) { + scene->_breakerBoxInset.remove(); + // _objectList.draw(); + BF_GLOBALS._player.disableControl(); + scene->_lyle.setVisage(911); + scene->_lyle.setStrip(4); + scene->_nico.setVisage(923); + scene->_nico.setStrip(2); + scene->_stuart.setVisage(923); + scene->_stuart.setStrip(3); + scene->_sceneMode = 9134; + scene->setAction(&scene->_sequenceManager1, scene, 9134, &BF_GLOBALS._player, &scene->_nico, &scene->_lyle, NULL); + } + } + BF_GLOBALS._v4CEC8 = 1; + scene->_object5.show(); + if (scene->_sceneMode == 0) { + BF_GLOBALS._player.setVisage(911); + scene->_lyle.setVisage(912); + } + scene->transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, 0); + BF_GLOBALS._scenePalette.signalListeners(); + // _objectList.draw(); + } else { + if (BF_GLOBALS._v4CEC8 == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForStartGenerator)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForStartGenerator); + } + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._v4CEC8 = 0; + scene->_sceneMode = 2; + scene->transition((const byte *)&black, 30, 910, scene, 0, 111, 112, 255, 0); + } + } + } else + SceneItem::display(910, 97, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case 4: + if (_frame == 2) { + if (BF_GLOBALS._breakerBoxStatusArr[4] == 2) { + scene->_action1.setActionIndex(2); + scene->_action1.signal(); + } + } else if (scene->_action1.getActionIndex() == 2) { + scene->_action1.setActionIndex(1); + scene->_action1.signal(); + } + return true; + case 5: + if (_frame == 2) { + if (BF_GLOBALS._breakerBoxStatusArr[3] == 2) { + scene->_action1.setActionIndex(2); + scene->_action1.signal(); + } + } else if (scene->_action1.getActionIndex() == 2) { + scene->_action1.setActionIndex(1); + scene->_action1.signal(); + } + return true; + case 15: + if ((BF_GLOBALS._v4CECA == 2) && (BF_GLOBALS._breakerBoxStatusArr[17] == 1)) { + if (_frame == 7) + scene->closeHiddenDoor(); + else + scene->openHiddenDoor(); + } + return true; + default: + return true; + } + default: + return NamedObject::startAction(action, event); + break; + } +} + +void Scene910::Object13::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::Object13::setupBreaker(int x, int y, int mode, int8 frameNumber) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + NamedObject::postInit(); + _mode = mode; + scene->_breakerButtonCtr++; + _state = scene->_breakerButtonCtr; + setVisage(910); + + if (mode == 1) { + setStrip(8); + setFrame(frameNumber); + } else if (mode == 2) { + setStrip(7); + setFrame(frameNumber + 5); + } + + fixPriority(252); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +void Scene910::Object25::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_field90); + s.syncAsSint16LE(_field92); +} + +bool Scene910::Object25::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_field92 == 1) + SceneItem::display2(910, 10); + else + SceneItem::display2(910, 11); + return true; + case CURSOR_USE: + _field92 = BF_GLOBALS._breakerBoxStatusArr[_field90 + 11]; + switch (_field92 - 1) { + case 0: + _field92 = 2; + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_breakerButtonCtr = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 92, 2, BF_GLOBALS._breakerBoxStatusArr[14]); + } else { + scene->_breakerButtonCtr = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]); + } + SceneItem::display2(910, 12); + break; + case 1: + _field92 = 3; + setStrip(6); + setFrame(3); + if (_field90 == 1) + scene->_breakerBoxInset._object27.remove(); + else + scene->_breakerBoxInset._object28.remove(); + break; + case 2: + _field92 = 2; + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_breakerButtonCtr = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._breakerBoxStatusArr[14]); + } else { + scene->_breakerButtonCtr = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]); + } + break; + case 3: + SceneItem::display2(910, 13); + break; + default: + break; + } + + BF_GLOBALS._breakerBoxStatusArr[_field90 + 11] = _field92; + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +void Scene910::Object25::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::Object25::setupHiddenSwitch(int x, int y, int arg8, int argA) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + NamedObject::postInit(); + scene->_breakerButtonCtr++; + _field90 = arg8; + _field92 = argA; + setVisage(910); + + if ((_field92 != 2) && (_field92 != 4)) { + setStrip(6); + setFrame(3); + } else { + setStrip(7); + setFrame(1); + if (_field90 == 1) { + scene->_breakerButtonCtr = 14; + scene->_breakerBoxInset._object27.setupBreaker(182, 96, 2, BF_GLOBALS._breakerBoxStatusArr[14]); + } else { + scene->_breakerButtonCtr = 15; + scene->_breakerBoxInset._object28.init(178, 108, 0, BF_GLOBALS._breakerBoxStatusArr[15]); + } + } + + fixPriority(251); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +bool Scene910::BlackPlug::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display(910, 14, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + case CURSOR_USE: + switch (_frame - _state - 2) { + case 0: + SceneItem::display(910, 15, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + break; + case 1: + if (BF_GLOBALS._v4CECA == 1) { + BF_GLOBALS._v4CECA = 0; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910); + } else if (BF_GLOBALS._v4CECA == 2) { + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _state); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } + setFrame(_state + 2); + break; + case 2: + if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 0; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + } else if (BF_GLOBALS._v4CECC == 2) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _state); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + scene->_yellowCord.setPosition(Common::Point(540, 100)); + } + setFrame(_state + 2); + break; + case 3: + if ((_position.x - 12) - (5 * _state) < event.mousePos.x) { + if (BF_GLOBALS._v4CECA == 1) { + BF_GLOBALS._v4CECA = 0; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 910); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } else if (BF_GLOBALS._v4CECA == 2) { + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 3 - _state); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + scene->_blackCord.setPosition(Common::Point(540, 100)); + } + setFrame(_state + 4); + } else { + if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 0; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + } else if (BF_GLOBALS._v4CECC == 2) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 3 - _state); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + scene->_yellowCord.setPosition(Common::Point(540, 100)); + } + setFrame(_state + 3); + } + default: + break; + } + BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame; + if (_state == 0) { + if (_frame == 2) + BF_GLOBALS._breakerBoxStatusArr[13] = 2; + else + BF_GLOBALS._breakerBoxStatusArr[13] = 4; + } + return true; + case INV_HALF_YELLOW_CORD: + if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == _state + 2) { + SceneItem::display(910, 85, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + if (BF_GLOBALS._v4CEE2 == 3) { + SceneItem::display(910, 84, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + // no break on purpose + case INV_YELLOW_CORD: + if (BF_GLOBALS._v4CECC == 0) { + BF_GLOBALS._v4CECC = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, _state + 2); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + } else if (BF_GLOBALS._v4CECC == 1) { + BF_GLOBALS._v4CECC = 2; + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, _state + 2); + scene->_yellowCord.setStrip(4); + scene->_yellowCord.setFrame(2); + scene->_yellowCord.setPosition(Common::Point(135, 93)); + scene->_yellowCord.fixPriority(50); + } + if (_frame - _state == 2) + setFrame(_state + 4); + else if (_frame - _state == 3) + setFrame(_state + 5); + BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame; + if (_state == 0) { + if (_frame == 2) + BF_GLOBALS._breakerBoxStatusArr[13] = 2; + else + BF_GLOBALS._breakerBoxStatusArr[13] = 4; + } + return true; + case INV_HALF_BLACK_CORD: + if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == _state + 2) { + SceneItem::display(910, 85, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; + } + //No break on purpose + case INV_BLACK_CORD: + if (BF_GLOBALS._v4CECA == 0) { + if (_state == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBlackCord); + } + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug); + } + } + BF_GLOBALS._v4CECA = 1; + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, _state + 2); + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, 1); + } else if (BF_GLOBALS._v4CECA == 1) { + if (_state == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForBlackCord)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBlackCord); + } + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForGeneratorPlug)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorPlug); + } + } + BF_GLOBALS._v4CECA = 2; + BF_INVENTORY.setObjectScene(INV_HALF_BLACK_CORD, _state + 2); + scene->_blackCord.setStrip(4); + scene->_blackCord.setFrame(1); + scene->_blackCord.setPosition(Common::Point(135, 93)); + scene->_blackCord.fixPriority(50); + scene->_blackCord.show(); + scene->_blackCord._field90 = 1; + if (BF_GLOBALS._breakerBoxStatusArr[17] == 1) { + if (BF_GLOBALS._breakerBoxStatusArr[14] == 2) + scene->closeHiddenDoor(); + else + scene->openHiddenDoor(); + } + } + if (_frame - _state == 2) + setFrame(_state + 3); + else if (_frame - _state == 4) + setFrame(_state + 5); + BF_GLOBALS._breakerBoxStatusArr[_state + 15] = _frame; + if (_state == 0) { + if (_frame == 2) + BF_GLOBALS._breakerBoxStatusArr[13] = 2; + else + BF_GLOBALS._breakerBoxStatusArr[13] = 4; + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene910::BlackPlug::init(int x, int y, int arg8, int8 argA) { + NamedObject::postInit(); + _state = arg8; + _mode = argA; + setVisage(910); + if (_state == 0) + setStrip(7); + else + setStrip(3); + setFrame(argA); + fixPriority(251); + setPosition(Common::Point(x, y)); + BF_GLOBALS._sceneItems.push_front(this); +} + +void Scene910::BlackPlug::remove() { + BF_GLOBALS._sceneItems.remove(this); + SceneObject::remove(); +} + +void Scene910::GeneratorInset::postInit(SceneObjectList *OwnerList) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + FocusObject::postInit(); + _resNum = 910; + _lookLineNum = 99; + _useLineNum = 87; + BF_GLOBALS._sceneItems.push_front(this); + + scene->_breakerButtonCtr = 16; + _blackPlug.init(142, 86, 1, BF_GLOBALS._breakerBoxStatusArr[16]); + + scene->_breakerButtonCtr = 17; + _powerButton.init(BF_GLOBALS._breakerBoxStatusArr[17]); +} + +void Scene910::GeneratorInset::remove() { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 12; + BF_GLOBALS._player.animate(ANIM_MODE_6, scene); + _blackPlug.remove(); + _powerButton.remove(); + FocusObject::remove(); +} + +bool Scene910::PowerButton::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (_frame == 4) { + scene->_sound1.play(100); + scene->_sound1.holdAt(1); + if (!BF_GLOBALS.getFlag(fGotPointsForFuseBoxPlug)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForFuseBoxPlug); + } + setFrame(5); + _object32.setFrame(7); + if (BF_GLOBALS._v4CECA == 2) { + if (BF_GLOBALS._breakerBoxStatusArr[14] == 2) + scene->closeHiddenDoor(); + else + scene->openHiddenDoor(); + } + } else { + scene->_sound1.release(); + if (BF_GLOBALS._bookmark == bEndDayThree) { + if (!BF_GLOBALS.getFlag(fGotPointsForLightsOff)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForLightsOff); + } + } + setFrame(4); + _object32.setFrame(6); + } + BF_GLOBALS._breakerBoxStatusArr[17] = (_frame + 252) % 256; + return true; + } else + return NamedObject::startAction(action, event); +} + +void Scene910::PowerButton::remove() { + _object32.remove(); + SceneObject::remove(); +} + +void Scene910::PowerButton::init(int frame) { + NamedObject::postInit(); + setVisage(910); + setStrip(6); + setFrame(frame + 4); + setPosition(Common::Point(159, 83)); + fixPriority(251); + _object32.postInit(); + _object32.setVisage(910); + _object32.setStrip(6); + _object32.setFrame(6 + frame); + _object32.setPosition(Common::Point(166, 84)); + _object32.fixPriority(251); + BF_GLOBALS._sceneItems.push_front(this); +} + +bool Scene910::Generator::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (scene->_lyle._position.x == 115) + SceneItem::display(910, 62, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9118; + scene->setAction(&scene->_sequenceManager1, scene, 9118, &BF_GLOBALS._player, &scene->_nico, NULL); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9103; + if (BF_GLOBALS.getFlag(gunDrawn)) { + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + } else + scene->setAction(&scene->_sequenceManager1, scene, 9103, &BF_GLOBALS._player, NULL); + } + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene910::Item2::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if (action == 59) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(151, 186); + scene->_sceneSubMode = 5; + scene->_sceneMode = 9123; + if (BF_GLOBALS._player._visage == 1911) + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + else + scene->signal(); + return true; + } else + return NamedHotspot::startAction(action, event); +} + +bool Scene910::Item3::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_TALK) && (BF_GLOBALS._v4CEE2 == 4) && (BF_GLOBALS._v4CEE4 == 0)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 15; + scene->_stripManager.start(9102, scene); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene910::Item9::startAction(CursorType action, Event &event) { + if (BF_GLOBALS._hiddenDoorStatus == 0) + return NamedHotspot::startAction(action, event); + else + return false; +} + +bool Scene910::Item15::startAction(CursorType action, Event &event) { + if (BF_GLOBALS._v4CEC8 == 0) + return false; + + if ((action == CURSOR_LOOK) || (action == CURSOR_USE) || (action == CURSOR_TALK)) + return NamedHotspot::startAction(action, event); + + if (action >= CURSOR_WALK) + return false; + + SceneItem::display(910, 2, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + return true; +} + +bool Scene910::Item16::startAction(CursorType action, Event &event) { + Scene910 *scene = (Scene910 *)BF_GLOBALS._sceneManager._scene; + + if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0)) + return false; + + if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + scene->_destPos = Common::Point(292, 100); + scene->_sceneSubMode = 0; + scene->_sceneMode = 9123; + scene->setAction(&scene->_sequenceManager1, scene, 9123, &BF_GLOBALS._player, NULL); + } else { + Common::Point pt(292, 100); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + } + + return true; +} + +bool Scene910::Item17::startAction(CursorType action, Event &event) { + Common::Point pt(15, 159); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + + return true; +} + +void Scene910::remove() { + PalettedScene::remove(); +} + +void Scene910::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_sceneSubMode); + s.syncAsSint16LE(_breakerButtonCtr); + s.syncAsSint16LE(_field2DE0); + s.syncAsSint16LE(_field2DE2); + s.syncAsSint16LE(_field2DE4); + s.syncAsSint16LE(_destPos.x); + s.syncAsSint16LE(_destPos.y); +} + +void Scene910::postInit(SceneObjectList *OwnerList) { + uint32 unk_50E94 = 0, unk_50E90 = 0; + uint32 unk_50E98 = 0, unk_50E9C = 0; + + PalettedScene::postInit(OwnerList); + loadScene(910); + + BF_GLOBALS._sound1.changeSound(99); + BF_GLOBALS._v51C44 = 0; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_fbiSpeaker); + _stripManager.addSpeaker(&_nicoSpeaker); + _stripManager.addSpeaker(&_daSpeaker); + BF_GLOBALS._player.postInit(); + + if (BF_GLOBALS._v4CEC8 == 0) + BF_GLOBALS._player.setVisage(129); + else + BF_GLOBALS._player.setVisage(911); + + BF_GLOBALS._player.setPosition(Common::Point(330, 190)); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.disableControl(); + + _vent.postInit(); + _vent.setVisage(910); + if ((BF_GLOBALS._breakerBoxStatusArr[3] == 2) && (BF_GLOBALS._breakerBoxStatusArr[4] == 2)) { + _action1.setActionIndex(4); + } else { + _vent.animate(ANIM_MODE_2, NULL); + _vent.setStrip(2); + } + _vent.setPosition(Common::Point(98, 34)); + _vent.setAction(&_action1); + + _breakerBox.postInit(); + _breakerBox.setVisage(910); + _breakerBox.setStrip(5); + _breakerBox.setFrame(1); + _breakerBox.setPosition(Common::Point(91, 66)); + + _fakeWall.postInit(); + _fakeWall.setVisage(910); + _fakeWall.setStrip(8); + _fakeWall.setFrame(4); + _fakeWall.fixPriority(48); + + _yellowCord.init(1); + _yellowCord.setVisage(910); + _yellowCord.setStrip(6); + _yellowCord.setFrame(2); + _yellowCord.fixPriority(50); + + _blackCord.init(2); + _blackCord.setVisage(910); + _blackCord.setStrip(6); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(114, 149)); + _blackCord.fixPriority(246); + + if (BF_GLOBALS._dayNumber < 5) + _item17.setDetails(Rect(0, 149, 29, 167), 910, -1, -1, -1, 1, NULL); + + if (BF_GLOBALS._v4CEE2 == 0) + _item16.setDetails(Rect(265, 18, 319, 102), 910, -1, -1, -1, 1, NULL); + + _breakerBox.setDetails(910, 6, -1, -1, 1, NULL); + _item15.setDetails(Rect(0, 0, 320, 170), 910, 0, 1, 2, 1, NULL); + _yellowCord.setDetails(910, 52, 53, -1, 1, NULL); + _blackCord.setDetails(910, 54, 55, -1, 1, NULL); + _item2.setDetails(3, 910, 22, -1, 24, 1); + _item4.setDetails(1, 910, 16, 17, 18, 1); + _item8.setDetails(4, 910, 25, 26, 27, 1); + _item6.setDetails(Rect(37, 58, 42, 67), 910, 34, 35, 36, 1, NULL); + _item7.setDetails(Rect(114, 53, 135, 87), 910, 37, 38, 39, 1, NULL); + _generator.setDetails(Rect(146, 67, 184, 93), 910, 40, 41, 42, 1, NULL); + _item9.setDetails(Rect(266, 39, 274, 70), 910, 43, 44, 45, 1, NULL); + _item10.setDetails(Rect(276, 27, 288, 83), 910, 46, 47, 48, 1, NULL); + _item11.setDetails(Rect(295, 42, 312, 87), 910, 49, 50, 51, 1, NULL); + _fakeWall.setDetails(910, 28, -1, 30, 1, NULL); + _item3.setDetails(7, 910, 59, 60, 61, 1); + _item5.setDetails(2, 910, 19, 20, 21, 1); + _backWall.setDetails(6, 910, 28, 29, 30, 1); + _item13.setDetails(5, 910, 31, 32, 33, 1); + _item14.setDetails(Rect(0, 0, 320, 170), 910, 3, 4, 5, 1, NULL); + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 5; + BF_GLOBALS._sceneManager._previousScene = 900; + BF_GLOBALS.setFlag(fWithLyle); + } + + if ( (BF_GLOBALS._sceneManager._previousScene == 910) + || (BF_GLOBALS._sceneManager._previousScene == 190) + || (BF_GLOBALS._sceneManager._previousScene == 300)) { + BF_GLOBALS._sceneManager._previousScene = 900; + BF_GLOBALS._v4CEE2 = 0; + BF_GLOBALS._v4CEE4 = 0; + } + + _field2DE0 = 0; + _field2DE2 = 0; + _field2DE4 = 0; + BF_GLOBALS.clearFlag(fCanDrawGun); + _lyle._position.x = 0; + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._sceneManager._previousScene == 900)){ + BF_GLOBALS.setFlag(fCanDrawGun); + BF_GLOBALS._v4CEC8 = 0; + BF_GLOBALS._player.setVisage(129); + + _lyle.postInit(); + _lyle.setVisage(811); + _lyle.setPosition(Common::Point(-52, 217)); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle._field90 = 0; + _lyle.setDetails(910, 69, 70, 71, 5, &_item4); + + BF_GLOBALS._breakerBoxStatusArr[0] = 3; + BF_GLOBALS._breakerBoxStatusArr[12] = 2; + BF_GLOBALS._breakerBoxStatusArr[13] = 4; + BF_GLOBALS._breakerBoxStatusArr[14] = 3; + BF_GLOBALS._breakerBoxStatusArr[15] = 3; + BF_GLOBALS._breakerBoxStatusArr[16] = 4; + BF_GLOBALS._breakerBoxStatusArr[17] = 1; + BF_GLOBALS._v4CECA = 2; + BF_GLOBALS._hiddenDoorStatus = 1; + _yellowCord.setPosition(Common::Point(291, -30)); + BF_GLOBALS._v4CECC = 0; + } + + if (BF_GLOBALS._sceneManager._previousScene == 920) { + BF_GLOBALS.setFlag(fCanDrawGun); + BF_GLOBALS._player.setPosition(Common::Point(276, 119)); + BF_GLOBALS._player.setStrip(6); + if (BF_GLOBALS._v4CECC == 0) + _yellowCord.setPosition(Common::Point(291, -30)); + + if (BF_GLOBALS._dayNumber == 5) { + _nico.postInit(); + _nico.setVisage(914); + _nico.setStrip(5); + _nico.setFrame(8); + _nico.setPosition(Common::Point(263, 120)); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + + _stuart.postInit(); + _stuart.setVisage(918); + _stuart.setStrip(4); + _stuart.setFrame(1); + _stuart.setPosition(Common::Point(291, 127)); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + + _lyle.postInit(); + _lyle.setVisage(916); + _lyle.setPosition(Common::Point(155, 113)); + _lyle.setStrip(3); + _lyle.setFrame(3); + _lyle._field90 = 1; + _lyle.setDetails(910, 69, 70, 71, 5, &_item4); + } + BF_GLOBALS._player.enableControl(); + } else if (BF_GLOBALS._sceneManager._previousScene == 935) { + BF_GLOBALS.setFlag(fCanDrawGun); + BF_GLOBALS._v4CEC8 = 0; + _lyle.postInit(); + _lyle.setVisage(916); + _lyle.setPosition(Common::Point(155, 113)); + _lyle.setStrip(3); + _lyle.setFrame(3); + _lyle._field90 = 1; + _lyle.setDetails(910, 69, 70 ,71 , 5, &_item4); + + BF_GLOBALS._walkRegions.disableRegion(15); + BF_GLOBALS._walkRegions.disableRegion(16); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._walkRegions.disableRegion(10); + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.setVisage(1911); + BF_GLOBALS._player.animate(ANIM_MODE_NONE, 0, NULL); + BF_GLOBALS._player.setFrame(7); + } + BF_GLOBALS._player.setPosition(Common::Point(174, 157)); + BF_GLOBALS._player._strip = 7; + _nico.postInit(); + _nico.setVisage(913); + _nico.setPosition(Common::Point(262, 124)); + _nico.setStrip(6); + BF_GLOBALS._v4CEE6 = 0; + BF_GLOBALS._v4CEE2 = 1; + _nico.setDetails(910, 63, 64, 67, 5, &_item4); + BF_GLOBALS._v4CECA = 2; + if (BF_GLOBALS._v4CECC == 0) + _yellowCord.setPosition(Common::Point(291, -30)); + _sceneMode = 11; + if (BF_GLOBALS._v4CEC8 == 0) + add2Faders((const byte *)&unk_50E94, 2, 913, this); + else + add2Faders((const byte *)&unk_50E90, 2, 911, this); + } else { + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)){ + _shadow.postInit(); + _shadow.setAction(&_action2); + } + + if (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 1) + _yellowCord.setPosition(Common::Point(540, 100)); + + if (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 1) + _blackCord.setPosition(Common::Point(540, 100)); + + if (BF_GLOBALS._v4CECC == 2) { + _yellowCord.setStrip(4); + _yellowCord.setFrame(2); + _yellowCord.setPosition(Common::Point(135, 93)); + _yellowCord.setPriority(50); + _yellowCord._field90 = 1; + + _breakerBox.setFrame(3); + } + + if (BF_GLOBALS._v4CECA == 2) { + _blackCord.setStrip(4); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(135, 93)); + _blackCord.fixPriority(50); + _blackCord._field90 = 1; + + _breakerBox.setFrame(3); + } + + _object5.postInit(); + _object5.setVisage(919); + _object5.setStrip(5); + _object5.setPosition(Common::Point(286, 129)); + _object5.fixPriority(1); + + if (BF_GLOBALS._v4CEC8 == 0) + _object5.hide(); + + if (BF_GLOBALS._hiddenDoorStatus == 0) { + _object5.setFrame(1); + _fakeWall.setPosition(Common::Point(292, 107)); + if (BF_GLOBALS._v4CECC != 2) + _yellowCord.setPosition(Common::Point(288, 57)); + BF_GLOBALS._walkRegions.disableRegion(10); + } else { + _object5.setFrame(6); + _fakeWall.setPosition(Common::Point(295, 20)); + _fakeWall.hide(); + if (BF_GLOBALS._v4CECC != 2) + _yellowCord.setPosition(Common::Point(291, -30)); + BF_GLOBALS._walkRegions.disableRegion(10); + } + + if (BF_GLOBALS._breakerBoxStatusArr[17] != 0) { + _sound1.play(100); + _sound1.holdAt(1); + } + + if (BF_GLOBALS._sceneManager._previousScene != 935) { + _sceneMode = 11; + if (BF_GLOBALS._v4CEC8 == 0) + add2Faders((const byte *)&unk_50E9C, 10, 910, this); + else + add2Faders((const byte *)&unk_50E98, 10, 911, this); + } +} + +void Scene910::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 2: + _sceneMode = 3; + _timer1.set(60, this); + break; + case 3: + _sceneMode = 4; + transition((const byte *)&black, 35, 910, this, 0, 111, 112, 255, false); + break; + case 4: + _sceneMode = 5; + _timer1.set(30, this); + break; + case 5: + _sceneMode = 6; + transition((const byte *)&black, 40, 910, this, 0, 111, 112, 255, false); + break; + case 6: + _sceneMode = 7; + _timer1.set(60, this); + break; + case 7: + BF_GLOBALS._player.setVisage(129); + _lyle.setVisage(811); + _object5.hide(); + _sceneMode = 8; + transition((const byte *)&black, 95, 910, this, 0, 111, 112, 255, false); + break; + case 8: + _sceneMode = 9; + _timer1.set(30, this); + break; + case 9: + _sceneMode = 0; + transition((const byte *)&black, 100, 910, this, 0, 111, 112, 255, false); + BF_GLOBALS._player.enableControl(); + break; + case 10: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._v51C44 = 0; + BF_GLOBALS._sceneManager.changeScene(935); + break; + case 11: + if (BF_GLOBALS._sceneManager._previousScene == 900) { + if (BF_GLOBALS._v4CEC8 != 0) + transition((const byte *)&black, 25, 910, NULL, 0, 111, 112, 255, false); + if (BF_GLOBALS.getFlag(fWithLyle)) { + NpcMover *mover = new NpcMover(); + Common::Point destPos(22, 157); + _lyle.addMover(mover, &destPos, NULL); + } + + _sceneMode = 9100; + setAction(&_sequenceManager1, this, 9100, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS._sceneManager._previousScene == 935) { + _sceneMode = 9146; + _stripManager.start(9103, this); + } + break; + case 12: + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setStrip(7); + BF_GLOBALS._player.enableControl(); + break; + case 13: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9117, &_nico, NULL); + BF_GLOBALS._v4CEE2 = 2; + // No break on purpose + case 15: + _stuart.postInit(); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + BF_GLOBALS._v4CEE8 = 0; + _sceneMode = 9121; + setAction(&_sequenceManager1, this, 9121, &_stuart, NULL); + break; + case 14: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(940); + break; + case 16: + _lyle._field90 = 1; + _sceneMode = 10; + addFader((const byte *)&black, 2, this); + BF_GLOBALS._v4CEE2 = 1; + BF_GLOBALS._walkRegions.disableRegion(16); + BF_GLOBALS._walkRegions.disableRegion(14); + BF_GLOBALS._sceneItems.remove(&_item16); + break; + case 17: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + if (_field2DE2 == 0) { + _field2DE2 = 1; + if (BF_GLOBALS._v4CEE2 == 4) { + _sceneMode = 9149; + setAction(&_sequenceManager1, this, 9149, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9141; + setAction(&_sequenceManager1, this, 9141, &BF_GLOBALS._player, &_nico, NULL); + } + } else { + SceneItem::display(910, 91, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + break; + case 18: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + if (BF_GLOBALS._v4CEE4 == 3) { + if (_field2DE4 == 0) { + _field2DE4 = 1; + _sceneMode = 9142; + setAction(&_sequenceManager1, this, 9142, &BF_GLOBALS._player, &_stuart, NULL); + } else { + SceneItem::display(910, 92, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + } else { + SceneItem::display(910, 94, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + } + break; + case 19: + BF_GLOBALS._deathReason = 14; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 20: + BF_GLOBALS._player.enableControl(); + break; + case 9100: + if (BF_GLOBALS._dayNumber == 5) + BF_GLOBALS._walkRegions.disableRegion(1); + BF_GLOBALS._player.enableControl(); + break; + case 9101: + if ((BF_GLOBALS._hiddenDoorStatus == 0) && (BF_GLOBALS._v4CEC8 != 0) && (BF_GLOBALS._breakerBoxStatusArr[17] == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910) && (BF_INVENTORY.getObjectScene(INV_BLACK_CORD) == 910)) + BF_GLOBALS.clearFlag(fGotPointsForSearchingDA); + else + BF_GLOBALS.setFlag(fGotPointsForSearchingDA); + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(900); + break; + case 9102: + if ((BF_GLOBALS._breakerBoxStatusArr[13] < 4) && (_breakerBox._frame == 1)) + _breakerBox.animate(ANIM_MODE_5, NULL); + + BF_GLOBALS._player.enableControl(); + _breakerBoxInset.postInit(); + _breakerBoxInset.setVisage(910); + _breakerBoxInset.setStrip(3); + _breakerBoxInset.setFrame(1); + _breakerBoxInset.setPosition(Common::Point(160, 130)); + _breakerBoxInset.fixPriority(250); + break; + case 9103: + BF_GLOBALS._player.enableControl(); + _generatorInset.postInit(); + _generatorInset.setVisage(910); + _generatorInset.setStrip(3); + _generatorInset.setFrame(2); + _generatorInset.setPosition(Common::Point(160, 130)); + _generatorInset.fixPriority(250); + break; + case 9110: + if (!BF_GLOBALS.getFlag(fGotPointsForCrate)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCrate); + } + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 1); + _blackCord.setPosition(Common::Point(540, 100)); + BF_GLOBALS._player.enableControl(); + break; + case 9111: + if ((BF_GLOBALS._bookmark == bEndDayThree) && (!BF_GLOBALS.getFlag(fGotPointsForGeneratorOff))) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForGeneratorOff); + } + BF_INVENTORY.setObjectScene(INV_BLACK_CORD, 910); + _blackCord.setStrip(6); + _blackCord.setFrame(1); + _blackCord.setPosition(Common::Point(114, 149)); + _blackCord.fixPriority(249); + BF_GLOBALS._v4CECA = 0; + _blackCord._field90 = 0; + BF_GLOBALS._player.enableControl(); + break; + case 9112: + BF_GLOBALS._player._strip = 4; + BF_GLOBALS._player._frame = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 1); + _yellowCord.setPosition(Common::Point(540, 100)); + BF_GLOBALS._player.enableControl(); + break; + case 9113: + BF_GLOBALS._player._strip = 4; + BF_GLOBALS._player._frame = 1; + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 910); + _yellowCord.setStrip(6); + _yellowCord.setFrame(2); + _yellowCord.setPosition(Common::Point(_fakeWall._position.x - 4, _fakeWall._position.y - 50)); + _yellowCord.fixPriority(50); + BF_GLOBALS._v4CECC = 0; + _yellowCord._field90 = 0; + _yellowCord.show(); + BF_GLOBALS._player.enableControl(); + break; + case 9114: + _fakeWall.hide(); + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + BF_GLOBALS._player.disableControl(); + _nico.postInit(); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + BF_GLOBALS._v4CEE6 = 0; + _shadow.postInit(); + _action2.remove(); + _sceneMode = 9116; + setAction(&_sequenceManager1, this, 9116, &_nico, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9115: + BF_GLOBALS._player.enableControl(); + break; + case 9116: + BF_GLOBALS._player.disableControl(); + _sceneMode = 16; + _stripManager.start(9119, this); + break; + case 9118: + // No break on purpose + case 9137: + BF_GLOBALS._deathReason = 16; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9119: + if (!BF_GLOBALS.getFlag(fGotPointsForCordOnForklift)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCordOnForklift); + } + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0); + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 1); + BF_GLOBALS._player.enableControl(); + break; + case 9120: + BF_GLOBALS._walkRegions.disableRegion(7); + BF_GLOBALS._player.enableControl(); + break; + case 9121: + _item3.setDetails(7, 910, 96, 60, 61, 3); + BF_GLOBALS._v4CEE4 = 2; + if (BF_GLOBALS._v4CEE2 == 4) { + _sceneMode = 20; + _stripManager.start(9115, this); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9123: + BF_GLOBALS.clearFlag(gunDrawn); + switch (_sceneSubMode - 1) { + case 0: + _sceneMode = 9102; + setAction(&_sequenceManager1, this, 9102, &BF_GLOBALS._player, NULL); + break; + case 1: + _sceneMode = 9103; + setAction(&_sequenceManager1, this, 9103, &BF_GLOBALS._player, NULL); + break; + case 2: + _sceneMode = 9143; + setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL); + break; + case 3: + _sceneMode = 9110; + setAction(&_sequenceManager1, this, 9110, &BF_GLOBALS._player, &_blackCord, NULL); + break; + case 4: + _sceneMode = 9111; + setAction(&_sequenceManager1, this, 9111, &BF_GLOBALS._player, &_blackCord, NULL); + break; + case 5: + switch (BF_GLOBALS._v4CEE2 - 1) { + case 0: + _sceneMode = 9118; + setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL); + break; + case 1: + _sceneMode = 9148; + setAction(&_sequenceManager1, this, 9148, &BF_GLOBALS._player, &_nico, NULL); + break; + case 2: + // No break on purpose + case 3: { + _sceneMode = 17; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(232, 138); + BF_GLOBALS._player.addMover(mover, &destPos, this); + } + default: + break; + } + break; + case 6: { + _sceneMode = 18; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(248, 137); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 7: { + _sceneMode = 9112; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(285, 114); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 8: { + _sceneMode = 9113; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(285, 114); + BF_GLOBALS._player.addMover(mover, &destPos, this); + break; + } + case 9: + _sceneMode = 9119; + setAction(&_sequenceManager1, this, 9119, &BF_GLOBALS._player, &_nico, &_yellowCord, NULL); + break; + case 10: + _yellowCord.fixPriority(127); + if (_yellowCord._position.x != 267) + _yellowCord.hide(); + _sceneMode = 9136; + setAction(&_sequenceManager1, this, 9136, &BF_GLOBALS._player, &_stuart, &_yellowCord, NULL); + BF_GLOBALS._v4CEE4 = 3; + break; + case 11: + _sceneMode = 9137; + setAction(&_sequenceManager1, this, 9137, &BF_GLOBALS._player, &_nico, NULL); + break; + default: + BF_GLOBALS._player.enableControl(); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &_destPos, NULL); + break; + } + break; + case 9124: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS.setFlag(gunDrawn); + break; + case 9125: + BF_GLOBALS.setFlag(fBackupAt340); + BF_GLOBALS._v4CEE2 = 4; + _stuart.postInit(); + _nico.setDetails(910, 72, 73, 74, 3, NULL); + _stuart.setDetails(910, 66, 67, 68, 5, &_nico); + BF_GLOBALS._v4CEE8 = 0; + _sceneMode = 9121; + setAction(&_sequenceManager1, this, 9121, &_stuart, NULL); + break; + case 9126: + _sceneMode = 19; + if (BF_GLOBALS._v4CEE4 == 0) + signal(); + else + _stripManager.start(9115, this); + break; + case 9129: + // No break on purpose + case 9134: + BF_GLOBALS._deathReason = 17; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9130: + _lyle.setAction(&_sequenceManager2, NULL, 9133, &_lyle, NULL); + BF_GLOBALS._breakerBoxStatusArr[14] = 3; + openHiddenDoor(); + BF_GLOBALS._walkRegions.disableRegion(15); + break; + case 9132: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._v4CEE4 = 4; + BF_GLOBALS._deathReason = 13; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9135: + BF_GLOBALS._deathReason = 15; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9136: + if (!BF_GLOBALS.getFlag(fGotPointsForCuffingNico)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCuffingNico); + } + _lyle.setAction(&_sequenceManager2, NULL, 9131, &_lyle, NULL); + BF_GLOBALS._walkRegions.enableRegion(16); + if (BF_GLOBALS._v4CEE2 == 4) + BF_INVENTORY.setObjectScene(INV_YELLOW_CORD, 0); + else + BF_INVENTORY.setObjectScene(INV_HALF_YELLOW_CORD, 910); + _forbes.postInit(); + _forbes.setDetails(910, 86, 87, 88, 4, &_item8); + _sceneMode = 9139; + setAction(&_sequenceManager1, this, 9139, &_forbes, &BF_GLOBALS._player, NULL); + break; + case 9139: + BF_GLOBALS._walkRegions.disableRegion(4); + _field2DE0 = 1; + BF_GLOBALS._player.enableControl(); + break; + case 9140: + _sceneMode = 14; + addFader((const byte *)&black, 2, this); + break; + case 9141: + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + if (!BF_GLOBALS.getFlag(fGotPointsForCuffingDA)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCuffingDA); + } + BF_GLOBALS._player.enableControl(); + break; + case 9142: + BF_GLOBALS._player.enableControl(); + if (!BF_GLOBALS.getFlag(fGotPointsForSearchingNico)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForSearchingNico); + } + break; + case 9143: + if (BF_GLOBALS._v4CEE2 == 0) { + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(920); + } else { + SceneItem::display(910, 89, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + _sceneMode = 9144; + setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL); + } + break; + case 9144: + // No break on purpose + case 9146: + BF_GLOBALS._player.enableControl(); + break; + case 9148: + BF_GLOBALS._deathReason = 23; + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9149: + SceneItem::display(910, 74, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + break; + default: + break; + } +} + +void Scene910::process(Event &event) { + SceneExt::process(event); + if ((!BF_GLOBALS._player._enabled) || (event.mousePos.y >= 167)) + return; + + if (!_focusObject) { + if (_item17._bounds.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else if ((BF_GLOBALS._hiddenDoorStatus == 0) || (BF_GLOBALS._v4CEE2 != 0)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else if (!_item16._bounds.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } else { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NW); + BF_GLOBALS._events.setCursor(surface); + } + } + + if (event.eventType != EVENT_BUTTON_DOWN) + return; + + switch (BF_GLOBALS._events.getCursor()) { + case INV_COLT45: + if (!BF_GLOBALS._player._bounds.contains(event.mousePos)) + break; + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.disableControl(); + _destPos = BF_GLOBALS._player._position; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + event.handled = true; + } else if (BF_GLOBALS._v4CEE2 <= 1) { + if (BF_GLOBALS.getFlag(fCanDrawGun)) { + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.disableControl(); + _sceneMode = 9124; + setAction(&_sequenceManager1, this, 9124, &BF_GLOBALS._player, NULL); + } else + SceneItem::display(1, 4, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + } else + SceneItem::display(910, 81, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + event.handled = true; + break; + case CURSOR_WALK: + if (BF_GLOBALS._v4CEE2 == 1) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + _destPos = event.mousePos; + _sceneSubMode = 0; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9118; + setAction(&_sequenceManager1, this, 9118, &BF_GLOBALS._player, &_nico, NULL); + event.handled = true; + } + } else if (BF_GLOBALS._player._visage == 1911) { + BF_GLOBALS._player.disableControl(); + _destPos = event.mousePos; + _sceneSubMode = 0; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } + default: + break; + } +} + +void Scene910::dispatch() { + SceneExt::dispatch(); + if (_action) + return; + + if ((_sceneMode != 14) && (BF_GLOBALS._player._position.x < 30) && (BF_GLOBALS._player._position.y > 148)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._dayNumber != 5) { + _sceneMode = 9101; + setAction(&_sequenceManager1, this, 9101, &BF_GLOBALS._player, NULL); + } else { + _sceneMode = 9146; + if (BF_GLOBALS._hiddenDoorStatus == 0) + setAction(&_sequenceManager1, this, 9146, &BF_GLOBALS._player, NULL); + else + setAction(&_sequenceManager1, this, 9145, &BF_GLOBALS._player, NULL); + } + } + + if ((BF_GLOBALS._player._position.x > 265) && (BF_GLOBALS._player._position.y < 102) && (BF_GLOBALS._hiddenDoorStatus != 0) && (_sceneMode != 9143)) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(gunDrawn)) { + _sceneSubMode = 3; + _sceneMode = 9123; + setAction(&_sequenceManager1, this, 9123, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS._v4CEE2 == 0) { + _sceneMode = 9143; + setAction(&_sequenceManager1, this, 9143, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display(910, 98, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + _sceneMode = 9144; + setAction(&_sequenceManager1, this, 9144, &BF_GLOBALS._player, NULL); + } + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._player._position.x > 250) && (_sceneMode != 9135) && (_sceneMode != 11) && (BF_GLOBALS._hiddenDoorStatus != 0) && (BF_GLOBALS._v4CEE2 == 0)) { + BF_GLOBALS._player.disableControl(); + _shadow.remove(); + _nico.remove(); + _nico.postInit(); + _nico.setDetails(910, 63, 64, 65, 5, &_item4); + _sceneMode = 9135; + setAction(&_sequenceManager1, this, 9135, &BF_GLOBALS._player, &_nico, NULL); + } + +} + +void Scene910::checkGun() { + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0) && (BF_GLOBALS._hiddenDoorStatus != 0)) + SceneItem::display(910, 70, SET_WIDTH, 312, + SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, + SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + else + SceneExt::checkGun(); +} + +void Scene910::openHiddenDoor() { + if (BF_GLOBALS._hiddenDoorStatus != 0) + return; + + if (! BF_GLOBALS.getFlag(fGotPointsForLightsOn)) { + T2_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.setFlag(fGotPointsForLightsOn); + } + BF_GLOBALS._hiddenDoorStatus = 1; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.enableRegion(10); + _sceneMode = 9114; + _sound2.play(42); + if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910)) + setAction(&_sequenceManager1, this, 9127, &_fakeWall, &_yellowCord, &_object5, NULL); + else + setAction(&_sequenceManager1, this, 9114, &_fakeWall, &_object5, NULL); +} + +void Scene910::closeHiddenDoor() { + if (BF_GLOBALS._hiddenDoorStatus != 0) { + _fakeWall.show(); + if ((BF_GLOBALS._bookmark == bEndDayThree) && (!BF_GLOBALS.getFlag(fGotPointsForOpeningDoor))) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForOpeningDoor); + } + BF_GLOBALS._hiddenDoorStatus = 0; + BF_GLOBALS._walkRegions.disableRegion(10); + BF_GLOBALS._player.disableControl(); + _sceneMode = 9115; + _sound2.play(42); + if ((BF_GLOBALS._v4CECC == 0) && (BF_INVENTORY.getObjectScene(INV_YELLOW_CORD) == 910)) + setAction(&_sequenceManager1, this, 9128, &_fakeWall, &_yellowCord, &_object5, NULL); + else + setAction(&_sequenceManager1, this, 9115, &_fakeWall, &_object5, NULL); + } + + if ((BF_GLOBALS._dayNumber == 5) && (BF_GLOBALS._v4CEE2 == 0)) { + // _objectList.draw(); + if (BF_GLOBALS._sceneObjects->contains(&_breakerBoxInset)) + _breakerBoxInset.remove(); + if (BF_GLOBALS._sceneObjects->contains(&_generatorInset)) + _generatorInset.remove(); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 9120; + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 9120, &BF_GLOBALS._player, &_lyle, NULL); + BF_GLOBALS._walkRegions.enableRegion(1); + } +} + +/*-------------------------------------------------------------------------- * Scene 920 - Inside Warehouse: Secret Room * *--------------------------------------------------------------------------*/ @@ -732,13 +2926,13 @@ bool Scene920::Item1::startAction(CursorType action, Event &event) { case CURSOR_LOOK: if ((BF_GLOBALS.getFlag(fCrateOpen)) && (BF_GLOBALS._player._visage == 921)) { BF_GLOBALS._player.disableControl(); - scene->_object2.postInit(); + scene->_crateWindow.postInit(); scene->_sceneMode = 9204; if (!BF_GLOBALS.getFlag(fGotPointsForBoots)) { - BF_GLOBALS._uiElements.addScore(30); + T2_GLOBALS._uiElements.addScore(30); BF_GLOBALS.setFlag(fGotPointsForBoots); } - scene->setAction(&scene->_sequenceManager1, scene, 9204, &BF_GLOBALS._player, &scene->_object2, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 9204, &BF_GLOBALS._player, &scene->_crateWindow, NULL); return true; } else return NamedHotspot::startAction(action, event); @@ -747,12 +2941,12 @@ bool Scene920::Item1::startAction(CursorType action, Event &event) { BF_GLOBALS._player.disableControl(); if (BF_GLOBALS.getFlag(fCrateOpen)) { if (BF_GLOBALS._player._visage == 921) { - if ((BF_INVENTORY.getObjectScene(15) != 1) && (BF_GLOBALS.getFlag(fSawGuns))) { + if ((BF_INVENTORY.getObjectScene(INV_AUTO_RIFLE) != 1) && (BF_GLOBALS.getFlag(fSawGuns))) { scene->_sceneMode = 9207; scene->setAction(&scene->_sequenceManager1, scene, 9207, &BF_GLOBALS._player, NULL); } else { scene->_sceneMode = 9203; - scene->setAction(&scene->_sequenceManager1, scene, 9203, &BF_GLOBALS._player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 9203, &BF_GLOBALS._player, &scene->_crateTop, NULL); BF_GLOBALS.clearFlag(fCrateOpen); } } else { @@ -761,7 +2955,7 @@ bool Scene920::Item1::startAction(CursorType action, Event &event) { } } else { scene->_sceneMode = 9202; - scene->setAction(&scene->_sequenceManager1, scene, 9202, &BF_GLOBALS._player, &scene->_object1, NULL); + scene->setAction(&scene->_sequenceManager1, scene, 9202, &BF_GLOBALS._player, &scene->_crateTop, NULL); BF_GLOBALS.setFlag(fCrateOpen); } return true; @@ -803,22 +2997,23 @@ void Scene920::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._dayNumber = 4; BF_GLOBALS._player.postInit(); if (BF_GLOBALS._v4CEC8 != 0) { - _object3.postInit(); - _object3.setVisage(922); - _object3.setStrip(2); - _object3.fixPriority(1); - _object3.setPosition(Common::Point(145, 82)); + _doorway.postInit(); + _doorway.setVisage(922); + _doorway.setStrip(2); + _doorway.fixPriority(1); + _doorway.setPosition(Common::Point(145, 82)); } - _object1.postInit(); - _object1.setVisage(922); + _crateTop.postInit(); + _crateTop.setVisage(922); if (BF_GLOBALS.getFlag(fCrateOpen)) { - _object1.setStrip(3); - _object1.setFrame(5); + _crateTop.setStrip(3); + _crateTop.setFrame(5); } - _object1.setPosition(Common::Point(158, 107)); - _object1.setPriority(130); + _crateTop.setPosition(Common::Point(158, 107)); + _crateTop.fixPriority(130); + _exitN.setDetails(Rect(116, 12, 165, 81), 920, -1, -1, -1, 1, NULL); _item6.setDetails(6, 920, 15, 16, 17, 1); _item4.setDetails(5, 920, 12, 13, 14, 1); @@ -847,7 +3042,7 @@ void Scene920::signal() { BF_GLOBALS._sceneManager.changeScene(910); break; case 9204: - _object2.remove(); + _crateWindow.remove(); BF_GLOBALS.setFlag(fSawGuns); BF_GLOBALS._player.enableControl(); break; @@ -859,8 +3054,8 @@ void Scene920::signal() { } case 9207: BF_GLOBALS._player.enableControl(); - BF_GLOBALS._uiElements.addScore(30); - BF_INVENTORY.setObjectScene(15, 1); + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1); BF_GLOBALS._bookmark = bEndDayThree; break; default: @@ -870,7 +3065,7 @@ void Scene920::signal() { } void Scene920::process(Event &event) { SceneExt::process(event); - if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (UI_INTERFACE_Y - 1))) { if (_exitN.contains(event.mousePos)) { GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); BF_GLOBALS._events.setCursor(surface); @@ -912,25 +3107,26 @@ bool Scene930::Object1::startAction(CursorType action, Event &event) { Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; bool result; - if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(93))) { + if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(fGotPointsForFBI))) { scene->setAction(&scene->_action2); result = true; - } else + } else result = NamedObject::startAction(action, event); return result; } bool Scene930::Object2::startAction(CursorType action, Event &event) { +// Small box Inset Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; if (action != CURSOR_USE) return NamedObject::startAction(action, event); NamedObject::startAction(action, event); - BF_GLOBALS._uiElements.addScore(30); - BF_INVENTORY.setObjectScene(54, 1); - BF_GLOBALS.setFlag(93); + T2_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_9MM_BULLETS, 1); + BF_GLOBALS.setFlag(fGotPointsForFBI); remove(); scene->_box.remove(); return true; @@ -943,13 +3139,13 @@ bool Scene930::Object3::startAction(CursorType action, Event &event) { if (action != CURSOR_USE) return NamedObject::startAction(action, event); - if (scene->_v141C == 0) + if (!scene->_bootInsetDisplayed) scene->setAction(&scene->_action1); return true; } bool Scene930::Object4::startAction(CursorType action, Event &event) { -// Boot window +// Boot inset Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; switch (action) { @@ -972,7 +3168,7 @@ bool Scene930::Object4::startAction(CursorType action, Event &event) { if (BF_GLOBALS._bookmark >= bFlashBackTwo) { _lookLineNum = 71; NamedObject::startAction(action, event); - scene->subF3D6F(); + scene->ShowSoleInset(); remove(); } else NamedObject::startAction(action, event); @@ -983,23 +3179,35 @@ bool Scene930::Object4::startAction(CursorType action, Event &event) { } } +void Scene930::Object4::remove() { +// Boots inset + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_bootInsetDisplayed && !BF_GLOBALS._sceneObjects->contains(&scene->_soleInset)) { + scene->_boots.setAction(&scene->_action3); + } + + FocusObject::remove(); +} + bool Scene930::Object5::startAction(CursorType action, Event &event) { +// Boots sole inset Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; switch (action) { case CURSOR_WALK: return true; case CURSOR_USE: - if (BF_INVENTORY.getObjectScene(55) == 1) + if (BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) return NamedObject::startAction(action, event); - if (scene->_v141A == 0) { + if (!scene->_soleOpened) { animate(ANIM_MODE_4, getFrameCount() - 1, 1, NULL); - scene->_v141A = 1; + scene->_soleOpened = 1; _lookLineNum = 76; _useLineNum = 78; } else { - BF_GLOBALS._uiElements.addScore(50); - BF_INVENTORY.setObjectScene(55, 1); + T2_GLOBALS._uiElements.addScore(50); + BF_INVENTORY.setObjectScene(INV_SCHEDULE, 1); setFrame2(getFrameCount()); _lookLineNum = 92; _useLineNum = -1; @@ -1010,6 +3218,14 @@ bool Scene930::Object5::startAction(CursorType action, Event &event) { break; } } + +void Scene930::Object5::remove() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + scene->_boots.setAction(&scene->_action3); + + FocusObject::remove(); +} + /* Items */ bool Scene930::Item1::startAction(CursorType action, Event &event) { Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; @@ -1031,7 +3247,7 @@ void Scene930::Action1::signal() { case 0: setDelay(10); BF_GLOBALS._player.disableControl(); - scene->_v141C = 1; + scene->_bootInsetDisplayed = 1; break; case 1: { Common::Point pt(50, 142); @@ -1055,10 +3271,10 @@ void Scene930::Action1::signal() { BF_GLOBALS._player.animate(ANIM_MODE_5, this); break; case 5: - scene->showBootWindow(); - if (!BF_GLOBALS.getFlag(72)) { - BF_GLOBALS._uiElements.addScore(30); - BF_GLOBALS.setFlag(72); + scene->showBootInset(); + if (!BF_GLOBALS.getFlag(fGotPointsForCPU)) { + T2_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForCPU); } SceneItem::display(0, 312); BF_GLOBALS._player.enableControl(); @@ -1088,10 +3304,10 @@ void Scene930::Action2::signal() { case 3: SceneItem::display(930, scene->_box._useLineNum, SET_WIDTH, 312, SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); - scene->subF3C07(); + scene->ShowBoxInset(); BF_GLOBALS._player.enableControl(); remove(); break; @@ -1117,7 +3333,7 @@ void Scene930::Action3::signal() { BF_GLOBALS._player.setVisage(368); BF_GLOBALS._player.setStrip(6); BF_GLOBALS._player.setFrame(1); - scene->_v141C = 0; + scene->_bootInsetDisplayed = 0; remove(); BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); BF_GLOBALS._player.enableControl(); @@ -1135,9 +3351,9 @@ void Scene930::postInit(SceneObjectList *OwnerList) { if (BF_GLOBALS._dayNumber == 0) BF_GLOBALS._dayNumber = 1; setZoomPercents(83, 75, 140, 100); - _v141A = 0; - _v141C = 0; - if (BF_INVENTORY.getObjectScene(54) != 1) { + _soleOpened = 0; + _bootInsetDisplayed = 0; + if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) != 1) { _box.postInit(); _box.setVisage(930); _box.setStrip(1); @@ -1187,7 +3403,8 @@ void Scene930::postInit(SceneObjectList *OwnerList) { _sceneMode = 0; setAction(&_sequenceManager1, this, 9300, &BF_GLOBALS._player, NULL); } else { - _v141C = 1; + // After flashback + _bootInsetDisplayed = 1; BF_GLOBALS._player.animate(ANIM_MODE_NONE); BF_GLOBALS._player.setPosition(Common::Point(50, 142)); BF_GLOBALS._player.setVisage(931); @@ -1197,7 +3414,7 @@ void Scene930::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player.enableControl(); BF_GLOBALS._player.changeZoom(110); _boots.setFrame(2); - showBootWindow(); + showBootInset(); } } @@ -1213,7 +3430,7 @@ void Scene930::signal() { _sceneMode = 3; SceneItem::display(930, 95, SET_WIDTH, 312, SET_X, GLOBALS._sceneManager._scene->_sceneBounds.left + 4, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); signal(); @@ -1235,49 +3452,49 @@ void Scene930::dispatch() { SceneExt::dispatch(); } -void Scene930::showBootWindow() { - _bootsWindow.postInit(); - _bootsWindow.setVisage(930); - _bootsWindow.setStrip(3); - _bootsWindow.setFrame2(1); - _bootsWindow.fixPriority(260); - _bootsWindow.setPosition(Common::Point(147, 128)); - _bootsWindow.setDetails(930, 69, 70, 93); +void Scene930::showBootInset() { + _bootsInset.postInit(); + _bootsInset.setVisage(930); + _bootsInset.setStrip(3); + _bootsInset.setFrame2(1); + _bootsInset.fixPriority(260); + _bootsInset.setPosition(Common::Point(147, 128)); + _bootsInset.setDetails(930, 69, 70, 93); } -void Scene930::subF3C07() { - _object2.postInit(); - _object2.setVisage(930); - _object2.setStrip(1); - _object2.setFrame2(2); - _object2.fixPriority(260); - _object2.setPosition(Common::Point(147, 128)); - _object2.setDetails(930, 73, 74, 75); +void Scene930::ShowBoxInset() { + _boxInset.postInit(); + _boxInset.setVisage(930); + _boxInset.setStrip(1); + _boxInset.setFrame2(2); + _boxInset.fixPriority(260); + _boxInset.setPosition(Common::Point(147, 128)); + _boxInset.setDetails(930, 73, 74, 75); } -void Scene930::subF3D6F() { - _object5.postInit(); - _object5.setVisage(930); - _object5.setStrip(3); - if (BF_INVENTORY.getObjectScene(55) == 1) { - _object5.setFrame(_object5.getFrameCount()); - _object5.setDetails(930, 92, 77, -1); - } else if (_v141A == 0) { - _object5.setFrame(2); - _object5.setDetails(930, 93, 77, -1); +void Scene930::ShowSoleInset() { + _soleInset.postInit(); + _soleInset.setVisage(930); + _soleInset.setStrip(3); + if (BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) { + _soleInset.setFrame(_soleInset.getFrameCount()); + _soleInset.setDetails(930, 92, 77, -1); + } else if (!_soleOpened) { + _soleInset.setFrame(2); + _soleInset.setDetails(930, 93, 77, -1); } else { - _object5.setFrame(_object5.getFrameCount()); - _object5.setDetails(930, 76, 77, 78); + _soleInset.setFrame(_soleInset.getFrameCount()); + _soleInset.setDetails(930, 76, 77, 78); } - _object5.fixPriority(260); - _object5.setPosition(Common::Point(147, 128)); + _soleInset.fixPriority(260); + _soleInset.setPosition(Common::Point(147, 128)); } void Scene930::synchronize(Serializer &s) { SceneExt::synchronize(s); - s.syncAsSint16LE(_v141A); - s.syncAsSint16LE(_v141C); + s.syncAsSint16LE(_soleOpened); + s.syncAsSint16LE(_bootInsetDisplayed); } /*-------------------------------------------------------------------------- @@ -1296,7 +3513,7 @@ void Scene935::Action1::signal() { case 1: scene->_visualSpeaker.setText("Jake! Hide in the closet!"); for (int i = 1; i < 21; i++) - scene->sub15E4F((const byte *)&v50EEA, 5 * i, 935, NULL, 0, 255, 249, 255, 1); + scene->transition((const byte *)&v50EEA, 5 * i, 935, NULL, 0, 255, 249, 255, 1); setDelay(3); break; case 2: @@ -1313,7 +3530,7 @@ void Scene935::Action1::signal() { case 4: scene->_visualSpeaker.setText("Jake! Hide in the closet!"); for (int i = 1; i < 21; i++) - scene->sub15E4F((const byte *)&v50F26, 5 * i, 935, NULL, 0, 255, 249, 255, 1); + scene->transition((const byte *)&v50F26, 5 * i, 935, NULL, 0, 255, 249, 255, 1); setDelay(3); break; case 5: @@ -1330,7 +3547,7 @@ void Scene935::Action1::signal() { case 7: scene->_visualSpeaker.setText("Jake! Hide in the closet!"); for (int i = 1; i < 21; i++) - scene->sub15E4F((const byte *)&v50F62, 5 * i, 935, NULL, 0, 255, 249, 255, 1); + scene->transition((const byte *)&v50F62, 5 * i, 935, NULL, 0, 255, 249, 255, 1); setDelay(3); break; case 8: @@ -1424,7 +3641,7 @@ void Scene935::signal() { _sceneMode = 3; setAction(&_sequenceManager, this, 9353, &_object1, &_object2, NULL); break; - default: + default: BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._sceneManager._previousScene); break; } @@ -1435,7 +3652,7 @@ void Scene935::dispatch() { } /*-------------------------------------------------------------------------- - * Scene 940 - ? + * Scene 940 - Jail ending animation * *--------------------------------------------------------------------------*/ @@ -1453,9 +3670,11 @@ void Scene940::Action1::signal() { break; case 2: _actionIndex = 941; - if (BF_GLOBALS.getFlag(fBackupAt340)) + if (BF_GLOBALS.getFlag(fBackupAt340)) { + // WORKAROUND: If the player shot Nico, the alternate text was previously going off-screen + scene->_gameTextSpeaker1._offsetPos.y -= 10; scene->_stripManager.start(9408, this); - else + } else scene->_stripManager.start(9400, this); break; case 5: @@ -1501,7 +3720,7 @@ void Scene940::Action1::signal() { break; case 946: _actionIndex = 942; - setAction(&scene->_sequenceManager1, this, 946, &scene->_object7, &scene->_object8, NULL); + setAction(&scene->_sequenceManager1, this, 946, &scene->_object7, &scene->_object8, NULL); break; case 947: _actionIndex = 5; @@ -1588,7 +3807,7 @@ void Scene940::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._sound1.play(115); BF_GLOBALS._dayNumber = 6; BF_GLOBALS._interfaceY = 200; - BF_GLOBALS._uiElements._active = false; + T2_GLOBALS._uiElements._active = false; _gameTextSpeaker2._speakerName = "SENTTEXT"; _gameTextSpeaker2._color1 = 104; @@ -1670,7 +3889,7 @@ void Scene940::remove() { // clearScren(); BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; SceneExt::remove(); - BF_GLOBALS._uiElements._active = true; + T2_GLOBALS._uiElements._active = true; } } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_scenes9.h b/engines/tsage/blue_force/blueforce_scenes9.h index f4f2c6e779..9ae542c21d 100644 --- a/engines/tsage/blue_force/blueforce_scenes9.h +++ b/engines/tsage/blue_force/blueforce_scenes9.h @@ -43,50 +43,50 @@ class Scene900: public PalettedScene { /* Items */ class Item1: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; class Item4: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; /* Objects */ - class Object1: public NamedObject { + class Gate: public NamedObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; - class Object2: public NamedObjectExt { + class Door: public NamedObjectExt { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; - class Object3: public NamedObjectExt { + class Dog: public NamedObjectExt { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; - class Object6: public NamedObject { + class Lyle: public NamedObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; - class Object7: public NamedObject { + class Body: public NamedObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; /* Actions */ class Action1 : public Action { public: - void signal(); + virtual void signal(); }; class Action2 : public Action { public: - void signal(); + virtual void signal(); }; class Action3 : public Action { public: - void signal(); + virtual void signal(); }; class Action4 : public Action { public: - void signal(); + virtual void signal(); }; public: @@ -95,41 +95,219 @@ public: SpeakerJakeJacket _jakeJacketSpeaker; SpeakerLyleHat _lyleHatSpeaker; Item1 _item1; - Object1 _object1; - Object2 _object2; - Object3 _object3; + Gate _gate; + Door _door; + Dog _dog; NamedHotspot _item2; NamedHotspot _item3; NamedObject _object4; NamedObject _object5; - Object6 _lyle; - Object7 _object7; + Lyle _lyle; + Body _body; Item4 _item4; ASoundExt _sound1; Action1 _action1; Action2 _action2; Action3 _action3; Action4 _action4; - int _field1974; + int _lyleDialogCtr; int _field1976; Scene900(); - void postInit(SceneObjectList *OwnerList = NULL); - void signal(); - void process(Event &event); - void dispatch(); - void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void synchronize(Serializer &s); +}; + +class Scene910: public PalettedScene { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + class Action2 : public Action { + public: + virtual void signal(); + }; + /* Objects */ + class Lyle: public NamedObject { + public: + int _field90; + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + }; + class Nico: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Stuart: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Forbes: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class PowerCord: public NamedObject { + public: + int _field90, _field92; + + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + void init(int val); + + }; + class BreakerBox: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class FakeWall: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Object13: public NamedObject { + protected: + int _state, _mode; + public: + void setupBreaker(int x, int y, int mode, int8 frameNumber); + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class BlackPlug: public Object13 { + public: + void init(int x, int y, int arg8, int8 mode); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class Object25: public NamedObject { + int _field90, _field92; + public: + void setupHiddenSwitch(int x, int y, int arg8, int argA); + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); + }; + + class BreakerBoxInset: public FocusObject { + Object13 _object13, _object14, _object15, _object16, _object17, _object18; + Object13 _object19, _object20, _object21, _object22, _object23, _object24; + Object25 _object25, _object26; + public: + Object13 _object27; + BlackPlug _object28; + virtual Common::String getClassName() { return "Scene910_object12"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + + class PowerButton: public NamedObject { + public: + NamedObject _object32; + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + void init(int frame); + }; + + class GeneratorInset: public FocusObject { + BlackPlug _blackPlug; + PowerButton _powerButton; + public: + virtual Common::String getClassName() { return "Scene910_object29"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + + /* Items */ + class Generator: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item9: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item15: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item16: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item17: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + int _sceneSubMode, _breakerButtonCtr, _field2DE0, _field2DE2, _field2DE4; + Common::Point _destPos; +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerFBI _fbiSpeaker; + SpeakerNico _nicoSpeaker; + SpeakerDA _daSpeaker; + Action1 _action1; + Action2 _action2; + Timer _timer1; + Lyle _lyle; + Nico _nico; + Stuart _stuart; + Forbes _forbes; + NamedObject _object5, _vent, _shadow; + PowerCord _blackCord, _yellowCord; + BreakerBox _breakerBox; + FakeWall _fakeWall; + BreakerBoxInset _breakerBoxInset; + GeneratorInset _generatorInset; + NamedObject _object30, _object31, _object32; + Generator _generator; + Item2 _item2; + Item3 _item3; + NamedHotspot _item4, _item5, _item6, _item7, _item8; + Item9 _item9, _item10; + NamedHotspot _item11, _backWall, _item13, _item14; + Item15 _item15; + Item16 _item16; + Item17 _item17; + ASoundExt _sound1, _sound2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void checkGun(); + void openHiddenDoor(); + void closeHiddenDoor(); }; class Scene920: public SceneExt { /* Items */ class Item1: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; class Item8: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; public: @@ -144,71 +322,73 @@ public: NamedHotspot _item5; NamedHotspot _item6; NamedHotspot _item7; - NamedObject _object1; - NamedObject _object2; - NamedObject _object3; + NamedObject _crateTop; + NamedObject _crateWindow; + NamedObject _doorway; Item8 _exitN; Common::Point _oldCoord; - void postInit(SceneObjectList *OwnerList = NULL); - void signal(); - void process(Event &event); - void dispatch(); - void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void synchronize(Serializer &s); }; class Scene930: public PalettedScene { /* Objects */ class Object1: public NamedObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; class Object2: public FocusObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; class Object3: public NamedObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; class Object4: public FocusObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); }; class Object5: public FocusObject { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); + virtual void remove(); }; /* Items */ class Item1: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; /* Actions */ class Action1 : public Action { public: - void signal(); + virtual void signal(); }; class Action2 : public Action { public: - void signal(); + virtual void signal(); }; class Action3 : public Action { public: - void signal(); + virtual void signal(); }; - void showBootWindow(); - void subF3C07(); - void subF3D6F(); + void showBootInset(); + void ShowBoxInset(); + void ShowSoleInset(); public: SequenceManager _sequenceManager1; Object1 _box; - Object2 _object2; + Object2 _boxInset; Object3 _boots; - Object4 _bootsWindow; - Object5 _object5; - + Object4 _bootsInset; + Object5 _soleInset; + Item1 _item1; NamedHotspot _item2; NamedHotspot _item3; @@ -237,20 +417,20 @@ public: SpeakerGameText gameTextSpeaker; - int _v141A; - int _v141C; + bool _soleOpened; + int _bootInsetDisplayed; - void postInit(SceneObjectList *OwnerList = NULL); - void signal(); - void dispatch(); - void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); + virtual void synchronize(Serializer &s); }; class Scene935: public PalettedScene { /* Actions */ class Action1 : public Action { public: - void signal(); + virtual void signal(); }; public: @@ -261,22 +441,22 @@ public: Action1 _action1; VisualSpeaker _visualSpeaker; - void postInit(SceneObjectList *OwnerList = NULL); - void remove(); - void signal(); - void dispatch(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); }; class Scene940: public SceneExt { /* Items */ class Item1: public NamedHotspot { public: - bool startAction(CursorType action, Event &event); + virtual bool startAction(CursorType action, Event &event); }; /* Actions */ class Action1 : public Action { public: - void signal(); + virtual void signal(); }; public: @@ -308,8 +488,8 @@ public: SpeakerGameText _gameTextSpeaker1; SpeakerGameText _gameTextSpeaker2; - void postInit(SceneObjectList *OwnerList = NULL); - void remove(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); }; } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp index 0f506c7122..8af18b43b8 100644 --- a/engines/tsage/blue_force/blueforce_speakers.cpp +++ b/engines/tsage/blue_force/blueforce_speakers.cpp @@ -965,6 +965,59 @@ SpeakerLyleText::SpeakerLyleText(): VisualSpeaker() { _speakerName = "LYLETEXT"; } +/*--------------------------------------------------------------------------*/ + +SpeakerKate::SpeakerKate(): VisualSpeaker() { + _color1 = 108; + + _speakerName = "KATE"; +} + +void SpeakerKate::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(122); + _object1.setStrip2(8); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(122); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 270, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2._numFrames = 7; + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerTony::SpeakerTony(): VisualSpeaker() { + _color1 = 108; + _color2 = 8; + + _speakerName = "TONY"; +} + +void SpeakerTony::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(132); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 62, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_speakers.h b/engines/tsage/blue_force/blueforce_speakers.h index 932c3c311f..508279a929 100644 --- a/engines/tsage/blue_force/blueforce_speakers.h +++ b/engines/tsage/blue_force/blueforce_speakers.h @@ -337,6 +337,21 @@ public: virtual Common::String getClassName() { return "SpeakerLyleText"; } }; +class SpeakerKate: public VisualSpeaker { +public: + SpeakerKate(); + + virtual Common::String getClassName() { return "SpeakerKate"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerTony: public VisualSpeaker { +public: + SpeakerTony(); + + virtual Common::String getClassName() { return "SpeakerTony"; } + virtual void setText(const Common::String &msg); +}; } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index d86548bd4b..b802f71ff3 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -32,7 +32,7 @@ namespace TsAGE { SequenceManager::SequenceManager() : Action() { - Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL); + Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL); _sequenceData.clear(); _fontNum = 0; _sequenceOffset = 0; @@ -81,7 +81,7 @@ void SequenceManager::remove() { if (g_globals->_sceneObjects->contains(&_sceneText)) _sceneText.remove(); - Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL); + Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL); Action::remove(); } @@ -342,7 +342,7 @@ void SequenceManager::attached(EventHandler *newOwner, EventHandler *endHandler, DEALLOCATE(seqData); - Common::set_to(&_objectList[0], &_objectList[6], (SceneObject *)NULL); + Common::fill(&_objectList[0], &_objectList[6], (SceneObject *)NULL); for (int idx = 0; idx < 6; ++idx) { _objectList[idx] = va_arg(va, SceneObject *); if (!_objectList[idx]) @@ -531,26 +531,52 @@ void ConversationChoiceDialog::draw() { /*--------------------------------------------------------------------------*/ void Obj44::load(const byte *dataP) { - _id = READ_LE_UINT16(dataP); + Common::MemoryReadStream s(dataP, (g_vm->getGameID() == GType_Ringworld2) ? 126 : 68); + + if (g_vm->getGameID() == GType_Ringworld2) { + _mode = s.readSint16LE(); + _lookupValue = s.readSint16LE(); + _lookupIndex = s.readSint16LE(); + _field6 = s.readSint16LE(); + _field8 = s.readSint16LE(); + } + + _id = s.readSint16LE(); for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx) - _field2[idx] = READ_LE_UINT16(dataP + 2 + idx * 2); + _callbackId[idx] = s.readSint16LE(); + + if (g_vm->getGameID() == GType_Ringworld2) { + _field16 = s.readSint16LE(); + s.skip(20); + } else { + s.skip(4); + } - const byte *listP = dataP + 0x10; - for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx, listP += 10) { - _list[idx]._id = READ_LE_UINT16(listP); - _list[idx]._scriptOffset = READ_LE_UINT16(listP + 2); + for (int idx = 0; idx < OBJ0A_LIST_SIZE; ++idx) { + _list[idx]._id = s.readSint16LE(); + _list[idx]._scriptOffset = s.readSint16LE(); + s.skip(6); } - _speakerOffset = READ_LE_UINT16(dataP + 0x42); + _speakerOffset = s.readSint16LE(); } void Obj44::synchronize(Serializer &s) { s.syncAsSint32LE(_id); for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx) - s.syncAsSint32LE(_field2[idx]); - for (int idx = 0; idx < OBJ44_LIST_SIZE; ++idx) + s.syncAsSint32LE(_callbackId[idx]); + for (int idx = 0; idx < OBJ0A_LIST_SIZE; ++idx) _list[idx].synchronize(s); s.syncAsUint32LE(_speakerOffset); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_mode); + s.syncAsSint16LE(_lookupValue); + s.syncAsSint16LE(_lookupIndex); + s.syncAsSint16LE(_field6); + s.syncAsSint16LE(_field8); + s.syncAsSint16LE(_field16); + } } /*--------------------------------------------------------------------------*/ @@ -581,6 +607,11 @@ void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callb owner->setAction(this, owner); } +void StripManager::start3(int stripNum, EventHandler *owner, byte *lookupList) { + _lookupList = lookupList; + start(stripNum, owner, NULL); +} + void StripManager::reset() { _actionIndex = 0; _delayFrames = 0; @@ -614,10 +645,12 @@ void StripManager::load() { // Get the object list byte *obj44List = g_resourceManager->getResource(RES_STRIP, _stripNum, 1); int dataSize = g_vm->_memoryManager.getSize(obj44List); - assert((dataSize % 0x44) == 0); + + int obj44Size = (g_vm->getGameID() == GType_Ringworld2) ? 126 : 68; + assert((dataSize % obj44Size) == 0); byte *dataP = obj44List; - for (int idx = 0; idx < (dataSize / 0x44); ++idx, dataP += 0x44) { + for (int idx = 0; idx < (dataSize / obj44Size); ++idx, dataP += obj44Size) { Obj44 obj; obj.load(dataP); _obj44List.push_back(obj); @@ -703,7 +736,12 @@ void StripManager::signal() { return; } else if (_obj44Index == 10000) { // Reached end of strip + EventHandler *endHandler = _endHandler; remove(); + + if ((g_vm->getGameID() == GType_Ringworld2) && endHandler) + endHandler->signal(); + return; } @@ -714,17 +752,54 @@ void StripManager::signal() { load(); Obj44 &obj44 = _obj44List[_obj44Index]; - _field2E8 = obj44._id; + + if (g_vm->getGameID() != GType_Ringworld2) { + _field2E8 = obj44._id; + } else { + // Return to Ringworld specific handling + if (obj44._field6) + _field2E8 = obj44._field6; + + switch (obj44._mode) { + case 1: + ++_lookupList[obj44._lookupIndex - 1]; + break; + case 2: + --_lookupList[obj44._lookupIndex - 1]; + break; + case 3: + _lookupList[obj44._lookupIndex - 1] = obj44._lookupValue; + break; + default: + break; + } + } + Common::StringArray choiceList; // Build up a list of script entries int idx; - for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) { - if (!obj44._list[idx]._id) - break; - // Get the next one - choiceList.push_back((const char *)&_script[0] + obj44._list[idx]._scriptOffset); + if (g_vm->getGameID() == GType_Ringworld2 && obj44._field16) { + // Special loading mode used in Return to Ringworld + for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) { + int objIndex = _lookupList[obj44._field16 - 1]; + + if (!obj44._list[objIndex]._id) + break; + + // Get the next one + choiceList.push_back((const char *)&_script[0] + obj44._list[objIndex]._scriptOffset); + } + } else { + // Standard choices loading + for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) { + if (!obj44._list[idx]._id) + break; + + // Get the next one + choiceList.push_back((const char *)&_script[0] + obj44._list[idx]._scriptOffset); + } } int strIndex = 0; @@ -754,10 +829,10 @@ void StripManager::signal() { if (_callbackObject) { for (idx = 0; idx < OBJ44_LIST_SIZE; ++idx) { - if (!obj44._field2[idx]) + if (!obj44._callbackId[idx]) break; - _callbackObject->stripCallback(obj44._field2[idx]); + _callbackObject->stripCallback(obj44._callbackId[idx]); } } diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h index f82c07a7dd..0c4eb9539d 100644 --- a/engines/tsage/converse.h +++ b/engines/tsage/converse.h @@ -178,13 +178,19 @@ public: }; #define OBJ44_LIST_SIZE 5 +#define OBJ0A_LIST_SIZE ((g_vm->getGameID() == GType_Ringworld2) ? 8 : 5) class Obj44 : public Serialisable { public: int _id; - int _field2[OBJ44_LIST_SIZE]; - Obj0A _list[OBJ44_LIST_SIZE]; + int _callbackId[OBJ44_LIST_SIZE]; + Obj0A _list[8]; uint _speakerOffset; + + // Return to Ringworld specific field + int _mode; + int _lookupValue, _lookupIndex, _field6; + int _field8, _field16; public: void load(const byte *dataP); virtual void synchronize(Serializer &s); @@ -215,6 +221,9 @@ public: Common::Array<byte> _script; StripProc _onBegin; StripProc _onEnd; + + // Ringworld 2 specific fields + byte *_lookupList; public: StripManager(); virtual ~StripManager(); @@ -225,6 +234,7 @@ public: virtual void process(Event &event); void start(int stripNum, EventHandler *owner, StripCallback *callback = NULL); + void start3(int stripNum, EventHandler *owner, byte *lookupList); void setCallback(StripCallback *callback) { _callbackObject = callback; } void setColors(int stdColor, int highlightColor) { _choiceDialog.setColors(stdColor, highlightColor); } void setFontNumber(int fontNum) { _choiceDialog.setFontNumber(fontNum); } diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index c237548547..9d7c8abf0a 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -66,9 +66,19 @@ InvObject::InvObject(int visage, int strip, int frame) { _iconResNum = 10; } +InvObject::InvObject(int strip, int frame) { + assert(g_vm->getGameID() == GType_Ringworld2); + _strip = strip; + _frame = frame; + + _visage = 7; + _sceneNumber = 0; + _iconResNum = 10; +} + void InvObject::setCursor() { - if (g_vm->getGameID() == GType_BlueForce) { - // Blue Force cursor handling + if (g_vm->getGameID() != GType_Ringworld) { + // All other games _cursorId = (CursorType)BF_GLOBALS._inventory->indexOf(this); g_globals->_events.setCursor(_cursorId); } else { @@ -84,6 +94,10 @@ void InvObject::setCursor() { } } +bool InvObject::inInventory() const { + return _sceneNumber == ((g_vm->getGameID() != GType_Ringworld2) ? 1 : g_globals->_player._characterIndex); +} + /*--------------------------------------------------------------------------*/ InvObjectList::InvObjectList() { @@ -886,24 +900,28 @@ int PlayerMover::calculateRestOfRoute(int *routeList, int srcRegion, int destReg // Check every connected region until we find a route to the destination (or we have no more to check). int bestDistance = 31990; while (((currDest = g_globals->_walkRegions._idxList[srcWalkRegion._idxListIndex + foundIndex]) != 0) && (!foundRoute)) { - int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute); + // Only check the region if it isn't in the list of explicitly disabled regions + if (!contains(g_globals->_walkRegions._disabledRegions, (int)currDest)) { + int newDistance = calculateRestOfRoute(tempList, currDest, destRegion, foundRoute); - if ((newDistance <= bestDistance) || foundRoute) { - // We found a shorter possible route, or one leading to the destination. + if ((newDistance <= bestDistance) || foundRoute) { + // We found a shorter possible route, or one leading to the destination. - // Overwrite the route with this new one. - routeList[0] = ourListSize - 1; + // Overwrite the route with this new one. + routeList[0] = ourListSize - 1; + + for (int i = ourListSize; i <= tempList[0]; ++i) { + routeList[i] = tempList[i]; + ++routeList[0]; + } - for (int i = ourListSize; i <= tempList[0]; ++i) { - routeList[i] = tempList[i]; - ++routeList[0]; + bestDistance = newDistance; } - bestDistance = newDistance; + // Truncate our local list to the size it was before the call. + tempList[0] = ourListSize; } - // Truncate our local list to the size it was before the call. - tempList[0] = ourListSize; ++foundIndex; } @@ -1047,6 +1065,8 @@ PaletteRotation::PaletteRotation() : PaletteModifierCached() { _percent = 0; _delayCtr = 0; _frameNumber = g_globals->_events.getFrameNumber(); + _idxChange = 1; + _countdown = 0; } void PaletteRotation::synchronize(Serializer &s) { @@ -1060,14 +1080,24 @@ void PaletteRotation::synchronize(Serializer &s) { s.syncAsSint32LE(_rotationMode); s.syncAsSint32LE(_duration); s.syncBytes(&_palette[0], 256 * 3); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_idxChange); + s.syncAsSint16LE(_countdown); + } } void PaletteRotation::signal() { + if (_countdown > 0) { + --_countdown; + return; + } + if (_delayCtr) { uint32 frameNumber = g_globals->_events.getFrameNumber(); if (frameNumber >= _frameNumber) { - _delayCtr = frameNumber - _frameNumber; + _delayCtr -= frameNumber - _frameNumber; _frameNumber = frameNumber; if (_delayCtr < 0) @@ -1084,21 +1114,24 @@ void PaletteRotation::signal() { bool flag = true; switch (_rotationMode) { case -1: - if (--_currIndex < _start) { + _currIndex -= _idxChange; + if (_currIndex < _start) { flag = decDuration(); if (flag) _currIndex = _end - 1; } break; case 1: - if (++_currIndex >= _end) { + _currIndex += _idxChange; + if (_currIndex >= _end) { flag = decDuration(); if (flag) _currIndex = _start; } break; case 2: - if (++_currIndex >= _end) { + _currIndex += _idxChange; + if (_currIndex >= _end) { flag = decDuration(); if (flag) { _currIndex = _end - 2; @@ -1107,7 +1140,8 @@ void PaletteRotation::signal() { } break; case 3: - if (--_currIndex < _start) { + _currIndex -= _idxChange; + if (_currIndex < _start) { flag = decDuration(); if (flag) { _currIndex = _start + 1; @@ -1130,7 +1164,9 @@ void PaletteRotation::signal() { void PaletteRotation::remove() { Action *action = _action; - g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start); + + if (_idxChange) + g_system->getPaletteManager()->setPalette((const byte *)&_palette[_start * 3], _start, _end - _start); _scenePalette->_listeners.remove(this); @@ -1285,6 +1321,15 @@ void ScenePalette::setPalette(int index, int count) { } /** + * Get a palette entry + */ +void ScenePalette::getEntry(int index, uint *r, uint *g, uint *b) { + *r = _palette[index * 3]; + *g = _palette[index * 3 + 1]; + *b = _palette[index * 3 + 2]; +} + +/** * Set a palette entry */ void ScenePalette::setEntry(int index, uint r, uint g, uint b) { @@ -1424,8 +1469,8 @@ void ScenePalette::changeBackground(const Rect &bounds, FadeMode fadeMode) { } Rect tempRect = bounds; - if (g_vm->getGameID() == GType_BlueForce) - tempRect.setHeight(BF_GLOBALS._interfaceY); + if (g_vm->getGameID() != GType_Ringworld) + tempRect.setHeight(T2_GLOBALS._interfaceY); g_globals->_screenSurface.copyFrom(g_globals->_sceneManager._scene->_backSurface, tempRect, Rect(0, 0, tempRect.width(), tempRect.height()), NULL); @@ -1523,20 +1568,20 @@ void SceneItem::display(int resNum, int lineNum, ...) { Common::String msg = (!resNum || (resNum == -1)) ? Common::String() : g_resourceManager->getMessage(resNum, lineNum); - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.hide(); + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); if (g_globals->_sceneObjects->contains(&g_globals->_sceneText)) { g_globals->_sceneText.remove(); g_globals->_sceneObjects->draw(); } - GfxFontBackup font; Common::Point pos(160, 100); Rect textRect; int maxWidth = 120; bool keepOnscreen = false; - bool centerText = g_vm->getGameID() == GType_Ringworld; + bool centerText = g_vm->getGameID() != GType_BlueForce; + Common::List<int> playList; if (resNum != 0) { va_list va; @@ -1545,6 +1590,17 @@ void SceneItem::display(int resNum, int lineNum, ...) { if (resNum == -1) msg = Common::String(va_arg(va, const char *)); + if (g_vm->getGameID() == GType_Ringworld2) { + // Pre-process the string for any sound information + while (msg.hasPrefix("!")) { + msg.deleteChar(0); + playList.push_back(atoi(msg.c_str())); + + while (!msg.empty() && (*msg.c_str() >= '0' && *msg.c_str() <= '9')) + msg.deleteChar(0); + } + } + int mode; do { // Get next instruction @@ -1618,10 +1674,14 @@ void SceneItem::display(int resNum, int lineNum, ...) { if (resNum) { // Get required bounding size - g_globals->gfxManager().getStringBounds(msg.c_str(), textRect, maxWidth); - textRect.center(pos.x, pos.y); + GfxFont font; + font.setFontNumber(g_globals->_sceneText._fontNumber); + font.getStringBounds(msg.c_str(), textRect, maxWidth); + // Center the text at the specified position, and then constrain it to be- + textRect.center(pos.x, pos.y); textRect.contain(g_globals->gfxManager()._bounds); + if (centerText) { g_globals->_sceneText._color1 = g_globals->_sceneText._color2; g_globals->_sceneText._color2 = 0; @@ -1652,12 +1712,18 @@ void SceneItem::display(int resNum, int lineNum, ...) { g_system->delayMillis(10); } + // For Return to Ringworld, play the voice overs in sequence + if ((g_vm->getGameID() == GType_Ringworld2) && !playList.empty() && !R2_GLOBALS._playStream.isPlaying()) { + R2_GLOBALS._playStream.play(*playList.begin(), NULL); + playList.pop_front(); + } + g_globals->_sceneText.remove(); } - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) { + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) { // Show user interface - BF_GLOBALS._uiElements.show(); + T2_GLOBALS._uiElements.show(); // Re-show the cursor BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); @@ -1665,14 +1731,22 @@ void SceneItem::display(int resNum, int lineNum, ...) { } void SceneItem::display2(int resNum, int lineNum) { - if (g_vm->getGameID() == GType_BlueForce) + switch (g_vm->getGameID()) { + case GType_BlueForce: display(resNum, lineNum, SET_WIDTH, 312, SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); - else + break; + case GType_Ringworld2: + display(resNum, lineNum, SET_WIDTH, 280, SET_X, 160, SET_Y, 20, SET_POS_MODE, ALIGN_CENTER, + SET_EXT_BGCOLOR, 60, LIST_END); + break; + default: display(resNum, lineNum, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + break; + } } void SceneItem::display(const Common::String &msg) { @@ -1681,7 +1755,7 @@ void SceneItem::display(const Common::String &msg) { display(-1, -1, msg.c_str(), SET_WIDTH, 312, SET_X, 4 + GLOBALS._sceneManager._scene->_sceneBounds.left, - SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + BF_INTERFACE_Y + 2, + SET_Y, GLOBALS._sceneManager._scene->_sceneBounds.top + UI_INTERFACE_Y + 2, SET_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, SET_EXT_FGCOLOR, 13, LIST_END); } @@ -1689,13 +1763,15 @@ void SceneItem::display(const Common::String &msg) { /*--------------------------------------------------------------------------*/ bool SceneHotspot::startAction(CursorType action, Event &event) { - if (g_vm->getGameID() != GType_BlueForce) - return SceneItem::startAction(action, event); - else { + switch (g_vm->getGameID()) { + case GType_BlueForce: { BlueForce::SceneExt *scene = (BlueForce::SceneExt *)BF_GLOBALS._sceneManager._scene; assert(scene); return scene->display(action); } + default: + return SceneItem::startAction(action, event); + } } void SceneHotspot::doAction(int action) { @@ -1731,109 +1807,6 @@ void SceneHotspot::doAction(int action) { /*--------------------------------------------------------------------------*/ -NamedHotspot::NamedHotspot() : SceneHotspot() { - _resNum = 0; - _lookLineNum = _useLineNum = _talkLineNum = -1; -} - -bool NamedHotspot::startAction(CursorType action, Event &event) { - switch (action) { - case CURSOR_WALK: - // Nothing - return false; - case CURSOR_LOOK: - if (_lookLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) - SceneItem::display2(_resNum, _lookLineNum); - else - SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - case CURSOR_USE: - if (_useLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) - SceneItem::display2(_resNum, _useLineNum); - else - SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); - return true; - case CURSOR_TALK: - if (_talkLineNum == -1) - SceneHotspot::doAction(action); - else if (g_vm->getGameID() == GType_BlueForce) - SceneItem::display2(_resNum, _talkLineNum); - else - SceneItem::display2(_resNum, _talkLineNum); - return true; - default: - return SceneHotspot::startAction(action, event); - } -} - -void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { - setBounds(ys, xe, ye, xs); - _resNum = resnum; - _lookLineNum = lookLineNum; - _useLineNum = useLineNum; - _talkLineNum = -1; - g_globals->_sceneItems.addItems(this, NULL); -} - -void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { - setBounds(bounds); - _resNum = resNum; - _lookLineNum = lookLineNum; - _talkLineNum = talkLineNum; - _useLineNum = useLineNum; - - switch (mode) { - case 2: - g_globals->_sceneItems.push_front(this); - break; - case 4: - g_globals->_sceneItems.addBefore(item, this); - break; - case 5: - g_globals->_sceneItems.addAfter(item, this); - break; - default: - g_globals->_sceneItems.push_back(this); - break; - } -} - -void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { - _sceneRegionId = sceneRegionId; - _resNum = resNum; - _lookLineNum = lookLineNum; - _talkLineNum = talkLineNum; - _useLineNum = useLineNum; - - // Handle adding hotspot to scene items list as necessary - switch (mode) { - case 2: - GLOBALS._sceneItems.push_front(this); - break; - case 3: - break; - default: - GLOBALS._sceneItems.push_back(this); - break; - } -} - -void NamedHotspot::synchronize(Serializer &s) { - SceneHotspot::synchronize(s); - s.syncAsSint16LE(_resNum); - s.syncAsSint16LE(_lookLineNum); - s.syncAsSint16LE(_useLineNum); - - if (g_vm->getGameID() == GType_BlueForce) - s.syncAsSint16LE(_talkLineNum); -} - -/*--------------------------------------------------------------------------*/ - void SceneObjectWrapper::setSceneObject(SceneObject *so) { _sceneObject = so; so->_strip = 1; @@ -1907,7 +1880,6 @@ SceneObject::SceneObject() : SceneHotspot() { _moveDiff.x = 5; _moveDiff.y = 3; _numFrames = 10; - _numFrames = 10; _moveRate = 10; _regionBitList = 0; _sceneRegionId = 0; @@ -1919,6 +1891,8 @@ SceneObject::SceneObject() : SceneHotspot() { _visage = 0; _strip = 0; _frame = 0; + _effect = 0; + _shade = 0; } SceneObject::SceneObject(const SceneObject &so) : SceneHotspot() { @@ -2135,7 +2109,7 @@ int SceneObject::checkRegion(const Common::Point &pt) { if ((objYDiff >= yPos) && (objYDiff <= newY) && ((*i)->_xs < tempRect.right) && ((*i)->_xe > tempRect.left)) { // Found index - regionIndex = -1; //****DEBUG*** = *i; + regionIndex = (*i)->_regionIndex; break; } } @@ -2221,6 +2195,14 @@ SceneObject *SceneObject::clone() const { return obj; } +void SceneObject::copy(SceneObject *src) { + *this = *src; + + _objectWrapper = NULL; + _mover = NULL; + _endAction = NULL; +} + void SceneObject::checkAngle(const SceneObject *obj) { checkAngle(obj->_position); } @@ -2287,6 +2269,11 @@ void SceneObject::synchronize(Serializer &s) { s.syncAsSint32LE(_moveRate); SYNC_POINTER(_endAction); s.syncAsUint32LE(_regionBitList); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_effect); + s.syncAsSint16LE(_shade); + } } void SceneObject::postInit(SceneObjectList *OwnerList) { @@ -2496,6 +2483,11 @@ void SceneObject::updateScreen() { srcRect.right = ((srcRect.right + 3) / 4) * 4; srcRect.clip(g_globals->_sceneManager._scene->_sceneBounds); + if (g_vm->getGameID() != GType_Ringworld) { + if (T2_GLOBALS._uiElements._visible) + srcRect.bottom = MIN<int16>(srcRect.bottom, T2_GLOBALS._interfaceY); + } + if (srcRect.isValidRect()) { Rect destRect = srcRect; destRect.translate(-sceneBounds.left, -sceneBounds.top); @@ -2526,6 +2518,13 @@ void SceneObject::setup(int visage, int stripFrameNum, int frameNum, int posX, i fixPriority(priority); } +void SceneObject::setup(int visage, int stripFrameNum, int frameNum) { + postInit(); + setVisage(visage); + setStrip(stripFrameNum); + setFrame(frameNum); +} + /*--------------------------------------------------------------------------*/ void BackgroundSceneObject::postInit(SceneObjectList *OwnerList) { @@ -2662,43 +2661,48 @@ void SceneObjectList::draw() { } g_globals->_paneRegions[paneNum].setRect(0, 0, 0, 0); -redraw: - // Main draw loop - for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { - SceneObject *obj = objList[objIndex]; - - if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) { - obj->_paneRects[paneNum] = obj->_bounds; - obj->draw(); + + // FIXME: Currently, removing objects causes screen flickers when the removed object intersects + // another drawn object, since the background is briefly redrawn over the object. For now, I'm + // using a forced jump back to redraw objects. In the long term, I should figure out how the + // original game does this properly + bool redrawFlag = true; + while (redrawFlag) { + redrawFlag = false; + + // Main draw loop + for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { + SceneObject *obj = objList[objIndex]; + + if ((obj->_flags & flagMask) && !(obj->_flags & OBJFLAG_HIDE)) { + obj->_paneRects[paneNum] = obj->_bounds; + obj->draw(); + } } - } - // Update the palette - g_globals->_sceneManager.fadeInIfNecessary(); - g_globals->_sceneManager._loadMode = 0; - g_globals->_paneRefreshFlag[paneNum] = 0; - - // Loop through the object list, removing any objects and refreshing the screen as necessary - for (uint objIndex = 0; objIndex < objList.size(); ++objIndex) { - SceneObject *obj = objList[objIndex]; - - if (obj->_flags & OBJFLAG_HIDE) - obj->_flags |= OBJFLAG_HIDING; - obj->_flags &= ~flagMask; - if (obj->_flags & OBJFLAG_REMOVE) { - obj->_flags |= OBJFLAG_PANES; - - checkIntersection(objList, objIndex, CURRENT_PANENUM); - - obj->updateScreen(); - obj->removeObject(); - - // FIXME: Currently, removing objects causes screen flickers when the removed object intersects - // another drawn object, since the background is briefly redrawn over the object. For now, I'm - // using a forced jump back to redraw objects. In the long term, I should figure out how the - // original game does this properly - objList.remove_at(objIndex); - goto redraw; + // Update the palette + g_globals->_sceneManager.fadeInIfNecessary(); + g_globals->_sceneManager._loadMode = 0; + g_globals->_paneRefreshFlag[paneNum] = 0; + + // Loop through the object list, removing any objects and refreshing the screen as necessary + for (uint objIndex = 0; objIndex < objList.size() && !redrawFlag; ++objIndex) { + SceneObject *obj = objList[objIndex]; + + if (obj->_flags & OBJFLAG_HIDE) + obj->_flags |= OBJFLAG_HIDING; + obj->_flags &= ~flagMask; + if (obj->_flags & OBJFLAG_REMOVE) { + obj->_flags |= OBJFLAG_PANES; + + checkIntersection(objList, objIndex, CURRENT_PANENUM); + + obj->updateScreen(); + obj->removeObject(); + + objList.remove_at(objIndex); + redrawFlag = true; + } } } } @@ -2807,6 +2811,7 @@ SceneText::SceneText() : SceneObject() { _fontNumber = 2; _width = 160; _textMode = ALIGN_LEFT; + _color1 = 0; _color2 = 0; _color3 = 0; } @@ -2867,8 +2872,8 @@ void SceneText::synchronize(Serializer &s) { void SceneText::updateScreen() { // FIXME: Hack for Blue Force to handle not refreshing the screen if the user interface // has been re-activated after showing some scene text - if ((g_vm->getGameID() != GType_BlueForce) || (_bounds.top < BF_INTERFACE_Y) || - !BF_GLOBALS._uiElements._visible) + if ((g_vm->getGameID() == GType_Ringworld) || (_bounds.top < UI_INTERFACE_Y) || + !T2_GLOBALS._uiElements._visible) SceneObject::updateScreen(); } @@ -2909,7 +2914,7 @@ void Visage::setVisage(int resNum, int rlbNum) { // In Ringworld, we immediately get the data _data = g_resourceManager->getResource(RES_VISAGE, resNum, rlbNum); } else { - // Blue Force has an extra indirection via the visage index file + // Games after Ringworld have an extra indirection via the visage index file byte *indexData = g_resourceManager->getResource(RES_VISAGE, resNum, 9999); if (rlbNum == 9999) { _data = indexData; @@ -2917,6 +2922,11 @@ void Visage::setVisage(int resNum, int rlbNum) { if (rlbNum == 0) rlbNum = 1; + // Check how many slots there are + uint16 count = READ_LE_UINT16(indexData); + if (rlbNum > count) + rlbNum = count; + // Get the flags/rlbNum to use uint32 v = READ_LE_UINT32(indexData + (rlbNum - 1) * 4 + 2); int flags = v >> 30; @@ -2977,6 +2987,16 @@ Player::Player(): SceneObject() { _enabled = false; _uiEnabled = false; _field8C = 0; + + // Return to Ringworld specific fields + _characterIndex = R2_NONE; + + for (int i = 0; i < MAX_CHARACTERS; ++i) { + _characterScene[i] = 0; + _characterStrip[i] = 0; + _characterFrame[i] = 0; + _oldCharacterScene[i] = 0; + } } void Player::postInit(SceneObjectList *OwnerList) { @@ -2986,8 +3006,25 @@ void Player::postInit(SceneObjectList *OwnerList) { _uiEnabled = true; _percent = 100; _field8C = 10; - _moveDiff.x = 4; - _moveDiff.y = 2; + + if (g_vm->getGameID() != GType_Ringworld2) + { + _moveDiff.x = 4; + _moveDiff.y = 2; + } + else + { + _moveDiff.x = 3; + _moveDiff.y = 2; + _effect = 1; + _shade = 0; + + setObjectWrapper(new SceneObjectWrapper()); + setPosition(_characterPos[_characterIndex]); + setStrip(_characterStrip[_characterIndex]); + setFrame(_characterFrame[_characterIndex]); + _characterScene[_characterIndex] = GLOBALS._sceneManager._sceneNumber; + } } void Player::disableControl() { @@ -2996,16 +3033,29 @@ void Player::disableControl() { g_globals->_events.setCursor(CURSOR_NONE); _enabled = false; - if ((g_vm->getGameID() == GType_BlueForce) && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.hide(); + if ((g_vm->getGameID() != GType_Ringworld) && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.hide(); } void Player::enableControl() { + CursorType cursor; + _canWalk = true; _uiEnabled = true; _enabled = true; - if (g_vm->getGameID() == GType_Ringworld) { + switch (g_vm->getGameID()) { + case GType_BlueForce: + case GType_Ringworld2: + cursor = g_globals->_events.getCursor(); + g_globals->_events.setCursor(cursor); + + if (T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); + break; + + default: + // Ringworld g_globals->_events.setCursor(CURSOR_WALK); switch (g_globals->_events.getCursor()) { @@ -3019,15 +3069,15 @@ void Player::enableControl() { g_globals->_events.setCursor(CURSOR_WALK); break; } - } else { - CursorType cursor = g_globals->_events.getCursor(); - g_globals->_events.setCursor(cursor); - - if (BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.show(); + break; } } +void Player::enableControl(CursorType cursor) { + enableControl(); + R2_GLOBALS._events.setCursor(cursor); +} + void Player::process(Event &event) { if ((g_vm->getGameID() != GType_Ringworld) && _action) _action->process(event); @@ -3036,7 +3086,7 @@ void Player::process(Event &event) { (g_globals->_events.getCursor() == CURSOR_WALK) && g_globals->_player._canWalk && (_position != event.mousePos) && g_globals->_sceneObjects->contains(this)) { - if ((g_vm->getGameID() == GType_BlueForce) && !BF_GLOBALS._player._enabled) + if ((g_vm->getGameID() != GType_Ringworld) && !BF_GLOBALS._player._enabled) return; PlayerMover *newMover = new PlayerMover(); @@ -3055,8 +3105,20 @@ void Player::synchronize(Serializer &s) { s.syncAsByte(_uiEnabled); s.syncAsSint16LE(_field8C); - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() != GType_Ringworld) s.syncAsByte(_enabled); + + if (g_vm->getGameID() == GType_Ringworld2) { + s.syncAsSint16LE(_characterIndex); + for (int i = 0; i < MAX_CHARACTERS; ++i) { + s.syncAsSint16LE(_characterScene[i]); + s.syncAsSint16LE(_oldCharacterScene[i]); + s.syncAsSint16LE(_characterPos[i].x); + s.syncAsSint16LE(_characterPos[i].y); + s.syncAsSint16LE(_characterStrip[i]); + s.syncAsSint16LE(_characterFrame[i]); + } + } } /*--------------------------------------------------------------------------*/ @@ -3498,6 +3560,7 @@ void WalkRegions::clear() { _field18.clear(); _idxList.clear(); _idxList2.clear(); + _disabledRegions.clear(); } void WalkRegions::load(int sceneNum) { @@ -3670,6 +3733,39 @@ int WalkRegions::indexOf(const Common::Point &pt, const Common::List<int> *index return -1; } +void WalkRegions::synchronize(Serializer &s) { + // Synchronise the list of disabled regions as a list of values terminated with a '-1' + int regionId = 0; + if (s.isLoading()) { + _disabledRegions.clear(); + + s.syncAsSint16LE(regionId); + while (regionId != -1) { + _disabledRegions.push_back(regionId); + s.syncAsSint16LE(regionId); + } + } else { + Common::List<int>::iterator i; + for (i = _disabledRegions.begin(); i != _disabledRegions.end(); ++i) { + regionId = *i; + s.syncAsSint16LE(regionId); + } + + regionId = -1; + s.syncAsSint16LE(regionId); + } +} + +void WalkRegions::disableRegion(int regionId) { + if (!contains(_disabledRegions, regionId)) + _disabledRegions.push_back(regionId); +} + +void WalkRegions::enableRegion(int regionId) { + _disabledRegions.remove(regionId); +} + + /*--------------------------------------------------------------------------*/ void ScenePriorities::load(int resNum) { @@ -3848,8 +3944,32 @@ void SceneHandler::process(Event &event) { g_vm->_debugger->onFrame(); } + if ((event.eventType == EVENT_KEYPRESS) && g_globals->_player._enabled && g_globals->_player._canWalk) { + // Keyboard shortcuts for different actions + switch (event.kbd.keycode) { + case Common::KEYCODE_w: + g_globals->_events.setCursor(CURSOR_WALK); + event.handled = true; + break; + case Common::KEYCODE_l: + g_globals->_events.setCursor(CURSOR_LOOK); + event.handled = true; + break; + case Common::KEYCODE_u: + g_globals->_events.setCursor(CURSOR_USE); + event.handled = true; + break; + case Common::KEYCODE_t: + g_globals->_events.setCursor(CURSOR_TALK); + event.handled = true; + break; + default: + break; + } + } + // Mouse press handling - bool enabled = (g_vm->getGameID() == GType_BlueForce) ? g_globals->_player._enabled : + bool enabled = (g_vm->getGameID() != GType_Ringworld) ? g_globals->_player._enabled : g_globals->_player._uiEnabled; if (enabled && (event.eventType == EVENT_BUTTON_DOWN) && !g_globals->_sceneItems.empty()) { // Check if the mouse is on the player @@ -3881,7 +4001,7 @@ void SceneHandler::process(Event &event) { g_globals->_events.setCursor(CURSOR_USE); } - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() != GType_Ringworld) event.handled = true; } else if (g_vm->getGameID() != GType_Ringworld) { event.handled = true; @@ -3937,7 +4057,7 @@ void SceneHandler::dispatch() { do { process(event); } while (g_globals->_events.getEvent(event)); - } else if (g_vm->getGameID() == GType_BlueForce) { + } else if (g_vm->getGameID() != GType_Ringworld) { // For Blue Force, 'none' events need to be generated in the absence of any event.eventType = EVENT_NONE; event.mousePos = g_globals->_events._mousePos; diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 5d26b14265..cbd3d9f77c 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -62,8 +62,9 @@ public: public: InvObject(int sceneNumber, int rlbNum, int cursorNum, CursorType cursorId, const Common::String description); InvObject(int visage, int strip, int frame); + InvObject(int visage, int strip); - bool inInventory() const { return _sceneNumber == 1; } + bool inInventory() const; void setCursor(); virtual Common::String getClassName() { return "InvObject"; } @@ -128,7 +129,7 @@ public: virtual void dispatch(); virtual void setAction(Action *action) { setAction(action, NULL); } virtual void setAction(Action *action, EventHandler *endHandler, ...); - virtual void destroy() {}; + virtual void destroy() {} }; class Action : public EventHandler { @@ -321,6 +322,8 @@ public: int _end; int _rotationMode; int _duration; + int _idxChange; + int _countdown; public: PaletteRotation(); @@ -371,6 +374,7 @@ public: bool loadPalette(int paletteNum); void refresh(); void setPalette(int index, int count); + void getEntry(int index, uint *r, uint *g, uint *b); void setEntry(int index, uint r, uint g, uint b); uint8 indexOf(uint r, uint g, uint b, int threshold = 0xffff); void getPalette(int start = 0, int count = 256); @@ -417,6 +421,7 @@ public: virtual void destroy() {} virtual bool startAction(CursorType action, Event &event); virtual void doAction(int action); + virtual bool performAction(CursorType action, Event &event) { return startAction(action, event); } bool contains(const Common::Point &pt); void setBounds(const Rect &newBounds) { _bounds = newBounds; } @@ -445,32 +450,6 @@ public: virtual void doAction(int action); }; -class NamedHotspot : public SceneHotspot { -public: - int _resNum, _lookLineNum, _useLineNum, _talkLineNum; - NamedHotspot(); - - - virtual bool startAction(CursorType action, Event &event); - virtual Common::String getClassName() { return "NamedHotspot"; } - virtual void synchronize(Serializer &s); - virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); - virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); - 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 @@ -555,6 +534,10 @@ public: int _moveRate; Action *_endAction; uint32 _regionBitList; + + // Ringworld 2 specific fields + int _shade; + int _effect; public: SceneObject(); SceneObject(const SceneObject &so); @@ -602,8 +585,11 @@ public: // New methods introduced by Blue Force virtual void updateAngle(const Common::Point &pt); virtual void changeAngle(int angle); + // New methods introduced by Ringworld 2 + virtual void copy(SceneObject *src); void setup(int visage, int stripFrameNum, int frameNum, int posX, int posY, int priority); + void setup(int visage, int stripFrameNum, int frameNum); }; class BackgroundSceneObject: public SceneObject { @@ -634,12 +620,23 @@ public: virtual void updateScreen(); }; +#define MAX_CHARACTERS 4 +enum R2RCharacter { R2_NONE = 0, R2_QUINN = 1, R2_SEEKER = 2, R2_MIRANDA = 3 }; + class Player : public SceneObject { public: bool _canWalk; bool _uiEnabled; int _field8C; bool _enabled; + + // Return to Ringworld specific fields + R2RCharacter _characterIndex; + int _characterScene[MAX_CHARACTERS]; + int _oldCharacterScene[MAX_CHARACTERS]; + Common::Point _characterPos[MAX_CHARACTERS]; + int _characterStrip[MAX_CHARACTERS]; + int _characterFrame[MAX_CHARACTERS]; public: Player(); @@ -650,6 +647,7 @@ public: void disableControl(); void enableControl(); + void enableControl(CursorType cursor); }; /*--------------------------------------------------------------------------*/ @@ -825,8 +823,11 @@ public: Common::Array<WRField18> _field18; Common::Array<int> _idxList; Common::Array<int> _idxList2; + Common::List<int> _disabledRegions; public: WalkRegions() { _resNum = -1; } + virtual ~WalkRegions() {} + virtual void synchronize(Serializer &s); void clear(); void load(int sceneNum); @@ -835,8 +836,8 @@ public: assert((idx >= 1) && (idx <= (int)_regionList.size())); return _regionList[idx - 1]; } - void proc1(int v) { warning("TODO: WalkRegions::proc1"); } - void proc2(int v) { warning("TODO: WalkRegions::proc2"); } + void disableRegion(int regionId); + void enableRegion(int regionId); }; /*--------------------------------------------------------------------------*/ diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index a0e8b9edba..f7ba5c20f2 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -24,6 +24,8 @@ #include "tsage/globals.h" #include "tsage/graphics.h" #include "tsage/ringworld/ringworld_logic.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/ringworld2/ringworld2_logic.h" namespace TsAGE { @@ -95,6 +97,10 @@ bool Debugger::Cmd_WalkRegions(int argc, const char **argv) { for (uint regionIndex = 0; regionIndex < g_globals->_walkRegions._regionList.size(); ++regionIndex, ++color) { WalkRegion &wr = g_globals->_walkRegions._regionList[regionIndex]; + // Skip the region if it's in the list of explicitly disabled regions + if (contains(g_globals->_walkRegions._disabledRegions, (int)regionIndex + 1)) + continue; + for (int yp = wr._bounds.top; yp < wr._bounds.bottom; ++yp) { LineSliceSet sliceSet = wr.getLineSlices(yp); @@ -269,10 +275,88 @@ bool Debugger::Cmd_ClearFlag(int argc, const char **argv) { return true; } +/** + * Show any active hotspot areas in the scene + */ +bool Debugger::Cmd_Hotspots(int argc, const char **argv) { + int colIndex = 16; + const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; + + // Lock the background surface for access + Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); + + // Iterate through the scene items + SynchronizedList<SceneItem *>::iterator i; + for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) { + SceneItem *o = *i; + + // Draw the contents of the hotspot area + if (o->_sceneRegionId == 0) { + // Scene item doesn't use a region, so fill in the entire area + if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top)) + destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top, + o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex); + } else { + // Scene uses a region, so get it and use it to fill out only the correct parts + SceneRegions::iterator ri = g_globals->_sceneRegions.begin(); + while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId)) + ++ri; + + if (ri != g_globals->_sceneRegions.end()) { + // Fill out the areas defined by the region + Region &r = *ri; + + for (int y = r._bounds.top; y < r._bounds.bottom; ++y) { + LineSliceSet set = r.getLineSlices(y); + + for (uint p = 0; p < set.items.size(); ++p) + destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, + set.items[p].xe - sceneBounds.left - 1, colIndex); + } + } + } + } + + // Release the surface + g_globals->_sceneManager._scene->_backSurface.unlockSurface(); + + // Mark the scene as requiring a full redraw + g_globals->_paneRefreshFlag[0] = 2; + + return false; +} + +/** + * Play the specified sound + */ +bool Debugger::Cmd_Sound(int argc, const char **argv) { + if (argc != 2) { + DebugPrintf("Usage: %s <sound number>\n", argv[0]); + return true; + } + + int soundNum = strToInt(argv[1]); + g_globals->_soundHandler.play(soundNum); + return false; +} + +/* + * This command lists the objects available, and their ID + */ +bool DemoDebugger::Cmd_ListObjects(int argc, const char **argv) { + DebugPrintf("Not available in Demo\n"); + return true; +} + +bool DemoDebugger::Cmd_MoveObject(int argc, const char **argv) { + DebugPrintf("Not available in Demo\n"); + return true; +} + /* * This command lists the objects available, and their ID */ -bool Debugger::Cmd_ListObjects(int argc, const char **argv) { +bool RingworldDebugger::Cmd_ListObjects(int argc, const char **argv) { if (argc != 1) { DebugPrintf("Usage: %s\n", argv[0]); return true; @@ -318,7 +402,7 @@ bool Debugger::Cmd_ListObjects(int argc, const char **argv) { /* * This command gets an item, or move it to a room */ -bool Debugger::Cmd_MoveObject(int argc, const char **argv) { +bool RingworldDebugger::Cmd_MoveObject(int argc, const char **argv) { // Check for a flag to clear if ((argc < 2) || (argc > 3)){ DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]); @@ -439,69 +523,188 @@ bool Debugger::Cmd_MoveObject(int argc, const char **argv) { return true; } -/** - * Show any active hotspot areas in the scene +/* + * This command lists the objects available, and their ID */ -bool Debugger::Cmd_Hotspots(int argc, const char **argv) { - int colIndex = 16; - const Rect &sceneBounds = g_globals->_sceneManager._scene->_sceneBounds; - - // Lock the background surface for access - Graphics::Surface destSurface = g_globals->_sceneManager._scene->_backSurface.lockSurface(); - - // Iterate through the scene items - SynchronizedList<SceneItem *>::iterator i; - for (i = g_globals->_sceneItems.reverse_begin(); i != g_globals->_sceneItems.end(); --i, ++colIndex) { - SceneItem *o = *i; - - // Draw the contents of the hotspot area - if (o->_sceneRegionId == 0) { - // Scene item doesn't use a region, so fill in the entire area - if ((o->_bounds.right > o->_bounds.left) && (o->_bounds.bottom > o->_bounds.top)) - destSurface.fillRect(Rect(o->_bounds.left - sceneBounds.left, o->_bounds.top - sceneBounds.top, - o->_bounds.right - sceneBounds.left - 1, o->_bounds.bottom - sceneBounds.top - 1), colIndex); - } else { - // Scene uses a region, so get it and use it to fill out only the correct parts - SceneRegions::iterator ri = g_globals->_sceneRegions.begin(); - while ((ri != g_globals->_sceneRegions.end()) && ((*ri)._regionId != o->_sceneRegionId)) - ++ri; +bool BlueForceDebugger::Cmd_ListObjects(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); + return true; + } - if (ri != g_globals->_sceneRegions.end()) { - // Fill out the areas defined by the region - Region &r = *ri; - - for (int y = r._bounds.top; y < r._bounds.bottom; ++y) { - LineSliceSet set = r.getLineSlices(y); + DebugPrintf("Available objects for this game are:\n"); + DebugPrintf("1 - INV_COLT45\n"); + DebugPrintf("2 - INV_AMMO_CLIP\n"); + DebugPrintf("3 - INV_SPARE_CLIP\n"); + DebugPrintf("4 - INV_HANDCUFFS\n"); + DebugPrintf("5 - INV_GREENS_GUN\n"); + DebugPrintf("6 - INV_TICKET_BOOK\n"); + DebugPrintf("7 - INV_MIRANDA_CARD\n"); + DebugPrintf("8 - INV_FOREST_RAP\n"); + DebugPrintf("9 - INV_GREEN_ID\n"); + DebugPrintf("10 - INV_BASEBALL_CARD\n"); + DebugPrintf("11 - INV_BOOKING_GREEN\n"); + DebugPrintf("12 - INV_FLARE\n"); + DebugPrintf("13 - INV_COBB_RAP\n"); + DebugPrintf("14 - INV_22_BULLET\n"); + DebugPrintf("15 - INV_AUTO_RIFLE\n"); + DebugPrintf("16 - INV_WIG\n"); + DebugPrintf("17 - INV_FRANKIE_ID\n"); + DebugPrintf("18 - INV_TYRONE_ID\n"); + DebugPrintf("19 - INV_22_SNUB\n"); + DebugPrintf("20 - INV_BOOKING_FRANKIE\n"); + DebugPrintf("21 - INV_BOOKING_GANG\n"); + DebugPrintf("22 - INV_FBI_TELETYPE\n"); + DebugPrintf("23 - INV_DA_NOTE\n"); + DebugPrintf("24 - INV_PRINT_OUT\n"); + DebugPrintf("25 - INV_WAREHOUSE_KEYS\n"); + DebugPrintf("26 - INV_CENTER_PUNCH\n"); + DebugPrintf("27 - INV_TRANQ_GUN\n"); + DebugPrintf("28 - INV_HOOK\n"); + DebugPrintf("29 - INV_RAGS\n"); + DebugPrintf("30 - INV_JAR\n"); + DebugPrintf("31 - INV_SCREWDRIVER\n"); + DebugPrintf("32 - INV_D_FLOPPY\n"); + DebugPrintf("33 - INV_BLANK_DISK\n"); + DebugPrintf("34 - INV_STICK\n"); + DebugPrintf("35 - INV_CRATE1\n"); + DebugPrintf("36 - INV_CRATE2\n"); + DebugPrintf("37 - INV_SHOEBOX\n"); + DebugPrintf("38 - INV_BADGE\n"); + DebugPrintf("39 - INV_RENTAL_COUPON\n"); + DebugPrintf("40 - INV_NICKEL\n"); + DebugPrintf("41 - INV_LYLE_CARD\n"); + DebugPrintf("42 - INV_CARTER_NOTE\n"); + DebugPrintf("43 - INV_MUG_SHOT\n"); + DebugPrintf("44 - INV_CLIPPING\n"); + DebugPrintf("45 - INV_MICROFILM \n"); + DebugPrintf("46 - INV_WAVE_KEYS\n"); + DebugPrintf("47 - INV_RENTAL_KEYS\n"); + DebugPrintf("48 - INV_NAPKIN\n"); + DebugPrintf("49 - INV_DMV_PRINTOUT\n"); + DebugPrintf("50 - INV_FISHING_NET\n"); + DebugPrintf("51 - INV_ID\n"); + DebugPrintf("52 - INV_9MM_BULLETS\n"); + DebugPrintf("53 - INV_SCHEDULE\n"); + DebugPrintf("54 - INV_GRENADES\n"); + DebugPrintf("55 - INV_YELLOW_CORD\n"); + DebugPrintf("56 - INV_HALF_YELLOW_CORD\n"); + DebugPrintf("57 - INV_BLACK_CORD\n"); + DebugPrintf("58 - INV_HALF_BLACK_CORD\n"); + DebugPrintf("59 - INV_WARRANT\n"); + DebugPrintf("60 - INV_JACKET\n"); + DebugPrintf("61 - INV_GREENS_KNIFE\n"); + DebugPrintf("62 - INV_DOG_WHISTLE\n"); + DebugPrintf("63 - INV_AMMO_BELT\n"); + DebugPrintf("64 - INV_CARAVAN_KEY\n"); + return true; +} - for (uint p = 0; p < set.items.size(); ++p) - destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, - set.items[p].xe - sceneBounds.left - 1, colIndex); - } - } - } +bool BlueForceDebugger::Cmd_MoveObject(int argc, const char **argv) { + // Check for a flag to clear + if ((argc < 2) || (argc > 3)){ + DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]); + DebugPrintf("If no scene is specified, the object will be added to inventory\n"); + return true; } - // Release the surface - g_globals->_sceneManager._scene->_backSurface.unlockSurface(); + int objNum = strToInt(argv[1]); + int sceneNum = 1; + if (argc == 3) + sceneNum = strToInt(argv[2]); - // Mark the scene as requiring a full redraw - g_globals->_paneRefreshFlag[0] = 2; + if ((objNum > 0) && (objNum < 65)) + BF_INVENTORY.setObjectScene(objNum, sceneNum); + else + DebugPrintf("Invalid object Id %s\n", argv[1]); - return false; + return true; } -/** - * Play the specified sound +/* + * This command lists the objects available, and their ID */ -bool Debugger::Cmd_Sound(int argc, const char **argv) { - if (argc != 2) { - DebugPrintf("Usage: %s <sound number>\n", argv[0]); +bool Ringworld2Debugger::Cmd_ListObjects(int argc, const char **argv) { + if (argc != 1) { + DebugPrintf("Usage: %s\n", argv[0]); return true; } - int soundNum = strToInt(argv[1]); - g_globals->_soundHandler.play(soundNum); - return false; + DebugPrintf("Available objects for this game are:\n"); + DebugPrintf("1 - R2_OPTO_DISK\n"); + DebugPrintf("2 - R2_2\n"); + DebugPrintf("3 - R2_NEGATOR_GUN\n"); + DebugPrintf("4 - R2_STEPPING_DISKS\n"); + DebugPrintf("5 - R2_5\n"); + DebugPrintf("6 - R2_6\n"); + DebugPrintf("7 - R2_7\n"); + DebugPrintf("8 - R2_8\n"); + DebugPrintf("9 - R2_9\n"); + DebugPrintf("10 - R2_10\n"); + DebugPrintf("11 - R2_11\n"); + DebugPrintf("12 - R2_12\n"); + DebugPrintf("13 - R2_13\n"); + DebugPrintf("14 - R2_14\n"); + DebugPrintf("15 - R2_15\n"); + DebugPrintf("16 - R2_16\n"); + DebugPrintf("17 - R2_17\n"); + DebugPrintf("18 - R2_18\n"); + DebugPrintf("19 - R2_19\n"); + DebugPrintf("20 - R2_20\n"); + DebugPrintf("21 - R2_21\n"); + DebugPrintf("22 - R2_22\n"); + DebugPrintf("23 - R2_23\n"); + DebugPrintf("24 - R2_24\n"); + DebugPrintf("25 - R2_25\n"); + DebugPrintf("26 - R2_26\n"); + DebugPrintf("27 - R2_27\n"); + DebugPrintf("28 - R2_28\n"); + DebugPrintf("29 - R2_29\n"); + DebugPrintf("30 - R2_30\n"); + DebugPrintf("31 - R2_31\n"); + DebugPrintf("32 - R2_32\n"); + DebugPrintf("33 - R2_33\n"); + DebugPrintf("34 - R2_34\n"); + DebugPrintf("35 - R2_35\n"); + DebugPrintf("36 - R2_36\n"); + DebugPrintf("37 - R2_37\n"); + DebugPrintf("38 - R2_38\n"); + DebugPrintf("39 - R2_39\n"); + DebugPrintf("40 - R2_40\n"); + DebugPrintf("41 - R2_41\n"); + DebugPrintf("42 - R2_42\n"); + DebugPrintf("43 - R2_43\n"); + DebugPrintf("44 - R2_44\n"); + DebugPrintf("45 - R2_45\n"); + DebugPrintf("46 - R2_46\n"); + DebugPrintf("47 - R2_47\n"); + DebugPrintf("48 - R2_48\n"); + DebugPrintf("49 - R2_49\n"); + DebugPrintf("50 - R2_50\n"); + DebugPrintf("51 - R2_51\n"); + DebugPrintf("52 - R2_52\n"); + + return true; } +bool Ringworld2Debugger::Cmd_MoveObject(int argc, const char **argv) { + // Check for a flag to clear + if ((argc < 2) || (argc > 3)){ + DebugPrintf("Usage: %s <object number> [<scene number>]\n", argv[0]); + DebugPrintf("If no scene is specified, the object will be added to inventory\n"); + return true; + } + + int objNum = strToInt(argv[1]); + int sceneNum = 1; + if (argc == 3) + sceneNum = strToInt(argv[2]); + + if ((objNum > 0) && (objNum < 53)) + R2_INVENTORY.setObjectScene(objNum, sceneNum); + else + DebugPrintf("Invalid object Id %s\n", argv[1]); + + return true; +} } // End of namespace TsAGE diff --git a/engines/tsage/debugger.h b/engines/tsage/debugger.h index fcdbc2d243..bf826a3f77 100644 --- a/engines/tsage/debugger.h +++ b/engines/tsage/debugger.h @@ -41,10 +41,34 @@ protected: bool Cmd_SetFlag(int argc, const char **argv); bool Cmd_GetFlag(int argc, const char **argv); bool Cmd_ClearFlag(int argc, const char **argv); - bool Cmd_ListObjects(int argc, const char **argv); - bool Cmd_MoveObject(int argc, const char **argv); bool Cmd_Hotspots(int argc, const char **argv); bool Cmd_Sound(int argc, const char **argv); + virtual bool Cmd_ListObjects(int argc, const char **argv) = 0; + virtual bool Cmd_MoveObject(int argc, const char **argv) = 0; +}; + +class DemoDebugger : public Debugger { +protected: + virtual bool Cmd_ListObjects(int argc, const char **argv); + virtual bool Cmd_MoveObject(int argc, const char **argv); +}; + +class RingworldDebugger : public Debugger { +protected: + virtual bool Cmd_ListObjects(int argc, const char **argv); + virtual bool Cmd_MoveObject(int argc, const char **argv); +}; + +class BlueForceDebugger : public Debugger { +protected: + virtual bool Cmd_ListObjects(int argc, const char **argv); + virtual bool Cmd_MoveObject(int argc, const char **argv); +}; + +class Ringworld2Debugger : public Debugger { +protected: + virtual bool Cmd_ListObjects(int argc, const char **argv); + virtual bool Cmd_MoveObject(int argc, const char **argv); }; } // End of namespace TsAGE diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp index 44a25085fa..12add10c58 100644 --- a/engines/tsage/detection.cpp +++ b/engines/tsage/detection.cpp @@ -61,6 +61,7 @@ static const PlainGameDescriptor tSageGameTitles[] = { { "tsage", "Tsunami TsAGE-based Game" }, { "ringworld", "Ringworld: Revenge of the Patriarch" }, { "blueforce", "Blue Force" }, + { "ringworld2", "Return to Ringworld" }, { 0, 0 } }; @@ -75,7 +76,7 @@ public: TSageMetaEngine() : AdvancedMetaEngine(TsAGE::gameDescriptions, sizeof(TsAGE::tSageGameDescription), tSageGameTitles) { _md5Bytes = 5000; _singleid = "tsage"; - _guioptions = Common::GUIO_NOSPEECH; + _guioptions = GUIO1(GUIO_NOSPEECH); } virtual const char *getName() const { diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index 4b69549673..d6b1760b80 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -32,8 +32,8 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618), Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING | ADGF_CD, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_CD, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_CD | GF_ALT_REGIONS @@ -46,8 +46,8 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "cb8bba91b30cd172712371d7123bd763", 7427980), Common::ES_ESP, Common::kPlatformPC, - ADGF_TESTING | ADGF_CD, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_CD, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_CD | GF_ALT_REGIONS @@ -60,8 +60,8 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "7b7f0c5b37b58fa5ec06ebb2ca0d0d9d", 8438770), Common::EN_ANY, Common::kPlatformPC, - ADGF_TESTING, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + ADGF_NO_FLAGS, + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY @@ -75,7 +75,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY | GF_DEMO @@ -90,7 +90,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_Ringworld, GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS @@ -106,7 +106,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, GF_FLOPPY @@ -121,7 +121,7 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, GF_FLOPPY | GF_ALT_REGIONS @@ -135,11 +135,27 @@ static const tSageGameDescription gameDescriptions[] = { Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, - Common::GUIO_NOSPEECH | Common::GUIO_NOSFX + GUIO2(GUIO_NOSPEECH, GUIO_NOSFX) }, GType_BlueForce, GF_CD | GF_ALT_REGIONS }, + + // Return to Ringworld + { + { + "ringworld2", + "CD", + AD_ENTRY1s("r2rw.rlb", "df6c25622387007788ca36d99362c1f0", 47586928), + Common::EN_ANY, + Common::kPlatformPC, + ADGF_CD | ADGF_UNSTABLE, + GUIO0() + }, + GType_Ringworld2, + GF_CD | GF_ALT_REGIONS + }, + { AD_TABLE_END_MARKER, 0, 0 } }; diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index 002835e76b..972d591c34 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -181,242 +181,6 @@ void ModalDialog::drawFrame() { /*--------------------------------------------------------------------------*/ -bool GfxInvImage::process(Event &event) { - if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) { - event.handled = _bounds.contains(event.mousePos); - return event.handled; - } - - return false; -} - -/*--------------------------------------------------------------------------*/ - -void InventoryDialog::show() { - // Determine how many items are in the player's inventory - int itemCount = 0; - SynchronizedList<InvObject *>::iterator i; - for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) { - if ((*i)->inInventory()) - ++itemCount; - } - - if (itemCount == 0) { - MessageDialog::show(INV_EMPTY_MSG, OK_BTN_STRING); - return; - } - - InventoryDialog *dlg = new InventoryDialog(); - dlg->draw(); - dlg->execute(); - delete dlg; -} - -InventoryDialog::InventoryDialog() { - // Determine the maximum size of the image of any item in the player's inventory - int imgWidth = 0, imgHeight = 0; - - SynchronizedList<InvObject *>::iterator i; - for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) { - InvObject *invObject = *i; - if (invObject->inInventory()) { - // Get the image for the item - GfxSurface itemSurface = surfaceFromRes(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum); - - // Maintain the dimensions of the largest item image - imgWidth = MAX(imgWidth, (int)itemSurface.getBounds().width()); - imgHeight = MAX(imgHeight, (int)itemSurface.getBounds().height()); - - // Add the item to the display list - GfxInvImage *img = new GfxInvImage(); - _images.push_back(img); - img->setDetails(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum); - img->_invObject = invObject; - add(img); - } - } - assert(_images.size() > 0); - - // Figure out the number of columns/rows to show all the items - int cellsSize = 3; - while ((cellsSize * cellsSize) < (int)_images.size()) - ++cellsSize; - - // Set the position of each inventory item to be displayed - int cellX = 0; - Common::Point pt(0, 0); - - for (uint idx = 0; idx < _images.size(); ++idx) { - if (cellX == cellsSize) { - // Move to the start of the next line - pt.x = 0; - pt.y += imgHeight + 2; - cellX = 0; - } - - _images[idx]->_bounds.moveTo(pt.x, pt.y); - - pt.x += imgWidth + 2; - ++cellX; - } - - // Set up the buttons - pt.y += imgHeight + 2; - _btnOk.setText(OK_BTN_STRING); - _btnOk._bounds.moveTo((imgWidth + 2) * cellsSize - _btnOk._bounds.width(), pt.y); - _btnLook.setText(LOOK_BTN_STRING); - _btnLook._bounds.moveTo(_btnOk._bounds.left - _btnLook._bounds.width() - 2, _btnOk._bounds.top); - addElements(&_btnLook, &_btnOk, NULL); - - frame(); - setCenter(SCREEN_CENTER_X, SCREEN_CENTER_Y); -} - -InventoryDialog::~InventoryDialog() { - for (uint idx = 0; idx < _images.size(); ++idx) - delete _images[idx]; -} - -void InventoryDialog::execute() { - if ((RING_INVENTORY._selectedItem) && RING_INVENTORY._selectedItem->inInventory()) - RING_INVENTORY._selectedItem->setCursor(); - - GfxElement *hiliteObj; - bool lookFlag = false; - _gfxManager.activate(); - - while (!g_vm->shouldQuit()) { - // Get events - Event event; - while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) { - g_system->delayMillis(10); - g_system->updateScreen(); - } - if (g_vm->shouldQuit()) - break; - - hiliteObj = NULL; - if ((event.eventType == EVENT_BUTTON_DOWN) && !_bounds.contains(event.mousePos)) - break; - - // Pass event to elements - event.mousePos.x -= _gfxManager._bounds.left; - event.mousePos.y -= _gfxManager._bounds.top; - - for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) { - if ((*i)->process(event)) - hiliteObj = *i; - } - - if (!event.handled && event.eventType == EVENT_KEYPRESS) { - if ((event.kbd.keycode == Common::KEYCODE_RETURN) || (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { - // Exit the dialog - //hiliteObj = &_btnOk; - break; - } - } - - if (hiliteObj == &_btnOk) { - // Ok button clicked - if (lookFlag) - g_globals->_events.setCursor(CURSOR_WALK); - break; - } else if (hiliteObj == &_btnLook) { - // Look button clicked - if (_btnLook._message == LOOK_BTN_STRING) { - _btnLook._message = PICK_BTN_STRING; - lookFlag = 1; - g_globals->_events.setCursor(CURSOR_LOOK); - } else { - _btnLook._message = LOOK_BTN_STRING; - lookFlag = 0; - g_globals->_events.setCursor(CURSOR_WALK); - } - - hiliteObj->draw(); - } else if (hiliteObj) { - // Inventory item selected - InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject; - if (lookFlag) { - g_globals->_screenSurface.displayText(invObject->_description); - } else { - RING_INVENTORY._selectedItem = invObject; - invObject->setCursor(); - } - } - } - - _gfxManager.deactivate(); -} - -/*--------------------------------------------------------------------------*/ - -void OptionsDialog::show() { - OptionsDialog *dlg = new OptionsDialog(); - dlg->draw(); - - GfxButton *btn = dlg->execute(); - - if (btn == &dlg->_btnQuit) { - // Quit game - if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) { - g_vm->quitGame(); - } - } else if (btn == &dlg->_btnRestart) { - // Restart game - g_globals->_game->restartGame(); - } else if (btn == &dlg->_btnSound) { - // Sound dialog - SoundDialog::execute(); - } else if (btn == &dlg->_btnSave) { - // Save button - g_globals->_game->saveGame(); - } else if (btn == &dlg->_btnRestore) { - // Restore button - g_globals->_game->restoreGame(); - } - - dlg->remove(); - delete dlg; -} - -OptionsDialog::OptionsDialog() { - // Set the element text - _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT); - _btnRestore.setText(RESTORE_BTN_STRING); - _btnSave.setText(SAVE_BTN_STRING); - _btnRestart.setText(RESTART_BTN_STRING); - _btnQuit.setText(QUIT_BTN_STRING); - _btnSound.setText(SOUND_BTN_STRING); - _btnResume.setText(RESUME_BTN_STRING); - - // Set position of the elements - _gfxMessage._bounds.moveTo(0, 1); - _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1); - _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1); - _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1); - _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1); - _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1); - _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1); - - // Set all the buttons to the widest button - GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume}; - int16 btnWidth = 0; - for (int idx = 0; idx < 6; ++idx) - btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width()); - for (int idx = 0; idx < 6; ++idx) - btnList[idx]->_bounds.setWidth(btnWidth); - - // Add the items to the dialog - addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL); - - // Set the dialog size and position - frame(); - setCenter(160, 100); -} - -/*--------------------------------------------------------------------------*/ - void SoundDialog::execute() { ConfigDialog *dlg = new ConfigDialog(); dlg->runModal(); diff --git a/engines/tsage/dialogs.h b/engines/tsage/dialogs.h index 35ed60ba1a..33b55093d0 100644 --- a/engines/tsage/dialogs.h +++ b/engines/tsage/dialogs.h @@ -60,47 +60,6 @@ public: /*--------------------------------------------------------------------------*/ -class GfxInvImage : public GfxImage { -public: - InvObject *_invObject; -public: - GfxInvImage() : GfxImage(), _invObject(NULL) {} - - virtual bool process(Event &event); -}; - -#define MAX_INVOBJECT_DISPLAY 20 - -class InventoryDialog : public ModalDialog { -private: - Common::Array<GfxInvImage *> _images; - GfxButton _btnOk, _btnLook; -public: - InventoryDialog(); - virtual ~InventoryDialog(); - void execute(); - - static void show(); -}; - -/*--------------------------------------------------------------------------*/ - -class OptionsDialog : public ModalDialog { -private: - GfxButton _btnSave, _btnRestore, _btnRestart; - GfxButton _btnQuit, _btnResume; - GfxButton _btnSound; - GfxMessage _gfxMessage; -public: - OptionsDialog(); - virtual ~OptionsDialog() {} - GfxButton *execute() { return GfxDialog::execute(&_btnResume); } - - static void show(); -}; - -/*--------------------------------------------------------------------------*/ - class SoundDialog { public: static void execute(); diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 940709c8c7..ac08997563 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -156,7 +156,7 @@ void EventsClass::setCursor(CursorType cursorType) { // No cursor g_globals->setFlag(122); - if ((g_vm->getFeatures() & GF_DEMO) || (g_vm->getGameID() == GType_BlueForce)) { + if ((g_vm->getFeatures() & GF_DEMO) || (g_vm->getGameID() != GType_Ringworld)) { CursorMan.showMouse(false); return; } @@ -165,10 +165,13 @@ void EventsClass::setCursor(CursorType cursorType) { case CURSOR_LOOK: // Look cursor - if (g_vm->getGameID() == GType_BlueForce) + if (g_vm->getGameID() == GType_BlueForce) { cursor = g_resourceManager->getSubResource(1, 5, 3, &size); - else + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 5, &size); + } else { cursor = g_resourceManager->getSubResource(4, 1, 5, &size); + } _currentCursor = CURSOR_LOOK; break; @@ -176,6 +179,8 @@ void EventsClass::setCursor(CursorType cursorType) { // Use cursor if (g_vm->getGameID() == GType_BlueForce) { cursor = g_resourceManager->getSubResource(1, 5, 2, &size); + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 4, &size); } else { cursor = g_resourceManager->getSubResource(4, 1, 4, &size); } @@ -186,6 +191,8 @@ void EventsClass::setCursor(CursorType cursorType) { // Talk cursor if (g_vm->getGameID() == GType_BlueForce) { cursor = g_resourceManager->getSubResource(1, 5, 4, &size); + } else if (g_vm->getGameID() == GType_Ringworld2) { + cursor = g_resourceManager->getSubResource(5, 1, 6, &size); } else { cursor = g_resourceManager->getSubResource(4, 1, 3, &size); } @@ -214,7 +221,8 @@ void EventsClass::setCursor(CursorType cursorType) { case CURSOR_WALK: default: - if (g_vm->getGameID() == GType_BlueForce) { + switch (g_vm->getGameID()) { + case GType_BlueForce: if (cursorType == CURSOR_WALK) { cursor = g_resourceManager->getSubResource(1, 5, 1, &size); } else { @@ -224,13 +232,45 @@ void EventsClass::setCursor(CursorType cursorType) { questionEnabled = true; } _currentCursor = cursorType; - } else { + break; + case GType_Ringworld2: + if (cursorType == CURSOR_WALK) { + cursor = CURSOR_WALK_DATA; + delFlag = false; + } else { + // Inventory icon + InvObject *invObject = g_globals->_inventory->getItem((int)cursorType); + cursor = g_resourceManager->getSubResource(6, invObject->_strip, invObject->_frame, &size); + questionEnabled = true; + } + _currentCursor = cursorType; + break; + default: // For Ringworld, always treat as the walk cursor cursor = CURSOR_WALK_DATA; _currentCursor = CURSOR_WALK; delFlag = false; + break; } break; + + // Ringworld 2 specific cursors + case EXITCURSOR_N: + case EXITCURSOR_S: + case EXITCURSOR_W: + case EXITCURSOR_E: + case EXITCURSOR_LEFT_HAND: + case CURSOR_INVALID: + case EXITCURSOR_NE: + case EXITCURSOR_SE: + case EXITCURSOR_SW: + case EXITCURSOR_NW: + case SHADECURSOR_UP: + case SHADECURSOR_DOWN: + case SHADECURSOR_HAND: + _currentCursor = cursorType; + cursor = g_resourceManager->getSubResource(5, 1, cursorType - R2CURSORS_START, &size); + break; } // Decode the cursor @@ -244,9 +284,9 @@ void EventsClass::setCursor(CursorType cursorType) { if (delFlag) DEALLOCATE(cursor); - // For Blue Force, enable the question button when an inventory icon is selected - if (g_vm->getGameID() == GType_BlueForce) - BF_GLOBALS._uiElements._question.setEnabled(questionEnabled); + // For Blue Force and Return to Ringworld, enable the question button when an inventory icon is selected + if (g_vm->getGameID() != GType_Ringworld) + T2_GLOBALS._uiElements._question.setEnabled(questionEnabled); } void EventsClass::pushCursor(CursorType cursorType) { @@ -313,7 +353,6 @@ void EventsClass::setCursor(Graphics::Surface &cursor, int transColor, const Com } void EventsClass::setCursor(GfxSurface &cursor) { - // TODO: Find proper parameters for this form in Blue Force Graphics::Surface s = cursor.lockSurface(); const byte *cursorData = (const byte *)s.getBasePtr(0, 0); diff --git a/engines/tsage/events.h b/engines/tsage/events.h index 0195b2fc7b..1942c98901 100644 --- a/engines/tsage/events.h +++ b/engines/tsage/events.h @@ -80,7 +80,23 @@ enum CursorType { INV_9MM_BULLETS = 54, INV_SCHEDULE = 55, INV_GRENADES = 56, INV_YELLOW_CORD = 57, INV_HALF_YELLOW_CORD = 58, INV_BLACK_CORD = 59, INV_HALF_BLACK_CORD = 61, INV_WARRANT = 62, INV_JACKET = 63, INV_GREENS_KNIFE = 64, INV_DOG_WHISTLE = 65, INV_AMMO_BELT = 66, - BF_ITEM_67 = 67, BF_LAST_INVENT = 68, + INV_CARAVAN_KEY = 67, BF_LAST_INVENT = 68, + + // Ringworld 2 objects + R2_OPTO_DISK = 1, R2_2 = 2, R2_NEGATOR_GUN = 3, R2_STEPPING_DISKS = 4, R2_5 = 5, R2_6 = 6, + R2_7 = 7, R2_8 = 8, R2_9 = 9, R2_10 = 10, R2_11 = 11, R2_12 = 12, R2_13 = 13, R2_14 = 14, + R2_15 = 15, R2_16 = 16, R2_17 = 17, R2_18 = 18, R2_19 = 19, R2_20 = 20, R2_21 = 21, + R2_22 = 22, R2_23 = 23, R2_24 = 24, R2_25 = 25, R2_26 = 26, R2_27 = 27, R2_28 = 28, + R2_29 = 29, R2_30 = 30, R2_31 = 31, R2_32 = 32, R2_33 = 33, R2_34 = 34, R2_35 = 35, + R2_36 = 36, R2_37 = 37, R2_38 = 38, R2_39 = 39, R2_40 = 40, R2_41 = 41, R2_42 = 42, + R2_43 = 43, R2_44 = 44, R2_45 = 45, R2_46 = 46, R2_47 = 47, R2_48 = 48, R2_49 = 49, + R2_50 = 50, R2_51 = 51, R2_52 = 52, + + // Ringworld 2 cursors + R2CURSORS_START = 0x8000, EXITCURSOR_N = 0x8007, EXITCURSOR_S = 0x8008, EXITCURSOR_W = 0x8009, + EXITCURSOR_E = 0x800A, EXITCURSOR_LEFT_HAND = 0x800B, CURSOR_INVALID = 0x800C, + EXITCURSOR_NE = 0x800D, EXITCURSOR_SE = 0x800E, EXITCURSOR_SW = 0x800F, EXITCURSOR_NW = 0x8010, + SHADECURSOR_UP = 0x8011, SHADECURSOR_DOWN = 0x8012, SHADECURSOR_HAND = 0x8013, // Cursors CURSOR_WALK = 0x100, CURSOR_LOOK = 0x200, CURSOR_700 = 700, CURSOR_USE = 0x400, CURSOR_TALK = 0x800, diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 788ab71b76..769ad4c054 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -25,6 +25,7 @@ #include "tsage/blue_force/blueforce_logic.h" #include "tsage/ringworld/ringworld_demo.h" #include "tsage/ringworld/ringworld_logic.h" +#include "tsage/ringworld2/ringworld2_logic.h" namespace TsAGE { @@ -75,6 +76,17 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _fontColors.background = 88; _fontColors.foreground = 92; _dialogCenter.y = 140; + } else if (g_vm->getGameID() == GType_Ringworld2) { + // Return to Ringworld + _gfxFontNumber = 50; + _gfxColors.background = 0; + _gfxColors.foreground = 59; + _fontColors.background = 4; + _fontColors.foreground = 15; + _color1 = 59; + _color2 = 15; + _color3 = 4; + _dialogCenter.y = 100; } else if ((g_vm->getGameID() == GType_Ringworld) && (g_vm->getFeatures() & GF_CD)) { _gfxFontNumber = 50; _gfxColors.background = 53; @@ -85,6 +97,7 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _color2 = 18; _color3 = 18; } else { + // Ringworld _gfxFontNumber = 50; _gfxColors.background = 53; _gfxColors.foreground = 18; @@ -124,6 +137,12 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface _inventory = new BlueForce::BlueForceInvObjectList(); _sceneHandler = new BlueForce::SceneHandlerExt(); break; + + case GType_Ringworld2: + _inventory = new Ringworld2::Ringworld2InvObjectList(); + _game = new Ringworld2::Ringworld2Game(); + _sceneHandler = new Ringworld2::SceneHandlerExt(); + break; } } @@ -136,7 +155,7 @@ Globals::~Globals() { } void Globals::reset() { - Common::set_to(&_flags[0], &_flags[MAX_FLAGS], false); + Common::fill(&_flags[0], &_flags[MAX_FLAGS], false); g_saver->addFactory(classFactoryProc); } @@ -169,6 +188,9 @@ void Globals::synchronize(Serializer &s) { s.syncAsSint16LE(_prevSceneOffset.x); s.syncAsSint16LE(_prevSceneOffset.y); SYNC_POINTER(_scrollFollower); s.syncAsSint32LE(_stripNum); + + if (s.getVersion() >= 8) + _walkRegions.synchronize(s); } void Globals::dispatchSound(ASound *obj) { @@ -181,38 +203,71 @@ void Globals::dispatchSounds() { /*--------------------------------------------------------------------------*/ +void TsAGE2Globals::reset() { + Globals::reset(); + + // Reset the inventory + T2_GLOBALS._uiElements.updateInventory(); + T2_GLOBALS._uiElements._scoreValue = 0; + T2_GLOBALS._uiElements._active = false; +} + +void TsAGE2Globals::synchronize(Serializer &s) { + Globals::synchronize(s); + + s.syncAsSint16LE(_interfaceY); +} + +/*--------------------------------------------------------------------------*/ + namespace BlueForce { -BlueForceGlobals::BlueForceGlobals(): Globals() { +BlueForceGlobals::BlueForceGlobals(): TsAGE2Globals() { } void BlueForceGlobals::synchronize(Serializer &s) { - Globals::synchronize(s); + TsAGE2Globals::synchronize(s); s.syncAsSint16LE(_dayNumber); - s.syncAsSint16LE(_v4CEA4); + if (s.getVersion() < 9) { + int tmpVar = 0; + s.syncAsSint16LE(tmpVar); + } + s.syncAsSint16LE(_tonyDialogCtr); s.syncAsSint16LE(_marinaWomanCtr); + s.syncAsSint16LE(_kateDialogCtr); s.syncAsSint16LE(_v4CEB6); s.syncAsSint16LE(_safeCombination); - s.syncAsSint16LE(_v4CEC0); - s.syncAsSint16LE(_v4CEC2); + s.syncAsSint16LE(_gateStatus); + s.syncAsSint16LE(_greenDay5TalkCtr); s.syncAsSint16LE(_v4CEC4); s.syncAsSint16LE(_v4CEC8); + s.syncAsSint16LE(_v4CECA); + s.syncAsSint16LE(_v4CECC); + for (int i = 0; i < 18; i++) + s.syncAsByte(_breakerBoxStatusArr[i]); + s.syncAsSint16LE(_hiddenDoorStatus); + s.syncAsSint16LE(_v4CEE2); + s.syncAsSint16LE(_v4CEE4); + s.syncAsSint16LE(_v4CEE6); + s.syncAsSint16LE(_v4CEE8); s.syncAsSint16LE(_deziTopic); s.syncAsSint16LE(_deathReason); s.syncAsSint16LE(_driveFromScene); s.syncAsSint16LE(_driveToScene); + s.syncAsSint16LE(_v501F8); + s.syncAsSint16LE(_v501FA); s.syncAsSint16LE(_v501FC); + s.syncAsSint16LE(_v5020C); s.syncAsSint16LE(_v50696); - s.syncAsSint16LE(_v5098C); - s.syncAsSint16LE(_v5098D); + s.syncAsSint16LE(_subFlagBitArr1); + s.syncAsSint16LE(_subFlagBitArr2); s.syncAsSint16LE(_v50CC2); s.syncAsSint16LE(_v50CC4); s.syncAsSint16LE(_v50CC6); s.syncAsSint16LE(_v50CC8); s.syncAsSint16LE(_v51C42); s.syncAsSint16LE(_v51C44); - s.syncAsSint16LE(_interfaceY); s.syncAsSint16LE(_bookmark); s.syncAsSint16LE(_mapLocationId); s.syncAsSint16LE(_clip1Bullets); @@ -220,7 +275,7 @@ void BlueForceGlobals::synchronize(Serializer &s) { } void BlueForceGlobals::reset() { - Globals::reset(); + TsAGE2Globals::reset(); _scenePalette.clearListeners(); _scrollFollower = &_player; @@ -228,29 +283,56 @@ void BlueForceGlobals::reset() { // Reset the inventory ((BlueForceInvObjectList *)_inventory)->reset(); - BF_GLOBALS._uiElements.updateInventory(); - BF_GLOBALS._uiElements._scoreValue = 0; _mapLocationId = 1; _driveFromScene = 300; _driveToScene = 0; - _interfaceY = BF_INTERFACE_Y; + _interfaceY = UI_INTERFACE_Y; _dayNumber = 0; - _v4CEA4 = 0; + _tonyDialogCtr = 0; _marinaWomanCtr = 0; + _kateDialogCtr = 0; _v4CEB6 = 0; _safeCombination = 0; - _v4CEC0 = 0; - _v4CEC2 = 0; + _gateStatus = 0; + _greenDay5TalkCtr = 0; _v4CEC4 = 0; _v4CEC8 = 1; + _v4CECA = 0; + _v4CECC = 0; + _breakerBoxStatusArr[0] = 2; + _breakerBoxStatusArr[1] = 2; + _breakerBoxStatusArr[2] = 2; + _breakerBoxStatusArr[3] = 1; + _breakerBoxStatusArr[4] = 2; + _breakerBoxStatusArr[5] = 2; + _breakerBoxStatusArr[6] = 2; + _breakerBoxStatusArr[7] = 2; + _breakerBoxStatusArr[8] = 2; + _breakerBoxStatusArr[9] = 2; + _breakerBoxStatusArr[10] = 2; + _breakerBoxStatusArr[11] = 2; + _breakerBoxStatusArr[12] = 1; + _breakerBoxStatusArr[13] = 1; + _breakerBoxStatusArr[14] = 2; + _breakerBoxStatusArr[15] = 2; + _breakerBoxStatusArr[16] = 3; + _breakerBoxStatusArr[17] = 0; + _hiddenDoorStatus = 0; + _v4CEE2 = 0; + _v4CEE4 = 0; + _v4CEE6 = 0; + _v4CEE8 = 0; _deziTopic = 0; _deathReason = 0; + _v501F8 = 0; + _v501FA = 0; _v501FC = 0; + _v5020C = 0; _v50696 = 0; - _v5098C = 0; - _v5098D = 0; + _subFlagBitArr1 = 0; + _subFlagBitArr2 = 0; _v50CC2 = 0; _v50CC4 = 0; _v50CC6 = 0; @@ -282,4 +364,72 @@ bool BlueForceGlobals::removeFlag(int flagNum) { } // end of namespace BlueForce +namespace Ringworld2 { + +void Ringworld2Globals::reset() { + Globals::reset(); + + // Reset the inventory + R2_INVENTORY.reset(); + T2_GLOBALS._uiElements.updateInventory(); + T2_GLOBALS._uiElements._active = false; + + // Reset fields + _v5657C = 0; + _v565F5 = 0; + _v565AE = 0; + for (int i = 0; i < 14; i++) + _v56605[i] = 0; + _v57C2C = 0; + _v58CE2 = 0; + Common::fill(&_v565F1[0], &_v565F1[MAX_CHARACTERS], 0); + _speechSubtitles = SPEECH_VOICE | SPEECH_TEXT; + _insetUp = 0; + + Common::fill(&_v565F1[0], &_v565F1[MAX_CHARACTERS], 0); + Common::fill(&_stripManager_lookupList[0], &_stripManager_lookupList[12], 0); + _stripManager_lookupList[0] = 1; + _stripManager_lookupList[1] = 1; + _stripManager_lookupList[2] = 1; + _stripManager_lookupList[3] = 1; + _stripManager_lookupList[4] = 1; + _stripManager_lookupList[5] = 1; + _stripManager_lookupList[8] = 1; + _stripManager_lookupList[9] = 1; + _stripManager_lookupList[10] = 1; + _stripManager_lookupList[11] = 1; + + // Reset fields stored in the player class + _player._characterIndex = R2_QUINN; + _player._characterScene[1] = 100; + _player._characterScene[2] = 300; + _player._characterScene[3] = 300; +} + +void Ringworld2Globals::synchronize(Serializer &s) { + TsAGE2Globals::synchronize(s); + int i; + + s.syncAsSint16LE(_v5657C); + s.syncAsSint16LE(_v565F5); + s.syncAsSint16LE(_v57C2C); + s.syncAsSint16LE(_v58CE2); + s.syncAsSint16LE(_speechSubtitles); + + for (i = 0; i < MAX_CHARACTERS; ++i) + s.syncAsSint16LE(_v565F1[i]); + + s.syncAsByte(_v565AE); + + for (i = 0; i < 14; ++i) + s.syncAsByte(_v56605[i]); + + for (i = 0; i < 12; ++i) + s.syncAsByte(_stripManager_lookupList[i]); + + s.syncAsSint16LE(_insetUp); +} + +} // end of namespace Ringworld2 + } // end of namespace TsAGE diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index fa99e36ab9..9048899953 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -30,7 +30,7 @@ #include "tsage/events.h" #include "tsage/sound.h" #include "tsage/saveload.h" -#include "tsage/blue_force/blueforce_ui.h" +#include "tsage/user_interface.h" namespace TsAGE { @@ -77,7 +77,6 @@ public: Globals(); ~Globals(); - void reset(); void setFlag(int flagNum) { assert((flagNum >= 0) && (flagNum < MAX_FLAGS)); _flags[flagNum] = true; @@ -94,13 +93,34 @@ public: GfxManager &gfxManager() { return **_gfxManagers.begin(); } virtual Common::String getClassName() { return "Globals"; } virtual void synchronize(Serializer &s); + virtual void reset(); + void dispatchSounds(); }; +typedef bool (*SelectItemProc)(int objectNumber); + +/** + * The following class represents common globals that were introduced after the release of Ringworld. + */ +class TsAGE2Globals: public Globals { +public: + UIElements _uiElements; + SelectItemProc _onSelectItem; + int _interfaceY; + ASoundExt _inventorySound; + + TsAGE2Globals() { _onSelectItem = NULL; } + virtual void reset(); + virtual void synchronize(Serializer &s); +}; + extern Globals *g_globals; -#define GLOBALS (*g_globals) +#define GLOBALS (*::TsAGE::g_globals) +#define T2_GLOBALS (*((::TsAGE::TsAGE2Globals *)g_globals)) #define BF_GLOBALS (*((::TsAGE::BlueForce::BlueForceGlobals *)g_globals)) +#define R2_GLOBALS (*((::TsAGE::Ringworld2::Ringworld2Globals *)g_globals)) // Note: Currently this can't be part of the g_globals structure, since it needs to be constructed // prior to many of the fields in Globals execute their constructors @@ -162,44 +182,54 @@ enum Flag { hookPoints }; -class BlueForceGlobals: public Globals { +class BlueForceGlobals: public TsAGE2Globals { public: - ASoundExt _sound1, _sound2, _sound3; - UIElements _uiElements; + ASoundExt _sound1, _sound3; StripProxy _stripProxy; int _dayNumber; - int _v4CEA4; + int _tonyDialogCtr; int _marinaWomanCtr; + int _kateDialogCtr; int _v4CEB6; int _safeCombination; - int _v4CEC0; - int _v4CEC2; + int _gateStatus; + int _greenDay5TalkCtr; int _v4CEC4; int _v4CEC8; + int _v4CECA; + int _v4CECC; + int8 _breakerBoxStatusArr[18]; + int _hiddenDoorStatus; + int _v4CEE2; + int _v4CEE4; + int _v4CEE6; + int _v4CEE8; int _deziTopic; int _deathReason; int _driveFromScene; int _driveToScene; + int _v501F8; + int _v501FA; int _v501FC; + int _v5020C; int _v50696; - uint8 _v5098C; - uint8 _v5098D; + uint8 _subFlagBitArr1; + uint8 _subFlagBitArr2; int _v50CC2; int _v50CC4; int _v50CC6; int _v50CC8; int _v51C42; int _v51C44; - int _interfaceY; Bookmark _bookmark; int _mapLocationId; int _clip1Bullets, _clip2Bullets; BlueForceGlobals(); - void reset(); bool getHasBullets(); virtual Common::String getClassName() { return "BFGlobals"; } + virtual void reset(); virtual void synchronize(Serializer &s); void set2Flags(int flagNum); bool removeFlag(int flagNum); @@ -207,6 +237,33 @@ public: } // End of namespace BlueForce +namespace Ringworld2 { + +#define SPEECH_TEXT 1 +#define SPEECH_VOICE 2 + +class Ringworld2Globals: public TsAGE2Globals { +public: + ASoundExt _sound1, _sound2, _sound3, _sound4; + PlayStream _playStream; + StripProxy _stripProxy; + int _insetUp; + int _v565F5; + int _v5657C; + byte _v565AE; + byte _v56605[14]; + int _v57C2C; + int _v58CE2; + int _speechSubtitles; + int _v565F1[4]; + byte _stripManager_lookupList[12]; + + virtual void reset(); + virtual void synchronize(Serializer &s); +}; + +} // End of namespace Ringworld2 + } // End of namespace TsAGE #endif diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 4b2da0b456..171167c2ea 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -81,7 +81,7 @@ GfxSurface surfaceFromRes(const byte *imgData) { if (!rleEncoded) { Common::copy(srcP, srcP + (r.width() * r.height()), destP); } else { - Common::set_to(destP, destP + (r.width() * r.height()), s._transColor); + Common::fill(destP, destP + (r.width() * r.height()), s._transColor); for (int yp = 0; yp < r.height(); ++yp) { int width = r.width(); @@ -105,7 +105,7 @@ GfxSurface surfaceFromRes(const byte *imgData) { controlVal &= 0x3f; int pixel = *srcP++; - Common::set_to(destP, destP + controlVal, pixel); + Common::fill(destP, destP + controlVal, pixel); destP += controlVal; width -= controlVal; } @@ -261,7 +261,7 @@ void GfxSurface::create(int width, int height) { } _customSurface = new Graphics::Surface(); _customSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); - Common::set_to((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0); + Common::fill((byte *)_customSurface->pixels, (byte *)_customSurface->pixels + (width * height), 0); _bounds = Rect(0, 0, width, height); } @@ -455,7 +455,7 @@ static int *scaleLine(int size, int srcSize) { int scale = PRECISION_FACTOR * size / srcSize; assert(scale >= 0); int *v = new int[size]; - Common::set_to(v, &v[size], -1); + Common::fill(v, &v[size], -1); int distCtr = PRECISION_FACTOR / 2; int *destP = v; @@ -493,7 +493,7 @@ static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize, int trans byte *destP = (byte *)destImage.getBasePtr(0, yp); if (vertUsage[yp] == -1) { - Common::set_to(destP, destP + xSize, transIndex); + Common::fill(destP, destP + xSize, transIndex); } else { const byte *srcP = (const byte *)srcImage.getBasePtr(0, vertUsage[yp]); @@ -676,7 +676,39 @@ void GfxElement::drawFrame() { Rect tempRect = _bounds; tempRect.collapse(g_globals->_gfxEdgeAdjust, g_globals->_gfxEdgeAdjust); tempRect.collapse(-1, -1); - gfxManager.fillRect(tempRect, _colors.background); + + if (g_vm->getGameID() == GType_Ringworld2) { + // For Return to Ringworld, use palette shading + + // Get the current palette and determining a shading translation list + ScenePalette tempPalette; + tempPalette.getPalette(0, 256); + int transList[256]; + + for (int i = 0; i < 256; ++i) { + uint r, g, b, v; + tempPalette.getEntry(i, &r, &g, &b); + v = ((r >> 1) + (g >> 1) + (b >> 1)) / 4; + + transList[i] = tempPalette.indexOf(v, v, v); + } + + // Loop through the surface area to replace each pixel + // with its proper shaded replacement + Graphics::Surface surface = gfxManager.lockSurface(); + for (int y = tempRect.top; y < tempRect.bottom; ++y) { + byte *lineP = (byte *)surface.getBasePtr(tempRect.left, y); + for (int x = 0; x < tempRect.width(); ++x) { + *lineP = transList[*lineP]; + lineP++; + } + } + gfxManager.unlockSurface(); + + } else { + // Fill dialog content with specified background colour + gfxManager.fillRect(tempRect, _colors.background); + } --tempRect.bottom; --tempRect.right; gfxManager.fillArea(tempRect.left, tempRect.top, bgColor); @@ -1222,7 +1254,11 @@ void GfxFont::setFontNumber(uint32 fontNumber) { if (!_fontData) _fontData = g_resourceManager->getResource(RES_FONT, _fontNumber, 0); - _numChars = READ_LE_UINT16(_fontData + 4); + // Since some TsAGE game versions don't have a valid character count at offset 4, use the offset of the + // first charactre data to calculate the number of characters in the offset table preceeding it + _numChars = (READ_LE_UINT32(_fontData + 12) - 12) / 4; + assert(_numChars <= 256); + _fontSize.y = READ_LE_UINT16(_fontData + 6); _fontSize.x = READ_LE_UINT16(_fontData + 8); _bpp = READ_LE_UINT16(_fontData + 10); diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index 06b482d7b5..dba3401700 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -292,7 +292,7 @@ public: Common::copy(src, src + size, dest); } virtual void set(byte *dest, int size, byte val) { - Common::set_to(dest, dest + size, val); + Common::fill(dest, dest + size, val); } void copyFrom(GfxSurface &src, Rect destBounds, Region *priorityRegion = NULL) { _surface.setBounds(_bounds); diff --git a/engines/tsage/module.mk b/engines/tsage/module.mk index 50b269941e..44f808ba8e 100644 --- a/engines/tsage/module.mk +++ b/engines/tsage/module.mk @@ -14,7 +14,6 @@ MODULE_OBJS := \ blue_force/blueforce_scenes8.o \ blue_force/blueforce_scenes9.o \ blue_force/blueforce_speakers.o \ - blue_force/blueforce_ui.o \ converse.o \ core.o \ debugger.o \ @@ -36,11 +35,17 @@ MODULE_OBJS := \ ringworld/ringworld_scenes8.o \ ringworld/ringworld_scenes10.o \ ringworld/ringworld_speakers.o \ + ringworld2/ringworld2_dialogs.o \ + ringworld2/ringworld2_logic.o \ + ringworld2/ringworld2_scenes0.o \ + ringworld2/ringworld2_scenes2.o \ + ringworld2/ringworld2_speakers.o \ saveload.o \ scenes.o \ sound.o \ staticres.o \ - tsage.o + tsage.o \ + user_interface.o # This module can be built as a plugin ifeq ($(ENABLE_TSAGE), DYNAMIC_PLUGIN) diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index e83801d748..824f20e9b2 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -33,7 +33,7 @@ namespace TsAGE { MemoryManager::MemoryManager() { _memoryPool = new MemoryHeader*[MEMORY_POOL_SIZE]; - Common::set_to(&_memoryPool[0], &_memoryPool[MEMORY_POOL_SIZE], (MemoryHeader *)NULL); + Common::fill(&_memoryPool[0], &_memoryPool[MEMORY_POOL_SIZE], (MemoryHeader *)NULL); } MemoryManager::~MemoryManager() { @@ -67,7 +67,7 @@ uint16 MemoryManager::allocate(uint32 size) { byte *MemoryManager::allocate2(uint32 size) { uint32 idx = allocate(size); byte *result = lock(idx); - Common::set_to(result, result + size, 0); + Common::fill(result, result + size, 0); return result; } @@ -354,6 +354,8 @@ void TLib::loadIndex() { se.resNum = resNum; se.resType = (ResourceType)(configId & 0x1f); se.fileOffset = (((configId >> 5) & 0x7ff) << 16) | fileOffset; + if (g_vm->getGameID() == GType_Ringworld2) + se.fileOffset <<= 4; _sections.push_back(se); } @@ -412,16 +414,27 @@ byte *TLib::getSubResource(int resNum, int rlbNum, int index, uint *size, bool s */ bool TLib::getMessage(int resNum, int lineNum, Common::String &result, bool suppressErrors) { byte *msgData = getResource(RES_MESSAGE, resNum, 0, true); - if (!msgData) { + if (!msgData || (lineNum < 0)) { if (suppressErrors) return false; error("Unknown message %d line %d", resNum, lineNum); } + int msgSize = _memoryManager.getSize(msgData); const char *srcP = (const char *)msgData; - while (lineNum-- > 0) + const char *endP = srcP + msgSize; + + while (lineNum-- > 0) { srcP += strlen(srcP) + 1; + + if (srcP >= endP) { + if (suppressErrors) + return false; + + error("Unknown message %d line %d", resNum, lineNum); + } + } result = Common::String(srcP); _memoryManager.deallocate(msgData); @@ -501,7 +514,7 @@ Common::String ResourceManager::getMessage(int resNum, int lineNum, bool suppres if (!suppressErrors) error("Unknown message %d line %d", resNum, lineNum); - return result; + return Common::String(); } } // end of namespace TsAGE diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h index 176d60fcc4..0410fa3f42 100644 --- a/engines/tsage/resources.h +++ b/engines/tsage/resources.h @@ -29,7 +29,6 @@ #include "common/list.h" #include "common/str.h" #include "common/str-array.h" -#include "common/textconsole.h" #include "common/util.h" #include "graphics/surface.h" @@ -42,7 +41,10 @@ const int MEMORY_POOL_SIZE = 1000; enum ResourceType { RES_LIBRARY, RES_STRIP, RES_IMAGE, RES_PALETTE, RES_VISAGE, RES_SOUND, RES_MESSAGE, RES_FONT, RES_POINTER, RES_BANK, RES_SND_DRIVER, RES_PRIORITY, RES_CONTROL, RES_WALKRGNS, - RES_BITMAP, RES_SAVE, RES_SEQUENCE }; + RES_BITMAP, RES_SAVE, RES_SEQUENCE, + // Return to Ringworld specific resource types + RT17, RT18, RT19, RT20, RT21, RT22, RT23, RT24, RT25, RT26, RT27, RT28, RT29, RT30, RT31 +}; class MemoryHeader { public: diff --git a/engines/tsage/ringworld/ringworld_demo.cpp b/engines/tsage/ringworld/ringworld_demo.cpp index adf4aae9dd..fedb19c804 100644 --- a/engines/tsage/ringworld/ringworld_demo.cpp +++ b/engines/tsage/ringworld/ringworld_demo.cpp @@ -41,6 +41,14 @@ Scene *RingworldDemoGame::createScene(int sceneNumber) { return new RingworldDemoScene(); } +bool RingworldDemoGame::canLoadGameStateCurrently() { + return false; +} + +bool RingworldDemoGame::canSaveGameStateCurrently() { + return false; +} + void RingworldDemoGame::quitGame() { if (MessageDialog::show(DEMO_EXIT_MSG, EXIT_BTN_STRING, DEMO_BTN_STRING) == 0) g_vm->quitGame(); diff --git a/engines/tsage/ringworld/ringworld_demo.h b/engines/tsage/ringworld/ringworld_demo.h index 30527b0aea..7c0ac39285 100644 --- a/engines/tsage/ringworld/ringworld_demo.h +++ b/engines/tsage/ringworld/ringworld_demo.h @@ -44,6 +44,8 @@ public: virtual Scene *createScene(int sceneNumber); virtual void quitGame(); virtual void processEvent(Event &event); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); }; class RingworldDemoScene: public Scene { diff --git a/engines/tsage/ringworld/ringworld_dialogs.cpp b/engines/tsage/ringworld/ringworld_dialogs.cpp index 9d1a7effc2..37101c9c58 100644 --- a/engines/tsage/ringworld/ringworld_dialogs.cpp +++ b/engines/tsage/ringworld/ringworld_dialogs.cpp @@ -210,13 +210,249 @@ void RightClickDialog::execute() { break; case 6: // Dialog options - OptionsDialog::show(); + Ringworld::OptionsDialog::show(); break; } _gfxManager.deactivate(); } +/*--------------------------------------------------------------------------*/ + +void OptionsDialog::show() { + OptionsDialog *dlg = new OptionsDialog(); + dlg->draw(); + + GfxButton *btn = dlg->execute(); + + if (btn == &dlg->_btnQuit) { + // Quit game + if (MessageDialog::show(QUIT_CONFIRM_MSG, CANCEL_BTN_STRING, QUIT_BTN_STRING) == 1) { + g_vm->quitGame(); + } + } else if (btn == &dlg->_btnRestart) { + // Restart game + g_globals->_game->restartGame(); + } else if (btn == &dlg->_btnSound) { + // Sound dialog + SoundDialog::execute(); + } else if (btn == &dlg->_btnSave) { + // Save button + g_globals->_game->saveGame(); + } else if (btn == &dlg->_btnRestore) { + // Restore button + g_globals->_game->restoreGame(); + } + + dlg->remove(); + delete dlg; +} + +OptionsDialog::OptionsDialog() { + // Set the element text + _gfxMessage.set(OPTIONS_MSG, 140, ALIGN_LEFT); + _btnRestore.setText(RESTORE_BTN_STRING); + _btnSave.setText(SAVE_BTN_STRING); + _btnRestart.setText(RESTART_BTN_STRING); + _btnQuit.setText(QUIT_BTN_STRING); + _btnSound.setText(SOUND_BTN_STRING); + _btnResume.setText(RESUME_BTN_STRING); + + // Set position of the elements + _gfxMessage._bounds.moveTo(0, 1); + _btnRestore._bounds.moveTo(0, _gfxMessage._bounds.bottom + 1); + _btnSave._bounds.moveTo(0, _btnRestore._bounds.bottom + 1); + _btnRestart._bounds.moveTo(0, _btnSave._bounds.bottom + 1); + _btnQuit._bounds.moveTo(0, _btnRestart._bounds.bottom + 1); + _btnSound._bounds.moveTo(0, _btnQuit._bounds.bottom + 1); + _btnResume._bounds.moveTo(0, _btnSound._bounds.bottom + 1); + + // Set all the buttons to the widest button + GfxButton *btnList[6] = {&_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume}; + int16 btnWidth = 0; + for (int idx = 0; idx < 6; ++idx) + btnWidth = MAX(btnWidth, btnList[idx]->_bounds.width()); + for (int idx = 0; idx < 6; ++idx) + btnList[idx]->_bounds.setWidth(btnWidth); + + // Add the items to the dialog + addElements(&_gfxMessage, &_btnRestore, &_btnSave, &_btnRestart, &_btnQuit, &_btnSound, &_btnResume, NULL); + + // Set the dialog size and position + frame(); + setCenter(160, 100); +} + +/*--------------------------------------------------------------------------*/ + +bool GfxInvImage::process(Event &event) { + if (!event.handled && (event.eventType == EVENT_BUTTON_DOWN)) { + event.handled = _bounds.contains(event.mousePos); + return event.handled; + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +void InventoryDialog::show() { + // Determine how many items are in the player's inventory + int itemCount = 0; + SynchronizedList<InvObject *>::iterator i; + for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) { + if ((*i)->inInventory()) + ++itemCount; + } + + if (itemCount == 0) { + MessageDialog::show(INV_EMPTY_MSG, OK_BTN_STRING); + return; + } + + InventoryDialog *dlg = new InventoryDialog(); + dlg->draw(); + dlg->execute(); + delete dlg; +} + +InventoryDialog::InventoryDialog() { + // Determine the maximum size of the image of any item in the player's inventory + int imgWidth = 0, imgHeight = 0; + + SynchronizedList<InvObject *>::iterator i; + for (i = RING_INVENTORY._itemList.begin(); i != RING_INVENTORY._itemList.end(); ++i) { + InvObject *invObject = *i; + if (invObject->inInventory()) { + // Get the image for the item + GfxSurface itemSurface = surfaceFromRes(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum); + + // Maintain the dimensions of the largest item image + imgWidth = MAX(imgWidth, (int)itemSurface.getBounds().width()); + imgHeight = MAX(imgHeight, (int)itemSurface.getBounds().height()); + + // Add the item to the display list + GfxInvImage *img = new GfxInvImage(); + _images.push_back(img); + img->setDetails(invObject->_displayResNum, invObject->_rlbNum, invObject->_cursorNum); + img->_invObject = invObject; + add(img); + } + } + assert(_images.size() > 0); + + // Figure out the number of columns/rows to show all the items + int cellsSize = 3; + while ((cellsSize * cellsSize) < (int)_images.size()) + ++cellsSize; + + // Set the position of each inventory item to be displayed + int cellX = 0; + Common::Point pt(0, 0); + + for (uint idx = 0; idx < _images.size(); ++idx) { + if (cellX == cellsSize) { + // Move to the start of the next line + pt.x = 0; + pt.y += imgHeight + 2; + cellX = 0; + } + + _images[idx]->_bounds.moveTo(pt.x, pt.y); + + pt.x += imgWidth + 2; + ++cellX; + } + + // Set up the buttons + pt.y += imgHeight + 2; + _btnOk.setText(OK_BTN_STRING); + _btnOk._bounds.moveTo((imgWidth + 2) * cellsSize - _btnOk._bounds.width(), pt.y); + _btnLook.setText(LOOK_BTN_STRING); + _btnLook._bounds.moveTo(_btnOk._bounds.left - _btnLook._bounds.width() - 2, _btnOk._bounds.top); + addElements(&_btnLook, &_btnOk, NULL); + + frame(); + setCenter(SCREEN_CENTER_X, SCREEN_CENTER_Y); +} + +InventoryDialog::~InventoryDialog() { + for (uint idx = 0; idx < _images.size(); ++idx) + delete _images[idx]; +} + +void InventoryDialog::execute() { + if ((RING_INVENTORY._selectedItem) && RING_INVENTORY._selectedItem->inInventory()) + RING_INVENTORY._selectedItem->setCursor(); + + GfxElement *hiliteObj; + bool lookFlag = false; + _gfxManager.activate(); + + while (!g_vm->shouldQuit()) { + // Get events + Event event; + while (!g_globals->_events.getEvent(event) && !g_vm->shouldQuit()) { + g_system->delayMillis(10); + g_system->updateScreen(); + } + if (g_vm->shouldQuit()) + break; + + hiliteObj = NULL; + if ((event.eventType == EVENT_BUTTON_DOWN) && !_bounds.contains(event.mousePos)) + break; + + // Pass event to elements + event.mousePos.x -= _gfxManager._bounds.left; + event.mousePos.y -= _gfxManager._bounds.top; + + for (GfxElementList::iterator i = _elements.begin(); i != _elements.end(); ++i) { + if ((*i)->process(event)) + hiliteObj = *i; + } + + if (!event.handled && event.eventType == EVENT_KEYPRESS) { + if ((event.kbd.keycode == Common::KEYCODE_RETURN) || (event.kbd.keycode == Common::KEYCODE_ESCAPE)) { + // Exit the dialog + //hiliteObj = &_btnOk; + break; + } + } + + if (hiliteObj == &_btnOk) { + // Ok button clicked + if (lookFlag) + g_globals->_events.setCursor(CURSOR_WALK); + break; + } else if (hiliteObj == &_btnLook) { + // Look button clicked + if (_btnLook._message == LOOK_BTN_STRING) { + _btnLook._message = PICK_BTN_STRING; + lookFlag = 1; + g_globals->_events.setCursor(CURSOR_LOOK); + } else { + _btnLook._message = LOOK_BTN_STRING; + lookFlag = 0; + g_globals->_events.setCursor(CURSOR_WALK); + } + + hiliteObj->draw(); + } else if (hiliteObj) { + // Inventory item selected + InvObject *invObject = static_cast<GfxInvImage *>(hiliteObj)->_invObject; + if (lookFlag) { + g_globals->_screenSurface.displayText(invObject->_description); + } else { + RING_INVENTORY._selectedItem = invObject; + invObject->setCursor(); + } + } + } + + _gfxManager.deactivate(); +} + } // End of namespace Ringworld } // End of namespace TsAGE diff --git a/engines/tsage/ringworld/ringworld_dialogs.h b/engines/tsage/ringworld/ringworld_dialogs.h index 11a8f10e70..b14b3f6d78 100644 --- a/engines/tsage/ringworld/ringworld_dialogs.h +++ b/engines/tsage/ringworld/ringworld_dialogs.h @@ -63,6 +63,45 @@ public: void execute(); }; +class OptionsDialog : public ModalDialog { +private: + GfxButton _btnSave, _btnRestore, _btnRestart; + GfxButton _btnQuit, _btnResume; + GfxButton _btnSound; + GfxMessage _gfxMessage; +public: + OptionsDialog(); + virtual ~OptionsDialog() {} + GfxButton *execute() { return GfxDialog::execute(&_btnResume); } + + static void show(); +}; + +/*--------------------------------------------------------------------------*/ + +class GfxInvImage : public GfxImage { +public: + InvObject *_invObject; +public: + GfxInvImage() : GfxImage(), _invObject(NULL) {} + + virtual bool process(Event &event); +}; + +#define MAX_INVOBJECT_DISPLAY 20 + +class InventoryDialog : public ModalDialog { +private: + Common::Array<GfxInvImage *> _images; + GfxButton _btnOk, _btnLook; +public: + InventoryDialog(); + virtual ~InventoryDialog(); + void execute(); + + static void show(); +}; + } // End of namespace Ringworld } // End of namespace TsAGE diff --git a/engines/tsage/ringworld/ringworld_logic.cpp b/engines/tsage/ringworld/ringworld_logic.cpp index 3fb284f5da..ad67b66f69 100644 --- a/engines/tsage/ringworld/ringworld_logic.cpp +++ b/engines/tsage/ringworld/ringworld_logic.cpp @@ -192,6 +192,20 @@ Scene *RingworldGame::createScene(int sceneNumber) { } } +/** + * Returns true if it is currently okay to restore a game + */ +bool RingworldGame::canLoadGameStateCurrently() { + return !g_globals->getFlag(50); +} + +/** + * Returns true if it is currently okay to save the game + */ +bool RingworldGame::canSaveGameStateCurrently() { + return !g_globals->getFlag(50); +} + /*--------------------------------------------------------------------------*/ DisplayHotspot::DisplayHotspot(int regionId, ...) { @@ -572,6 +586,106 @@ void RingworldGame::rightClick() { delete dlg; } +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +void NamedHotspot::doAction(int action) { + switch (action) { + case CURSOR_WALK: + // Nothing + return; + case CURSOR_LOOK: + if (_lookLineNum == -1) + break; + + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + case CURSOR_USE: + if (_useLineNum == -1) + break; + + SceneItem::display(_resNum, _useLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + case CURSOR_TALK: + if (_talkLineNum == -1) + break; + + SceneItem::display(_resNum, _lookLineNum, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return; + default: + break; + } + + SceneHotspot::doAction(action); +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + + } // End of namespace Ringworld } // End of namespace TsAGE diff --git a/engines/tsage/ringworld/ringworld_logic.h b/engines/tsage/ringworld/ringworld_logic.h index 84816347af..6f6a66cc26 100644 --- a/engines/tsage/ringworld/ringworld_logic.h +++ b/engines/tsage/ringworld/ringworld_logic.h @@ -155,6 +155,33 @@ public: virtual Scene *createScene(int sceneNumber); virtual void processEvent(Event &event); virtual void rightClick(); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); +}; + +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + virtual void doAction(int action); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + 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); + } }; } // End of namespace Ringworld diff --git a/engines/tsage/ringworld/ringworld_scenes1.cpp b/engines/tsage/ringworld/ringworld_scenes1.cpp index 8227e2a884..4d9d565705 100644 --- a/engines/tsage/ringworld/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld/ringworld_scenes1.cpp @@ -2607,7 +2607,7 @@ void Scene90::stripCallback(int v) { Scene90 *scene = (Scene90 *)g_globals->_sceneManager._scene; if (v == 1) - scene->_object2.animate(ANIM_MODE_7, NULL); + scene->_object2.animate(ANIM_MODE_7, 0, NULL); else if (v == 2) scene->_object2.animate(ANIM_MODE_NONE); } diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp index 9a9f63705b..f9a8e7996a 100644 --- a/engines/tsage/ringworld/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld/ringworld_scenes10.cpp @@ -20,7 +20,6 @@ * */ -#include "graphics/cursorman.h" #include "tsage/ringworld/ringworld_scenes10.h" #include "tsage/scenes.h" #include "tsage/tsage.h" @@ -54,6 +53,7 @@ void Object9350::draw() { * Scene 9100 - Near beach: Slave washing clothes * *--------------------------------------------------------------------------*/ +// Slave hotspot void Scene9100::SceneHotspot1::doAction(int action) { Scene9100 *scene = (Scene9100 *)g_globals->_sceneManager._scene; @@ -102,7 +102,7 @@ void Scene9100::signal() { g_globals->_sceneManager.changeScene(9150); break; case 9105: - _sceneHotspot3.remove(); + _hotspotCleanedClothes.remove(); // No break on purpose case 9103: case 9104: @@ -145,13 +145,13 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { _object6.setStrip(6); _object6.setFrame(1); _object6.setPosition(Common::Point(138, 166)); - _sceneHotspot3.setDetails(145, 125, 166, 156, 9100, 40, 43); + _hotspotCleanedClothes.setDetails(145, 125, 166, 156, 9100, 40, 43); } - _sceneHotspot1.setDetails(140, 176, 185, 215, 9100, 36, 37); - _sceneHotspot2.setDetails(161, 138, 182, 175, 9100, 38, 39); - _sceneHotspot4.setDetails(37, 196, 47, 320, 9100, 44, -1); - _sceneHotspot5.setDetails(69, 36, 121, 272, 9100, 45, 46); - _sceneHotspot6.setDetails(127, 0, 200, 52, 9100, 47, 48); + _hotspotSlave.setDetails(140, 176, 185, 215, 9100, 36, 37); + _hotspotSoiledClothes.setDetails(161, 138, 182, 175, 9100, 38, 39); + _hotspotIsland.setDetails(37, 196, 47, 320, 9100, 44, -1); + _hotspotBoulders.setDetails(69, 36, 121, 272, 9100, 45, 46); + _hotspotTrees.setDetails(127, 0, 200, 52, 9100, 47, 48); g_globals->_soundHandler.play(251); if (g_globals->_sceneManager._previousScene == 9150) { @@ -708,7 +708,7 @@ void Scene9360::postInit(SceneObjectList *OwnerList) { * *--------------------------------------------------------------------------*/ Scene9400::Scene9400() { - _field1032 = 0; + _hittingAnvil = false; } void Scene9400::SceneHotspot7::doAction(int action) { @@ -766,12 +766,12 @@ void Scene9400::signal() { void Scene9400::dispatch() { if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){ - if (_field1032 == 0) { + if (_hittingAnvil == false) { _soundHandler.play(296); - _field1032 = 1; + _hittingAnvil = true; } } else { - _field1032 = 0; + _hittingAnvil = false; } if (_action == 0) { if (g_globals->_player._position.y < 120) { @@ -825,7 +825,7 @@ void Scene9400::postInit(SceneObjectList *OwnerList) { void Scene9400::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() >= 3) - s.syncAsSint16LE(_field1032); + s.syncAsSint16LE(_hittingAnvil); } /*-------------------------------------------------------------------------- @@ -1181,7 +1181,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { _object2.setFrame(_object2.getFrameCount()); _object2.setPosition(Common::Point(303, 130)); _object2.fixPriority(132); - if (RING_INVENTORY._helmet._sceneNumber == 1) { + if (RING_INVENTORY._helmet._sceneNumber != 1) { _hotspot2.setDetails(87, 294, 104, 314, 9400, 17, -1); } else { _object2.setStrip(2); diff --git a/engines/tsage/ringworld/ringworld_scenes10.h b/engines/tsage/ringworld/ringworld_scenes10.h index 6bca48776b..48859ab454 100644 --- a/engines/tsage/ringworld/ringworld_scenes10.h +++ b/engines/tsage/ringworld/ringworld_scenes10.h @@ -80,12 +80,12 @@ public: SceneObject _object4; SceneObject _object5; SceneObject _object6; - SceneHotspot1 _sceneHotspot1; - NamedHotspot _sceneHotspot2; - NamedHotspot _sceneHotspot3; - NamedHotspot _sceneHotspot4; - NamedHotspot _sceneHotspot5; - NamedHotspot _sceneHotspot6; + SceneHotspot1 _hotspotSlave; + NamedHotspot _hotspotSoiledClothes; + NamedHotspot _hotspotCleanedClothes; + NamedHotspot _hotspotIsland; + NamedHotspot _hotspotBoulders; + NamedHotspot _hotspotTrees; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void signal(); @@ -236,7 +236,7 @@ public: NamedHotspot _hotspot5; NamedHotspot _hotspot6; ASound _soundHandler; - int _field1032; + bool _hittingAnvil; SceneHotspot7 _hotspot7; SceneHotspot8 _hotspot8; diff --git a/engines/tsage/ringworld/ringworld_scenes3.cpp b/engines/tsage/ringworld/ringworld_scenes3.cpp index 7103a48ed9..81190aea7b 100644 --- a/engines/tsage/ringworld/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld/ringworld_scenes3.cpp @@ -453,14 +453,14 @@ void Scene2000::stripCallback(int v) { switch (v) { case 0: _object9.setStrip(3); - _object9.animate(ANIM_MODE_7, NULL); + _object9.animate(ANIM_MODE_7, 0, NULL); _object10.setStrip(6); _object10.setFrame(1); _object10.animate(ANIM_MODE_5, NULL); break; case 1: _object10.setStrip(5); - _object10.animate(ANIM_MODE_7, NULL); + _object10.animate(ANIM_MODE_7, 0, NULL); _object9.setStrip(4); _object9.setFrame(1); _object9.animate(ANIM_MODE_5, NULL); @@ -1921,7 +1921,7 @@ void Scene2100::stripCallback(int v) { switch (v) { case 1: _object4._numFrames = 4; - _object4.animate(ANIM_MODE_7, NULL); + _object4.animate(ANIM_MODE_7, 0, NULL); break; case 2: _object4.animate(ANIM_MODE_NONE, NULL); diff --git a/engines/tsage/ringworld/ringworld_scenes5.cpp b/engines/tsage/ringworld/ringworld_scenes5.cpp index 3cf1207e9e..49726eba2e 100644 --- a/engines/tsage/ringworld/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld/ringworld_scenes5.cpp @@ -1478,7 +1478,7 @@ void Scene4025::Hole::doAction(int action) { void Scene4025::Peg::synchronize(Serializer &s) { SceneObject::synchronize(s); - s.syncAsSint16LE(_field88); + s.syncAsSint16LE(_pegId); s.syncAsSint16LE(_armStrip); } @@ -1513,35 +1513,35 @@ void Scene4025::postInit(SceneObjectList *OwnerList) { _pegPtr = _pegPtr2 = NULL; _peg1.postInit(); - _peg1._field88 = 1; + _peg1._pegId = 1; _peg1.setVisage(4025); _peg1.setStrip(2); _peg1.setFrame(1); _peg1.setPosition(Common::Point(203, 61)); _peg2.postInit(); - _peg2._field88 = 4; + _peg2._pegId = 4; _peg2.setVisage(4025); _peg2.setStrip(2); _peg2.setFrame(2); _peg2.setPosition(Common::Point(195, 57)); _peg3.postInit(); - _peg3._field88 = 0; + _peg3._pegId = 0; _peg3.setVisage(4025); _peg3.setStrip(2); _peg3.setFrame(3); _peg3.setPosition(Common::Point(202, 66)); _peg4.postInit(); - _peg4._field88 = 3; + _peg4._pegId = 3; _peg4.setVisage(4025); _peg4.setStrip(2); _peg4.setFrame(4); _peg4.setPosition(Common::Point(194, 68)); _peg5.postInit(); - _peg5._field88 = 2; + _peg5._pegId = 2; _peg5.setVisage(4025); _peg5.setStrip(1); _peg5.setFrame(5); @@ -2173,7 +2173,7 @@ void Scene4050::Action4::signal() { case 5: scene->_hotspot16.setStrip2(4); scene->_hotspot16.setFrame(1); - scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this);; + scene->_hotspot16.animate(ANIM_MODE_4, 4, 1, this); break; case 6: scene->_hotspot16.animate(ANIM_MODE_5, NULL); @@ -4311,7 +4311,7 @@ void Scene4301::Action1::signal() { setDelay(20); break; case 21: - scene->_field68E = true; + scene->_puzzleDone = true; remove(); break; } @@ -4412,7 +4412,7 @@ void Scene4301::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _field68E = false; + _puzzleDone = false; RING_INVENTORY._stasisBox2._sceneNumber = 1; _hotspot4.setDetails(97, 76, 127, 102, 4300, 5, 6); @@ -4432,8 +4432,8 @@ void Scene4301::postInit(SceneObjectList *OwnerList) { void Scene4301::dispatch() { if (_action) { _action->dispatch(); - } else if (_field68E) { - _field68E = 0; + } else if (_puzzleDone) { + _puzzleDone = false; g_globals->clearFlag(50); g_globals->_sceneManager._fadeMode = FADEMODE_NONE; g_globals->_sceneManager.setNewScene(4300); diff --git a/engines/tsage/ringworld/ringworld_scenes5.h b/engines/tsage/ringworld/ringworld_scenes5.h index 80e67755bd..c93df2a1d8 100644 --- a/engines/tsage/ringworld/ringworld_scenes5.h +++ b/engines/tsage/ringworld/ringworld_scenes5.h @@ -215,10 +215,10 @@ class Scene4025 : public Scene { }; class Peg : public SceneObject { public: - int _field88; + int _pegId; int _armStrip; - Peg() : SceneObject() { _field88 = 0; _armStrip = 3; } + Peg() : SceneObject() { _pegId = 0; _armStrip = 3; } virtual void synchronize(Serializer &s); virtual void doAction(int action); }; @@ -682,13 +682,13 @@ public: SceneObject _hotspot1, _hotspot2, _hotspot3; Hotspot4 _hotspot4; Hotspot5 _hotspot5; - bool _field68E; + bool _puzzleDone; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void dispatch(); virtual void synchronize(Serializer &s) { Scene::synchronize(s); - s.syncAsSint16LE(_field68E); + s.syncAsSint16LE(_puzzleDone); } }; diff --git a/engines/tsage/ringworld/ringworld_scenes6.cpp b/engines/tsage/ringworld/ringworld_scenes6.cpp index cd3415f511..30a91b57aa 100644 --- a/engines/tsage/ringworld/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld/ringworld_scenes6.cpp @@ -1124,7 +1124,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _hotspot4.setVisage(5363); _hotspot4.setPosition(Common::Point(1025, 65)); _hotspot4.setStrip(4); - _hotspot4.animate(ANIM_MODE_7, 0, NULL);; + _hotspot4.animate(ANIM_MODE_7, 0, NULL); g_globals->_sceneItems.push_back(&_hotspot4); _hotspot9.postInit(); @@ -1562,7 +1562,7 @@ void Scene5200::Hotspot9::doAction(int action) { SceneItem::display2(5200, 14); break; default: - SceneItem::doAction(action); + SceneHotspot::doAction(action); break; } } diff --git a/engines/tsage/ringworld/ringworld_scenes8.cpp b/engines/tsage/ringworld/ringworld_scenes8.cpp index f8fb8b01e7..9cb85a6930 100644 --- a/engines/tsage/ringworld/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld/ringworld_scenes8.cpp @@ -1879,12 +1879,12 @@ void Scene7700::SceneHotspot8::doAction(int action) { scene->_soundHandler.play(259); scene->_object15.setFrame(scene->_object15.getFrameCount()); scene->_object15.animate(ANIM_MODE_6, scene); - if ((scene->_field977 == 2) && (scene->_field97B == 0)) { - scene->_field979++; + if ((scene->_seatCountLeft1 == 2) && (scene->_seatCountLeft2 == 0)) { + scene->_seatCountRight++; } else { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; + scene->_seatCountLeft2 = 0; + scene->_seatCountRight = 0; + scene->_seatCountLeft1 = 0; } break; default: @@ -1905,26 +1905,26 @@ void Scene7700::SceneHotspot9::doAction(int action) { scene->_soundHandler.play(259); scene->_object15.setFrame(1); scene->_object15.animate(ANIM_MODE_5, scene); - if (scene->_field977 > 2) { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; + if (scene->_seatCountLeft1 > 2) { + scene->_seatCountLeft2 = 0; + scene->_seatCountRight = 0; + scene->_seatCountLeft1 = 0; } - if (scene->_field979 != 0) { - if (scene->_field979 != 4) { - scene->_field97B = 0; - scene->_field979 = 0; - scene->_field977 = 0; + if (scene->_seatCountRight != 0) { + if (scene->_seatCountRight != 4) { + scene->_seatCountLeft2 = 0; + scene->_seatCountRight = 0; + scene->_seatCountLeft1 = 0; } else { - scene->_field97B++; - if (scene->_field97B == 3) { + scene->_seatCountLeft2++; + if (scene->_seatCountLeft2 == 3) { g_globals->_player.disableControl(); scene->setAction(&scene->_action3); } } } else { - scene->_field977++; + scene->_seatCountLeft1++; } break; default: @@ -2315,9 +2315,9 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { Scene::postInit(); setZoomPercents(100, 80, 200, 100); g_globals->setFlag(53); - _field97B = 0; - _field979 = 0; - _field977 = 0; + _seatCountLeft2 = 0; + _seatCountRight = 0; + _seatCountLeft1 = 0; _stripManager.addSpeaker(&_speakerEText); _stripManager.addSpeaker(&_speakerQText); @@ -2538,9 +2538,9 @@ Scene7700::Scene7700() { void Scene7700::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() >= 3) { - s.syncAsSint16LE(_field977); - s.syncAsSint16LE(_field979); - s.syncAsSint16LE(_field97B); + s.syncAsSint16LE(_seatCountLeft1); + s.syncAsSint16LE(_seatCountRight); + s.syncAsSint16LE(_seatCountLeft2); } } diff --git a/engines/tsage/ringworld/ringworld_scenes8.h b/engines/tsage/ringworld/ringworld_scenes8.h index 84178c36f9..b24f220f8c 100644 --- a/engines/tsage/ringworld/ringworld_scenes8.h +++ b/engines/tsage/ringworld/ringworld_scenes8.h @@ -480,7 +480,7 @@ public: SceneHotspot11 _sceneHotspot34; SceneHotspot11 _sceneHotspot35; SceneHotspot11 _sceneHotspot36; - int _field977, _field979, _field97B; + int _seatCountLeft1, _seatCountRight, _seatCountLeft2; Scene7700(); virtual void postInit(SceneObjectList *OwnerList = NULL); diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp new file mode 100644 index 0000000000..ddb4eae9c4 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp @@ -0,0 +1,447 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/translation.h" + +#include "gui/dialog.h" +#include "gui/widget.h" + +#include "tsage/tsage.h" +#include "tsage/core.h" +#include "tsage/dialogs.h" +#include "tsage/staticres.h" +#include "tsage/globals.h" +#include "tsage/ringworld2/ringworld2_dialogs.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/** + * This dialog implements the right-click dialog + */ +RightClickDialog::RightClickDialog() : GfxDialog() { + // Setup button positions + _btnList[0] = Common::Point(48, 12); + _btnList[1] = Common::Point(31, 29); + _btnList[2] = Common::Point(65, 29); + _btnList[3] = Common::Point(14, 47); + _btnList[4] = Common::Point(48, 47); + _btnList[5] = Common::Point(83, 47); + + // Set the palette and change the cursor + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + + setPalette(); + + // Get the dialog image and selected button images + if (R2_GLOBALS._sceneManager._sceneNumber == 2900) { + _surface = surfaceFromRes(2902, 1, 1); + _btnImages.setVisage(2902, 2); + } else { + _surface = surfaceFromRes(1, 1, 1); + _btnImages.setVisage(1, 2); + } + + // Set the dialog position + Rect dialogRect; + dialogRect.resize(_surface, 0, 0, 100); + dialogRect.center(g_globals->_events._mousePos.x, g_globals->_events._mousePos.y); + + // Ensure the dialog will be entirely on-screen + Rect screenRect = g_globals->gfxManager()._bounds; + screenRect.collapse(4, 4); + dialogRect.contain(screenRect); + + _bounds = dialogRect; + _gfxManager._bounds = _bounds; + + _highlightedAction = -1; + _selectedAction = -1; +} + +RightClickDialog::~RightClickDialog() { +} + +void RightClickDialog::draw() { + // Save the covered background area + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + + // Draw the dialog image + g_globals->gfxManager().copyFrom(_surface, _bounds.left, _bounds.top); +} + +bool RightClickDialog::process(Event &event) { + switch (event.eventType) { + case EVENT_MOUSE_MOVE: { + // Check whether a button is highlighted + int buttonIndex; + for (buttonIndex = 5; buttonIndex >= 0; --buttonIndex) { + Rect tempRect(0, 0, 28, 29); + tempRect.moveTo(_btnList[buttonIndex].x, _btnList[buttonIndex].y); + + if (tempRect.contains(event.mousePos)) + break; + } + // If selection has changed, handle it + if (buttonIndex != _highlightedAction) { + if (_highlightedAction != -1) { + // Another button was previously selected, so restore dialog + _gfxManager.copyFrom(_surface, 0, 0); + } + + if (buttonIndex != -1) { + // Draw newly selected button + GfxSurface btn = _btnImages.getFrame(buttonIndex + 1); + _gfxManager.copyFrom(btn, _btnList[buttonIndex].x, _btnList[buttonIndex].y); + } + + _highlightedAction = buttonIndex; + } + + event.handled = true; + return true; + } + + case EVENT_BUTTON_DOWN: + // Specify the selected action + _selectedAction = (_highlightedAction == -1) ? 999 : _highlightedAction; + event.handled = true; + return true; + + default: + break; + } + + return false; +} + +void RightClickDialog::execute() { + // Draw the dialog + draw(); + + // Dialog event handler loop + _gfxManager.activate(); + + while (!g_vm->shouldQuit() && (_selectedAction == -1)) { + Event evt; + while (g_globals->_events.getEvent(evt, EVENT_MOUSE_MOVE | EVENT_BUTTON_DOWN)) { + evt.mousePos.x -= _bounds.left; + evt.mousePos.y -= _bounds.top; + + process(evt); + } + + g_system->delayMillis(10); + g_system->updateScreen(); + } + + // Execute the specified action + CursorType cursorNum = CURSOR_NONE; + switch (_selectedAction) { + case 0: + // Look action + cursorNum = CURSOR_LOOK; + break; + case 1: + // Walk action + cursorNum = CURSOR_WALK; + break; + case 2: + // Use action + cursorNum = CURSOR_USE; + break; + case 3: + // Talk action + cursorNum = CURSOR_TALK; + break; + case 4: + // Change player + CharacterDialog::show(); + break; + case 5: + // Options dialog + break; + } + + if (cursorNum != CURSOR_NONE) + R2_GLOBALS._events.setCursor(cursorNum); + + _gfxManager.deactivate(); +} + +/*--------------------------------------------------------------------------*/ + +void CharacterDialog::show() { + CharacterDialog *dlg = new CharacterDialog(); + dlg->draw(); + + // Make the default button the currently active character + GfxButton *btn = NULL; + int oldCharacter = R2_GLOBALS._player._characterIndex; + switch (oldCharacter) { + case 1: + btn = &dlg->_btnQuinn; + break; + case 2: + btn = &dlg->_btnSeeker; + break; + case 3: + btn = &dlg->_btnMiranda; + break; + default: + break; + } + + // Show the character selection dialog + btn = dlg->execute(btn); + + // Figure out the new selected character + if (btn == &dlg->_btnQuinn) + R2_GLOBALS._player._characterIndex = R2_QUINN; + else if (btn == &dlg->_btnSeeker) + R2_GLOBALS._player._characterIndex = R2_SEEKER; + else if (btn == &dlg->_btnMiranda) + R2_GLOBALS._player._characterIndex = R2_MIRANDA; + + // Remove the dialog + dlg->remove(); + delete dlg; + + // Only do transfer if a different character was selected + if (R2_GLOBALS._player._characterIndex != oldCharacter) { + // Save the details of the previously active character + SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene; + scene->saveCharacter(oldCharacter); + + // Play a transition sound as the character is changed + if (R2_GLOBALS._player._characterScene[0] != 300) { + switch (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex]) { + case 0: + R2_GLOBALS._sound4.stop(); + break; + case 1: + R2_GLOBALS._sound4.play(45); + break; + case 2: + R2_GLOBALS._sound4.play(4); + break; + case 3: + R2_GLOBALS._sound4.play(5); + break; + case 4: + R2_GLOBALS._sound4.play(6); + break; + default: + break; + } + } else if (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex] > 1) { + switch (R2_GLOBALS._v565F1[R2_GLOBALS._player._characterIndex]) { + case 2: + R2_GLOBALS._sound4.play(45); + break; + case 3: + R2_GLOBALS._sound4.play(4); + break; + case 4: + R2_GLOBALS._sound4.play(5); + break; + case 5: + R2_GLOBALS._sound4.play(6); + break; + default: + break; + } + } else if ((R2_GLOBALS._player._characterScene[1] == 300) && (R2_GLOBALS._v565F1[1] != 1)) { + switch (R2_GLOBALS._v565F1[1]) { + case 2: + R2_GLOBALS._sound4.play(45); + break; + case 3: + R2_GLOBALS._sound4.play(4); + break; + case 4: + R2_GLOBALS._sound4.play(5); + break; + case 5: + R2_GLOBALS._sound4.play(6); + break; + default: + break; + } + } else if (R2_GLOBALS._player._characterScene[2] != 300) { + R2_GLOBALS._sound4.stop(); + } else if (R2_GLOBALS._v565F1[2] == 1) { + R2_GLOBALS._sound4.stop(); + } else { + switch (R2_GLOBALS._v565F1[1]) { + case 2: + R2_GLOBALS._sound4.play(45); + break; + case 3: + R2_GLOBALS._sound4.play(4); + break; + case 4: + R2_GLOBALS._sound4.play(5); + break; + case 5: + R2_GLOBALS._sound4.play(6); + break; + default: + break; + } + } + + // Change to whichever scene the newly selected character is in + R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex]); + } +} + +CharacterDialog::CharacterDialog() { + // Set the element text + _msgTitle.set(CHAR_TITLE, 140, ALIGN_LEFT); + _btnQuinn.setText(CHAR_QUINN_MSG); + _btnSeeker.setText(CHAR_SEEKER_MSG); + _btnMiranda.setText(CHAR_MIRANDA_MSG); + _btnCancel.setText(CHAR_CANCEL_MSG); + + // Set position of the elements + _msgTitle._bounds.moveTo(5, 5); + _btnQuinn._bounds.moveTo(25, _msgTitle._bounds.bottom + 1); + _btnSeeker._bounds.moveTo(25, _btnQuinn._bounds.bottom + 1); + _btnMiranda._bounds.moveTo(25, _btnSeeker._bounds.bottom + 1); + _btnCancel._bounds.moveTo(25, _btnMiranda._bounds.bottom + 1); + + // Add the items to the dialog + addElements(&_msgTitle, &_btnQuinn, &_btnSeeker, &_btnMiranda, &_btnCancel, NULL); + + // Set the dialog size and position + frame(); + _bounds.collapse(-6, -6); + setCenter(160, 100); +} + +/*--------------------------------------------------------------------------*/ + +void HelpDialog::show() { + // Set the palette and change the cursor + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + + // Create the dialog and draw it + HelpDialog *dlg = new HelpDialog(); + dlg->draw(); + + // Show the character selection dialog + GfxButton *btn = dlg->execute(&dlg->_btnResume); + + // If a function button was selected, take care of it + Event evt; + evt.eventType = EVENT_KEYPRESS; + evt.kbd.keycode = Common::KEYCODE_INVALID; + if (btn == &dlg->_btnList[0]) { + evt.kbd.keycode = Common::KEYCODE_F2; + } else if (btn == &dlg->_btnList[1]) { + evt.kbd.keycode = Common::KEYCODE_F3; + } else if (btn == &dlg->_btnList[2]) { + evt.kbd.keycode = Common::KEYCODE_F4; + } else if (btn == &dlg->_btnList[3]) { + evt.kbd.keycode = Common::KEYCODE_F5; + } else if (btn == &dlg->_btnList[4]) { + evt.kbd.keycode = Common::KEYCODE_F7; + } else if (btn == &dlg->_btnList[5]) { + evt.kbd.keycode = Common::KEYCODE_F8; + } else if (btn == &dlg->_btnList[6]) { + evt.kbd.keycode = Common::KEYCODE_F10; + } + + // Remove the dialog + dlg->remove(); + delete dlg; + + // If a action button was selected, dispatch to handle it + if (evt.kbd.keycode != Common::KEYCODE_INVALID) + R2_GLOBALS._game->processEvent(evt); +} + +HelpDialog::HelpDialog() { + // Set the title and game version + _msgTitle.set(HELP_MSG, 172, ALIGN_CENTER); + _msgTitle._bounds.moveTo(5, 0); + _msgVersion.set(GAME_VERSION, 172, ALIGN_CENTER); + _msgVersion._bounds.moveTo(5, _msgTitle._bounds.bottom + 3); + addElements(&_msgTitle, &_msgVersion, NULL); + + // Set buttons + _btnList[0].setText(F2); + _btnList[0]._bounds.moveTo(5, _msgVersion._bounds.bottom + 2); + _btnDescription[0].set(SOUND_OPTIONS, 140, ALIGN_LEFT); + _btnDescription[0]._bounds.moveTo(_btnList[0]._bounds.right + 2, _btnList[0]._bounds.top + 4); + + _btnList[1].setText(F3); + _btnList[1]._bounds.moveTo(5, _btnList[0]._bounds.bottom); + _btnDescription[1].set(QUIT_GAME, 140, ALIGN_LEFT); + _btnDescription[1]._bounds.moveTo(_btnList[1]._bounds.right + 2, _btnList[1]._bounds.top + 4); + + _btnList[2].setText(F4); + _btnList[2]._bounds.moveTo(5, _btnList[1]._bounds.bottom); + _btnDescription[2].set(RESTART_GAME, 140, ALIGN_LEFT); + _btnDescription[2]._bounds.moveTo(_btnList[2]._bounds.right + 2, _btnList[2]._bounds.top + 4); + + _btnList[3].setText(F5); + _btnList[3]._bounds.moveTo(5, _btnList[2]._bounds.bottom); + _btnDescription[3].set(SAVE_GAME, 140, ALIGN_LEFT); + _btnDescription[3]._bounds.moveTo(_btnList[3]._bounds.right + 2, _btnList[3]._bounds.top + 4); + + _btnList[4].setText(F7); + _btnList[4]._bounds.moveTo(5, _btnList[3]._bounds.bottom); + _btnDescription[4].set(RESTORE_GAME, 140, ALIGN_LEFT); + _btnDescription[4]._bounds.moveTo(_btnList[4]._bounds.right + 2, _btnList[4]._bounds.top + 4); + + _btnList[5].setText(F8); + _btnList[5]._bounds.moveTo(5, _btnList[4]._bounds.bottom); + _btnDescription[5].set(SHOW_CREDITS, 140, ALIGN_LEFT); + _btnDescription[5]._bounds.moveTo(_btnList[5]._bounds.right + 2, _btnList[5]._bounds.top + 4); + + _btnList[6].setText(F10); + _btnList[6]._bounds.moveTo(5, _btnList[5]._bounds.bottom); + _btnDescription[6].set(PAUSE_GAME, 140, ALIGN_LEFT); + _btnDescription[6]._bounds.moveTo(_btnList[6]._bounds.right + 2, _btnList[6]._bounds.top + 4); + + for (int i = 0; i < 7; ++i) { + addElements(&_btnList[i], &_btnDescription[i], NULL); + } + + // Add 'Resume' button + _btnResume.setText(RESUME_PLAY); + _btnResume._bounds.moveTo(5, _btnList[6]._bounds.bottom + 2); + addElements(&_btnResume, NULL); + + // Set the dialog size and position + frame(); + _bounds.collapse(-6, -6); + setCenter(160, 100); +} + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.h b/engines/tsage/ringworld2/ringworld2_dialogs.h new file mode 100644 index 0000000000..02a1aed81c --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_dialogs.h @@ -0,0 +1,91 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_DIALOGS_H +#define TSAGE_RINGWORLD2_DIALOGS_H + +#include "gui/options.h" +#include "tsage/dialogs.h" +#include "tsage/events.h" +#include "tsage/graphics.h" +#include "common/list.h" +#include "common/rect.h" +#include "common/system.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class RightClickDialog : public GfxDialog { +private: + GfxSurface _surface; + Visage _btnImages; + Common::Point _btnList[6]; + + Rect _rectList1[5]; + Rect _rectList2[5]; + Rect _rectList3[5]; + Rect _rectList4[5]; + + int _highlightedAction; + int _selectedAction; +public: + RightClickDialog(); + ~RightClickDialog(); + + virtual void draw(); + virtual bool process(Event &event); + void execute(); +}; + +class CharacterDialog: public GfxDialog { +private: + GfxMessage _msgTitle; + GfxButton _btnQuinn, _btnMiranda, _btnSeeker; + GfxButton _btnCancel; +public: + CharacterDialog(); + virtual ~CharacterDialog() {} + + static void show(); +}; + +class HelpDialog: public GfxDialog { +private: + GfxMessage _msgTitle, _msgVersion; + GfxButton _btnList[7]; + GfxMessage _btnDescription[7]; + GfxButton _btnResume; +public: + HelpDialog(); + virtual ~HelpDialog() {} + + static void show(); +}; + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp new file mode 100644 index 0000000000..dca3dcead5 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -0,0 +1,1037 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_logic.h" +#include "tsage/ringworld2/ringworld2_dialogs.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" +#include "tsage/ringworld2/ringworld2_scenes2.h" + +namespace TsAGE { + +namespace Ringworld2 { + +Scene *Ringworld2Game::createScene(int sceneNumber) { + switch (sceneNumber) { + /* Scene group #0 */ + // + case 50: return new Scene50(); + // Quinn's room + case 100: return new Scene100(); + // Computer console + case 125: return new Scene125(); + // + case 150: + case 160: + case 175: + case 180: + error("Missing scene %d from group 0", sceneNumber); + case 200: + // Ship Corridor + return new Scene200(); + case 205: + case 250: + error("Missing scene %d from group 0", sceneNumber); + case 300: + return new Scene300(); + case 325: + case 400: + case 500: + case 525: + case 600: + case 700: + case 800: + case 825: + case 850: + case 900: + error("Missing scene %d from group 0", sceneNumber); + /* Scene group #1 */ + // + case 1000: + case 1010: + case 1020: + case 1100: + case 1200: + case 1330: + case 1500: + case 1525: + case 1530: + case 1550: + case 1575: + case 1580: + case 1625: + case 1700: + case 1750: + case 1800: + case 1850: + case 1875: + case 1900: + case 1925: + case 1945: + case 1950: + error("Missing scene %d from group 1", sceneNumber); + /* Scene group #2 */ + // + case 2000: + // Maze + return new Scene2000(); + case 2350: + // Maze: Balloon Launch Platform + return new Scene2350(); + case 2400: + // Maze: Large empty room + return new Scene2400(); + case 2425: + // Maze: + return new Scene2425(); + case 2430: + // Maze: Bedroom + return new Scene2430(); + case 2435: + // Maze: Throne room + return new Scene2435(); + case 2440: + // Maze: Another bedroom + return new Scene2440(); + case 2445: + // Maze: + return new Scene2445(); + case 2450: + // Maze: Another bedroom + return new Scene2450(); + case 2455: + // Maze: Inside crevasse + return new Scene2455(); + case 2500: + // Maze: Large Cave + return new Scene2500(); + case 2525: + case 2530: + case 2535: + case 2600: + case 2700: + case 2750: + case 2800: + case 2900: + error("Missing scene %d from group 2", sceneNumber); + /* Scene group #3 */ + // + case 3100: + case 3125: + case 3150: + case 3175: + case 3200: + case 3210: + case 3220: + case 3230: + case 3240: + case 3245: + case 3250: + case 3255: + case 3260: + case 3275: + case 3350: + case 3375: + case 3385: + case 3395: + case 3400: + case 3500: + case 3600: + case 3700: + case 3800: + case 3900: + error("Missing scene %d from group 3", sceneNumber); + default: + error("Unknown scene number - %d", sceneNumber); + break; + } +} + +/** + * Returns true if it is currently okay to restore a game + */ +bool Ringworld2Game::canLoadGameStateCurrently() { + return true; +} + +/** + * Returns true if it is currently okay to save the game + */ +bool Ringworld2Game::canSaveGameStateCurrently() { + return true; +} + +/*--------------------------------------------------------------------------*/ + +SceneExt::SceneExt(): Scene() { + _stripManager._onBegin = SceneExt::startStrip; + _stripManager._onEnd = SceneExt::endStrip; + + _field372 = _field37A = 0; + _savedPlayerEnabled = false; + _savedUiEnabled = false; + _savedCanWalk = false; + _focusObject = NULL; +} + +void SceneExt::postInit(SceneObjectList *OwnerList) { + Scene::postInit(OwnerList); + + // Exclude the bottom area of the screen to allow room for the UI + T2_GLOBALS._interfaceY = UI_INTERFACE_Y; + + // Initialise fields + _action = NULL; + _field12 = 0; + _sceneMode = 0; +} + +void SceneExt::remove() { + _sceneAreas.clear(); + Scene::remove(); +} + +void SceneExt::process(Event &event) { + if (!event.handled) + Scene::process(event); +} + +void SceneExt::dispatch() { +/* + _timerList.dispatch(); + + if (_field37A) { + if ((--_field37A == 0) && R2_GLOBALS._dayNumber) { + if (R2_GLOBALS._uiElements._active && R2_GLOBALS._player._enabled) { + R2_GLOBALS._uiElements.show(); + } + + _field37A = 0; + } + } +*/ + Scene::dispatch(); +} + +void SceneExt::loadScene(int sceneNum) { + Scene::loadScene(sceneNum); + + _v51C34.top = 0; + _v51C34.bottom = 300; + + int prevScene = R2_GLOBALS._sceneManager._previousScene; + int sceneNumber = R2_GLOBALS._sceneManager._sceneNumber; + + if (((prevScene == -1) && (sceneNumber != 180) && (sceneNumber != 205) && (sceneNumber != 50)) || + (sceneNumber == 50) || ((prevScene == 205) && (sceneNumber == 100)) || + ((prevScene == 180) && (sceneNumber == 100))) { + // TODO: sub_17875 + R2_GLOBALS._v58CE2 = 1; + R2_GLOBALS._uiElements.show(); + } else { + // Update the user interface + R2_GLOBALS._uiElements.updateInventory(); + } +} + +bool SceneExt::display(CursorType action) { + switch (action) { + case CURSOR_CROSSHAIRS: + return false; + case CURSOR_LOOK: + SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4)); + break; + case CURSOR_USE: + SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4) + 5); + break; + case CURSOR_TALK: + SceneItem::display2(1, R2_GLOBALS._randomSource.getRandomNumber(4) + 10); + break; + default: + return false; + } + + return true; +} + +void SceneExt::fadeOut() { + uint32 black = 0; + R2_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); +} + +void SceneExt::startStrip() { + SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene; + scene->_field372 = 1; + scene->_savedPlayerEnabled = R2_GLOBALS._player._enabled; + + if (scene->_savedPlayerEnabled) { + scene->_savedUiEnabled = R2_GLOBALS._player._uiEnabled; + scene->_savedCanWalk = R2_GLOBALS._player._canWalk; + R2_GLOBALS._player.disableControl(); +/* + if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active) + R2_GLOBALS._uiElements.hide(); +*/ + } +} + +void SceneExt::endStrip() { + SceneExt *scene = (SceneExt *)R2_GLOBALS._sceneManager._scene; + scene->_field372 = 0; + + if (scene->_savedPlayerEnabled) { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; + R2_GLOBALS._player._canWalk = scene->_savedCanWalk; +/* + if (!R2_GLOBALS._v50696 && R2_GLOBALS._uiElements._active) + R2_GLOBALS._uiElements.show(); +*/ + } +} + +void SceneExt::clearScreen() { + R2_GLOBALS._screenSurface.fillRect(R2_GLOBALS._screenSurface.getBounds(), 0); +} + +void SceneExt::refreshBackground(int xAmount, int yAmount) { + switch (_activeScreenNumber) { + case 700: + case 1020: + case 1100: + case 1700: + case 2600: + case 2950: + case 3100: + case 3101: + case 3275: + case 3600: + // Use traditional style sectioned screen loading + Scene::refreshBackground(xAmount, yAmount); + return; + default: + // Break out to new style screen loading + break; + } + + /* New style background loading */ + + // Get the screen data + byte *dataP = g_resourceManager->getResource(RT18, _activeScreenNumber, 0); + int screenSize = g_vm->_memoryManager.getSize(dataP); + + // Lock the background for update + Graphics::Surface s = _backSurface.lockSurface(); + assert(screenSize == (s.w * s.h)); + + // Copy the data + byte *destP = (byte *)s.getBasePtr(0, 0); + Common::copy(dataP, dataP + (s.w * s.h), destP); + _backSurface.unlockSurface(); + + // Free the resource data + DEALLOCATE(dataP); +} + +/** + * Saves the current player position and view in the details for the specified character index + */ +void SceneExt::saveCharacter(int characterIndex) { + R2_GLOBALS._player._characterPos[characterIndex] = R2_GLOBALS._player._position; + R2_GLOBALS._player._characterStrip[characterIndex] = R2_GLOBALS._player._strip; + R2_GLOBALS._player._characterFrame[characterIndex] = R2_GLOBALS._player._frame; +} + +/*--------------------------------------------------------------------------*/ + +void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { + SceneHandler::postInit(OwnerList); +} + +void SceneHandlerExt::process(Event &event) { + if (T2_GLOBALS._uiElements._active) { + T2_GLOBALS._uiElements.process(event); + if (event.handled) + return; + } + + SceneExt *scene = static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene); + if (scene && R2_GLOBALS._player._uiEnabled) { + // Handle any scene areas that have been registered + SynchronizedList<SceneArea *>::iterator saIter; + for (saIter = scene->_sceneAreas.begin(); saIter != scene->_sceneAreas.end() && !event.handled; ++saIter) { + (*saIter)->process(event); + } + } + + if (!event.handled) + SceneHandler::process(event); +} + +/*--------------------------------------------------------------------------*/ + +DisplayHotspot::DisplayHotspot(int regionId, ...) { + _sceneRegionId = regionId; + + // Load up the actions + va_list va; + va_start(va, regionId); + + int param = va_arg(va, int); + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayHotspot::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +DisplayObject::DisplayObject(int firstAction, ...) { + // Load up the actions + va_list va; + va_start(va, firstAction); + + int param = firstAction; + while (param != LIST_END) { + _actions.push_back(param); + param = va_arg(va, int); + } + + va_end(va); +} + +bool DisplayObject::performAction(int action) { + for (uint i = 0; i < _actions.size(); i += 3) { + if (_actions[i] == action) { + display(_actions[i + 1], _actions[i + 2], SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); + return true; + } + } + + return false; +} + +/*--------------------------------------------------------------------------*/ + +Ringworld2InvObjectList::Ringworld2InvObjectList(): + _none(1, 1), + _inv1(1, 2), + _inv2(1, 3), + _negatorGun(1, 4), + _steppingDisks(1, 5), + _inv5(1, 6), + _inv6(1, 7), + _inv7(1, 8), + _inv8(1, 9), + _inv9(1, 10), + _inv10(1, 11), + _inv11(1, 12), + _inv12(1, 13), + _inv13(1, 14), + _inv14(1, 15), + _inv15(1, 16), + _inv16(1, 17), + _inv17(2, 2), + _inv18(2, 3), + _inv19(2, 4), + _inv20(2, 5), + _inv21(2, 5), + _inv22(2, 6), + _inv23(2, 7), + _inv24(2, 8), + _inv25(2, 9), + _inv26(2, 10), + _inv27(2, 11), + _inv28(2, 12), + _inv29(2, 13), + _inv30(2, 14), + _inv31(2, 15), + _inv32(2, 16), + _inv33(3, 2), + _inv34(3, 3), + _inv35(3, 4), + _inv36(3, 5), + _inv37(3, 6), + _inv38(3, 7), + _inv39(1, 10), + _inv40(3, 8), + _inv41(3, 9), + _inv42(3, 10), + _inv43(3, 11), + _inv44(3, 12), + _inv45(3, 13), + _inv46(3, 17), + _inv47(3, 14), + _inv48(3, 14), + _inv49(3, 15), + _inv50(3, 15), + _inv51(3, 17), + _inv52(4, 2) { + + // Add the items to the list + _itemList.push_back(&_none); + _itemList.push_back(&_inv1); + _itemList.push_back(&_inv2); + _itemList.push_back(&_negatorGun); + _itemList.push_back(&_steppingDisks); + _itemList.push_back(&_inv5); + _itemList.push_back(&_inv6); + _itemList.push_back(&_inv7); + _itemList.push_back(&_inv8); + _itemList.push_back(&_inv9); + _itemList.push_back(&_inv10); + _itemList.push_back(&_inv11); + _itemList.push_back(&_inv12); + _itemList.push_back(&_inv13); + _itemList.push_back(&_inv14); + _itemList.push_back(&_inv15); + _itemList.push_back(&_inv16); + _itemList.push_back(&_inv17); + _itemList.push_back(&_inv18); + _itemList.push_back(&_inv19); + _itemList.push_back(&_inv20); + _itemList.push_back(&_inv21); + _itemList.push_back(&_inv22); + _itemList.push_back(&_inv23); + _itemList.push_back(&_inv24); + _itemList.push_back(&_inv25); + _itemList.push_back(&_inv26); + _itemList.push_back(&_inv27); + _itemList.push_back(&_inv28); + _itemList.push_back(&_inv29); + _itemList.push_back(&_inv30); + _itemList.push_back(&_inv31); + _itemList.push_back(&_inv32); + _itemList.push_back(&_inv33); + _itemList.push_back(&_inv34); + _itemList.push_back(&_inv35); + _itemList.push_back(&_inv36); + _itemList.push_back(&_inv37); + _itemList.push_back(&_inv38); + _itemList.push_back(&_inv39); + _itemList.push_back(&_inv40); + _itemList.push_back(&_inv41); + _itemList.push_back(&_inv42); + _itemList.push_back(&_inv43); + _itemList.push_back(&_inv44); + _itemList.push_back(&_inv45); + _itemList.push_back(&_inv46); + _itemList.push_back(&_inv47); + _itemList.push_back(&_inv48); + _itemList.push_back(&_inv49); + _itemList.push_back(&_inv50); + _itemList.push_back(&_inv51); + _itemList.push_back(&_inv52); + + _selectedItem = NULL; +} + +void Ringworld2InvObjectList::reset() { + // Reset all object scene numbers + SynchronizedList<InvObject *>::iterator i; + for (i = _itemList.begin(); i != _itemList.end(); ++i) { + (*i)->_sceneNumber = 0; + } + + // Set up default inventory + setObjectScene(R2_OPTO_DISK, 800); + setObjectScene(R2_2, 400); + setObjectScene(R2_NEGATOR_GUN, 100); + setObjectScene(R2_STEPPING_DISKS, 100); + setObjectScene(R2_5, 400); + setObjectScene(R2_6, 400); + setObjectScene(R2_7, 500); + setObjectScene(R2_8, 700); + setObjectScene(R2_9, 800); + setObjectScene(R2_10, 100); + setObjectScene(R2_11, 400); + setObjectScene(R2_12, 500); + setObjectScene(R2_13, 1550); + setObjectScene(R2_14, 850); + setObjectScene(R2_15, 850); + setObjectScene(R2_16, 0); + setObjectScene(R2_17, 1550); + setObjectScene(R2_18, 1550); + setObjectScene(R2_19, 1550); + setObjectScene(R2_20, 500); + setObjectScene(R2_21, 500); + setObjectScene(R2_22, 1550); + setObjectScene(R2_23, 1580); + setObjectScene(R2_24, 9999); + setObjectScene(R2_25, 1550); + setObjectScene(R2_26, 1550); + setObjectScene(R2_27, 1580); + setObjectScene(R2_28, 1550); + setObjectScene(R2_29, 2525); + setObjectScene(R2_30, 2440); + setObjectScene(R2_31, 2455); + setObjectScene(R2_32, 2535); + setObjectScene(R2_33, 2530); + setObjectScene(R2_34, 1950); + setObjectScene(R2_35, 1950); + setObjectScene(R2_36, 9999); + setObjectScene(R2_37, 2430); + setObjectScene(R2_38, 9999); + setObjectScene(R2_39, 2); + setObjectScene(R2_40, 9999); + setObjectScene(R2_41, 3150); + setObjectScene(R2_42, 0); + setObjectScene(R2_43, 3260); + setObjectScene(R2_44, 2); + setObjectScene(R2_45, 1550); + setObjectScene(R2_46, 0); + setObjectScene(R2_47, 3150); + setObjectScene(R2_48, 2435); + setObjectScene(R2_49, 2440); + setObjectScene(R2_50, 2435); + setObjectScene(R2_51, 1580); + setObjectScene(R2_52, 3260); +} + +void Ringworld2InvObjectList::setObjectScene(int objectNum, int sceneNumber) { + // Find the appropriate object + int num = objectNum; + SynchronizedList<InvObject *>::iterator i = _itemList.begin(); + while (num-- > 0) ++i; + (*i)->_sceneNumber = sceneNumber; + + // If the item is the currently active one, default back to the use cursor + if (R2_GLOBALS._events.getCursor() == objectNum) + R2_GLOBALS._events.setCursor(CURSOR_USE); + + // Update the user interface if necessary + T2_GLOBALS._uiElements.updateInventory(); +} + +/*--------------------------------------------------------------------------*/ + +void Ringworld2Game::start() { + int slot = -1; + + if (ConfMan.hasKey("save_slot")) { + slot = ConfMan.getInt("save_slot"); + Common::String file = g_vm->generateSaveName(slot); + Common::InSaveFile *in = g_vm->_system->getSavefileManager()->openForLoading(file); + if (in) + delete in; + else + slot = -1; + } + + if (slot >= 0) + R2_GLOBALS._sceneHandler->_loadGameSlot = slot; + else { + // Switch to the first game scene + R2_GLOBALS._events.setCursor(CURSOR_WALK); + R2_GLOBALS._uiElements._active = true; + R2_GLOBALS._sceneManager.setNewScene(100); + } + + g_globals->_events.showCursor(); +} + +void Ringworld2Game::restart() { + g_globals->_scenePalette.clearListeners(); + g_globals->_soundHandler.stop(); + + // Change to the first game scene + g_globals->_sceneManager.changeScene(100); +} + +void Ringworld2Game::endGame(int resNum, int lineNum) { + g_globals->_events.setCursor(CURSOR_WALK); + Common::String msg = g_resourceManager->getMessage(resNum, lineNum); + bool savesExist = g_saver->savegamesExist(); + + if (!savesExist) { + // No savegames exist, so prompt the user to restart or quit + if (MessageDialog::show(msg, QUIT_BTN_STRING, RESTART_BTN_STRING) == 0) + g_vm->quitGame(); + else + restart(); + } else { + // Savegames exist, so prompt for Restore/Restart + bool breakFlag; + do { + if (g_vm->shouldQuit()) { + breakFlag = true; + } else if (MessageDialog::show(msg, RESTART_BTN_STRING, RESTORE_BTN_STRING) == 0) { + restart(); + breakFlag = true; + } else { + handleSaveLoad(false, g_globals->_sceneHandler->_loadGameSlot, g_globals->_sceneHandler->_saveName); + breakFlag = g_globals->_sceneHandler->_loadGameSlot >= 0; + } + } while (!breakFlag); + } + + g_globals->_events.setCursorFromFlag(); +} + +void Ringworld2Game::processEvent(Event &event) { + if (event.eventType == EVENT_KEYPRESS) { + switch (event.kbd.keycode) { + case Common::KEYCODE_F1: + // F1 - Help + HelpDialog::show(); + break; + + case Common::KEYCODE_F2: + // F2 - Sound Options + SoundDialog::execute(); + break; + + case Common::KEYCODE_F3: + // F3 - Quit + quitGame(); + event.handled = false; + break; + + case Common::KEYCODE_F4: + // F4 - Restart + restartGame(); + g_globals->_events.setCursorFromFlag(); + break; + + case Common::KEYCODE_F7: + // F7 - Restore + restoreGame(); + g_globals->_events.setCursorFromFlag(); + break; + + case Common::KEYCODE_F8: + // F8 - Credits + warning("TODO: Show Credits"); + break; + + case Common::KEYCODE_F10: + // F10 - Pause + GfxDialog::setPalette(); + MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); + g_globals->_events.setCursorFromFlag(); + break; + + default: + break; + } + } +} + +void Ringworld2Game::rightClick() { + RightClickDialog *dlg = new RightClickDialog(); + dlg->execute(); + delete dlg; +} + +/*--------------------------------------------------------------------------*/ + +NamedHotspot::NamedHotspot() : SceneHotspot() { + _resNum = 0; + _lookLineNum = _useLineNum = _talkLineNum = -1; +} + +bool NamedHotspot::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_WALK: + // Nothing + return false; + case CURSOR_LOOK: + if (_lookLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _lookLineNum); + return true; + case CURSOR_USE: + if (_useLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _useLineNum); + return true; + case CURSOR_TALK: + if (_talkLineNum == -1) + return SceneHotspot::startAction(action, event); + + SceneItem::display2(_resNum, _talkLineNum); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +void NamedHotspot::setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum) { + setBounds(ys, xe, ye, xs); + _resNum = resnum; + _lookLineNum = lookLineNum; + _useLineNum = useLineNum; + _talkLineNum = -1; + g_globals->_sceneItems.addItems(this, NULL); +} + +void NamedHotspot::setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + setBounds(bounds); + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode) { + _sceneRegionId = sceneRegionId; + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + // Handle adding hotspot to scene items list as necessary + switch (mode) { + case 2: + GLOBALS._sceneItems.push_front(this); + break; + case 3: + break; + default: + GLOBALS._sceneItems.push_back(this); + break; + } +} + +void NamedHotspot::synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_useLineNum); + + if (g_vm->getGameID() == GType_BlueForce) + s.syncAsSint16LE(_talkLineNum); +} + +void SceneActor::postInit(SceneObjectList *OwnerList) { + _lookLineNum = _talkLineNum = _useLineNum = -1; + SceneObject::postInit(); +} + +void SceneActor::synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_resNum); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_talkLineNum); + s.syncAsSint16LE(_useLineNum); +} + +bool SceneActor::startAction(CursorType action, Event &event) { + bool handled = true; + + switch (action) { + case CURSOR_LOOK: + if (_lookLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _lookLineNum); + break; + case CURSOR_USE: + if (_useLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _useLineNum); + break; + case CURSOR_TALK: + if (_talkLineNum == -1) + handled = false; + else + SceneItem::display2(_resNum, _talkLineNum); + break; + default: + handled = false; + break; + } + + if (!handled) + handled = ((SceneExt *)R2_GLOBALS._sceneManager._scene)->display(action); + return handled; +} + +void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; + + switch (mode) { + case 2: + g_globals->_sceneItems.push_front(this); + break; + case 4: + g_globals->_sceneItems.addBefore(item, this); + break; + case 5: + g_globals->_sceneItems.addAfter(item, this); + break; + default: + g_globals->_sceneItems.push_back(this); + break; + } +} + +void SceneActor::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; +} + +/*--------------------------------------------------------------------------*/ + +SceneArea::SceneArea(): EventHandler() { + _enabled = true; + _insideArea = false; + _savedCursorNum = CURSOR_NONE; + _cursorState = 0; +} + +void SceneArea::synchronize(Serializer &s) { + EventHandler::synchronize(s); + + _bounds.synchronize(s); + s.syncAsSint16LE(_enabled); + s.syncAsSint16LE(_insideArea); + s.syncAsSint16LE(_cursorNum); + s.syncAsSint16LE(_savedCursorNum); + s.syncAsSint16LE(_cursorState); +} + +void SceneArea::remove() { + static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.remove(this); +} + +void SceneArea::process(Event &event) { + if (!R2_GLOBALS._insetUp && _enabled && R2_GLOBALS._events.isCursorVisible()) { + CursorType cursor = R2_GLOBALS._events.getCursor(); + + if (_bounds.contains(event.mousePos)) { + // Cursor moving in bounded area + if (cursor != _cursorNum) { + _savedCursorNum = cursor; + _cursorState = 0; + R2_GLOBALS._events.setCursor(_cursorNum); + } + _insideArea = true; + } else if ((event.mousePos.y < 171) && _insideArea && (_cursorNum == cursor) && + (_savedCursorNum != CURSOR_NONE)) { + // Cursor moved outside bounded area + R2_GLOBALS._events.setCursor(_savedCursorNum); + } + } +} + +void SceneArea::setDetails(const Rect &bounds, CursorType cursor) { + _bounds = bounds; + _cursorNum = cursor; + + static_cast<SceneExt *>(R2_GLOBALS._sceneManager._scene)->_sceneAreas.push_front(this); +} + +/*--------------------------------------------------------------------------*/ + +SceneExit::SceneExit(): SceneArea() { + _moving = false; + _destPos = Common::Point(-1, -1); +} + +void SceneExit::synchronize(Serializer &s) { + SceneArea::synchronize(s); + + s.syncAsSint16LE(_moving); + s.syncAsSint16LE(_destPos.x); + s.syncAsSint16LE(_destPos.y); +} + +void SceneExit::setDetails(const Rect &bounds, CursorType cursor, int sceneNumber) { + _sceneNumber = sceneNumber; + SceneArea::setDetails(bounds, cursor); +} + +void SceneExit::changeScene() { + R2_GLOBALS._sceneManager.setNewScene(_sceneNumber); +} + +void SceneExit::process(Event &event) { + if (!R2_GLOBALS._insetUp) { + SceneArea::process(event); + + if (_enabled) { + if (event.eventType == EVENT_BUTTON_DOWN) { + if (!_bounds.contains(event.mousePos)) + _moving = false; + else if (!R2_GLOBALS._player._canWalk) { + _moving = false; + changeScene(); + event.handled = true; + } else { + Common::Point dest((_destPos.x == -1) ? event.mousePos.x : _destPos.x, + (_destPos.y == -1) ? event.mousePos.y : _destPos.y); + ADD_PLAYER_MOVER(dest.x, dest.y); + + _moving = true; + event.handled = true; + } + } + + if (_moving && (_bounds.contains(R2_GLOBALS._player._position) || (R2_GLOBALS._player._position == _destPos))) + changeScene(); + } + } +} + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h new file mode 100644 index 0000000000..9eaa1b0cd1 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_logic.h @@ -0,0 +1,289 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_LOGIC_H +#define TSAGE_RINGWORLD2_LOGIC_H + +#include "common/scummsys.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +#define R2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) + +class SceneFactory { +public: + static Scene *createScene(int sceneNumber); +}; + +class SceneArea: public EventHandler { +public: + Rect _bounds; + bool _enabled; + bool _insideArea; + CursorType _cursorNum; + CursorType _savedCursorNum; + int _cursorState; +public: + SceneArea(); + void setDetails(const Rect &bounds, CursorType cursor); + + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void process(Event &event); +}; + +class SceneExit: public SceneArea { +public: + bool _moving; + int _sceneNumber; + Common::Point _destPos; +public: + SceneExit(); + virtual void setDetails(const Rect &bounds, CursorType cursor, int sceneNumber); + virtual void setDest(const Common::Point &p) { _destPos = p; } + virtual void changeScene(); + + virtual void synchronize(Serializer &s); + virtual void process(Event &event); +}; + +class SceneExt: public Scene { +private: + static void startStrip(); + static void endStrip(); +public: + int _field372; + bool _savedPlayerEnabled; + bool _savedUiEnabled; + bool _savedCanWalk; + int _field37A; + + SceneObject *_focusObject; + Visage _cursorVisage; + SynchronizedList<SceneArea *> _sceneAreas; + + Rect _v51C34; +public: + SceneExt(); + + virtual Common::String getClassName() { return "SceneExt"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void loadScene(int sceneNum); + virtual void refreshBackground(int xAmount, int yAmount); + virtual void saveCharacter(int characterIndex); + + bool display(CursorType action); + void fadeOut(); + void clearScreen(); +}; + +class SceneHandlerExt: public SceneHandler { +public: + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void process(Event &event); +}; + + +class DisplayHotspot : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayHotspot(int regionId, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class DisplayObject : public SceneObject { +private: + Common::Array<int> _actions; + bool performAction(int action); +public: + DisplayObject(int firstAction, ...); + + virtual void doAction(int action) { + if (!performAction(action)) + SceneHotspot::doAction(action); + } +}; + +class SceneObjectExt : public SceneObject { +public: + int _state; + + virtual void synchronize(Serializer &s) { + SceneObject::synchronize(s); + s.syncAsSint16LE(_state); + } + virtual Common::String getClassName() { return "SceneObjectExt"; } +}; + +/*--------------------------------------------------------------------------*/ + +class Ringworld2InvObjectList : public InvObjectList { +public: + InvObject _none; + InvObject _inv1; + InvObject _inv2; + InvObject _negatorGun; + InvObject _steppingDisks; + InvObject _inv5; + InvObject _inv6; + InvObject _inv7; + InvObject _inv8; + InvObject _inv9; + InvObject _inv10; + InvObject _inv11; + InvObject _inv12; + InvObject _inv13; + InvObject _inv14; + InvObject _inv15; + InvObject _inv16; + InvObject _inv17; + InvObject _inv18; + InvObject _inv19; + InvObject _inv20; + InvObject _inv21; + InvObject _inv22; + InvObject _inv23; + InvObject _inv24; + InvObject _inv25; + InvObject _inv26; + InvObject _inv27; + InvObject _inv28; + InvObject _inv29; + InvObject _inv30; + InvObject _inv31; + InvObject _inv32; + InvObject _inv33; + InvObject _inv34; + InvObject _inv35; + InvObject _inv36; + InvObject _inv37; + InvObject _inv38; + InvObject _inv39; + InvObject _inv40; + InvObject _inv41; + InvObject _inv42; + InvObject _inv43; + InvObject _inv44; + InvObject _inv45; + InvObject _inv46; + InvObject _inv47; + InvObject _inv48; + InvObject _inv49; + InvObject _inv50; + InvObject _inv51; + InvObject _inv52; + + Ringworld2InvObjectList(); + void reset(); + void setObjectScene(int objectNum, int sceneNumber); + + virtual Common::String getClassName() { return "Ringworld2InvObjectList"; } +}; + +#define RING2_INVENTORY (*((::TsAGE::Ringworld2::Ringworld2InvObjectList *)g_globals->_inventory)) + +class Ringworld2Game: public Game { +public: + virtual void start(); + virtual void restart(); + virtual void endGame(int resNum, int lineNum); + + virtual Scene *createScene(int sceneNumber); + virtual void processEvent(Event &event); + virtual void rightClick(); + virtual bool canSaveGameStateCurrently(); + virtual bool canLoadGameStateCurrently(); +}; + +class NamedHotspot : public SceneHotspot { +public: + int _resNum, _lookLineNum, _useLineNum, _talkLineNum; + NamedHotspot(); + + virtual bool startAction(CursorType action, Event &event); + virtual Common::String getClassName() { return "NamedHotspot"; } + virtual void synchronize(Serializer &s); + virtual void setDetails(int ys, int xs, int ye, int xe, const int resnum, const int lookLineNum, const int useLineNum); + virtual void setDetails(const Rect &bounds, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + virtual void setDetails(int sceneRegionId, int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode = 0); +}; + +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); + } +}; + +class SceneActor: public SceneObject { +public: + int _resNum; + int _lookLineNum, _talkLineNum, _useLineNum; + + virtual Common::String getClassName() { return "SceneActor"; } + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual bool startAction(CursorType action, Event &event); + + void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + void setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum); +}; + +class SceneActorExt: public SceneActor { +public: + int _state; + + SceneActorExt() { _state = 0; } + virtual Common::String getClassName() { return "SceneActorExt"; } + virtual void synchronize(Serializer &s) { + SceneActor::synchronize(s); + s.syncAsSint16LE(_state); + } +}; + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp new file mode 100644 index 0000000000..214853ce86 --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -0,0 +1,2256 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" +#include "tsage/ringworld2/ringworld2_speakers.h" + +namespace TsAGE { + +namespace Ringworld2 { + +void Scene50::Action1::signal() { + switch (_actionIndex++) { + case 0: + setDelay(2); + break; + case 1: + setDelay(180); + break; + case 2: + R2_GLOBALS._sceneManager.changeScene(100); + break; + default: + break; + } +} + +void Scene50::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(OwnerList); + loadScene(110); + + R2_GLOBALS._v58CE2 = 0; + R2_GLOBALS._scenePalette.loadPalette(0); + + R2_GLOBALS._sound2.play(10); + R2_GLOBALS._player.disableControl(); + + setAction(&_action1); +} + +void Scene50::process(Event &event) { + if ((event.eventType != EVENT_BUTTON_DOWN) && (event.eventType != EVENT_KEYPRESS) && (event.eventType == 27)) { + event.handled = true; + warning("TODO: incomplete Scene50::process()"); + // CursorType _oldCursorId = _cursorId; + g_globals->_events.setCursor(R2_2); + // _cursorManager.sub_1D474(2, 0); + // sub_5566A(1); + // _cursorManager._fieldE = _oldCursorId; + R2_GLOBALS._sceneManager.changeScene(100); + } +} + +/*-------------------------------------------------------------------------- + * Scene 100 - Quinn's Room + * + *--------------------------------------------------------------------------*/ + +bool Scene100::Door::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_state) { + SceneItem::display2(100, 6); + } else { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 101; + scene->setAction(&scene->_sequenceManager1, scene, 101, &R2_GLOBALS._player, this, NULL); + } + return true; + case CURSOR_TALK: + if (_state) { + SceneItem::display2(100, 26); + _state = 0; + scene->_object10.setFrame(1); + } else { + SceneItem::display2(100, 27); + _state = 1; + scene->_object10.setFrame(2); + } + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::Table::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + if (_strip == 2) { + scene->_sceneMode = 108; + scene->_object3.postInit(); + scene->_stasisNegator.postInit(); + + if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) { + scene->_stasisNegator.setup(100, 7, 2); + } else { + scene->_stasisNegator.setup(100, 7, 1); + scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, NULL); + } + + scene->setAction(&scene->_sequenceManager2, scene, 108, this, &scene->_object3, + &scene->_stasisNegator, &R2_GLOBALS._player, NULL); + } else { + scene->_sceneMode = 109; + scene->setAction(&scene->_sequenceManager2, scene, 109, this, &scene->_object3, + &scene->_stasisNegator, &R2_GLOBALS._player, NULL); + } + return true; + case CURSOR_TALK: + R2_GLOBALS._player.disableControl(); + + if (_strip == 2) { + SceneItem::display2(100, 18); + scene->_sceneMode = 102; + scene->_object3.postInit(); + scene->_stasisNegator.postInit(); + + if (R2_INVENTORY.getObjectScene(R2_NEGATOR_GUN) == 1) { + scene->_stasisNegator.setup(100, 7, 2); + } else { + scene->_stasisNegator.setup(100, 7, 1); + scene->_stasisNegator.setDetails(100, 21, 22, 23, 2, NULL); + } + + scene->setAction(&scene->_sequenceManager2, scene, 102, this, &scene->_object3, + &scene->_stasisNegator, NULL); + } else { + SceneItem::display2(100, 19); + scene->_sceneMode = 103; + scene->setAction(&scene->_sequenceManager2, scene, 103, this, &scene->_object3, + &scene->_stasisNegator, NULL); + } + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::StasisNegator::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 107; + scene->setAction(&scene->_sequenceManager1, scene, 107, &R2_GLOBALS._player, &scene->_stasisNegator, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::Object10::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(100, _state ? 24 : 25); + return true; + case CURSOR_TALK: + SceneItem::display2(100, _state ? 26 : 27); + return true; + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 110; + scene->setAction(&scene->_sequenceManager1, scene, 110, &R2_GLOBALS._player, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +bool Scene100::SteppingDisks::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 111; + scene->setAction(&scene->_sequenceManager1, scene, 111, &R2_GLOBALS._player, this, NULL); + return true; + default: + return SceneActor::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene100::Terminal::startAction(CursorType action, Event &event) { + Scene100 *scene = (Scene100 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 105; + scene->setAction(&scene->_sequenceManager1, scene, 105, &R2_GLOBALS._player, this, NULL); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene100::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(100); + R2_GLOBALS._scenePalette.loadPalette(0); + + if (R2_GLOBALS._sceneManager._previousScene != 125) + R2_GLOBALS._sound1.play(10); + + _door.postInit(); + _door._state = 0; + _door.setVisage(100); + _door.setPosition(Common::Point(160, 84)); + _door.setDetails(100, 3, 4, 5, 1, NULL); + + _object10.postInit(); + _object10.setup(100, 2, 1); + _object10.setDetails(100, -1, -1, -1, 1, NULL); + + _table.postInit(); + _table.setup(100, 2, 3); + _table.setPosition(Common::Point(175, 157)); + _table.setDetails(100, 17, 18, 20, 1, NULL); + + _object1.postInit(); + _object1.setup(100, 3, 1); + _object1.setPosition(Common::Point(89, 79)); + _object1.fixPriority(250); + _object1.animate(ANIM_MODE_2, NULL); + _object1._numFrames = 3; + + _object2.postInit(); + _object2.setup(100, 3, 1); + _object2.setPosition(Common::Point(89, 147)); + _object2.fixPriority(250); + _object2.animate(ANIM_MODE_7, 0, NULL); + _object2._numFrames = 3; + + _object6.postInit(); + _object6.setVisage(101); + _object6.setPosition(Common::Point(231, 126)); + _object6.fixPriority(10); + _object6.setDetails(100, 37, -1, 39, 1, NULL); + + if (R2_INVENTORY.getObjectScene(R2_STEPPING_DISKS) == 100) { + _steppingDisks.postInit(); + _steppingDisks.setup(100, 8, 1); + _steppingDisks.setPosition(Common::Point(274, 130)); + _steppingDisks.setDetails(100, 40, -1, 42, 1, NULL); + } + + _terminal.setDetails(11, 100, 14, 15, 16); + _desk.setDetails(12, 100, 11, -1, 13); + _bed.setDetails(13, 100, 8, 9, 10); + _duct.setDetails(14, 100, 34, -1, 36); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); + + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 100, 0, 1, -1, 1, NULL); + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 50: + case 180: + _object5.postInit(); + _object4.postInit(); + _sceneMode = 104; + setAction(&_sequenceManager1, this, 104, &R2_GLOBALS._player, &_object6, &_object4, &_object5, NULL); + break; + case 125: + _sceneMode = 100; + setAction(&_sequenceManager1, this, 106, &R2_GLOBALS._player, NULL); + break; + case 200: + _sceneMode = 100; + setAction(&_sequenceManager1, this, 100, &R2_GLOBALS._player, &_door, NULL); + break; + default: + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setPosition(Common::Point(180, 100)); + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene100::remove() { + R2_GLOBALS._sound1.play(10); + SceneExt::remove(); +} + +void Scene100::signal() { + switch (_sceneMode) { + case 101: + R2_GLOBALS._sceneManager.changeScene(200); + break; + case 103: + case 109: + _table.setStrip(2); + _table.setFrame(3); + + _object3.remove(); + _stasisNegator.remove(); + R2_GLOBALS._player.enableControl(); + break; + case 104: + _sceneMode = 0; + _object5.remove(); + _object4.remove(); + + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player._numFrames = 10; + R2_GLOBALS._player.fixPriority(-1); + R2_GLOBALS._player.enableControl(); + break; + case 105: + R2_GLOBALS._sceneManager.changeScene(125); + break; + case 107: + R2_GLOBALS._sceneItems.remove(&_stasisNegator); + + _stasisNegator.setFrame(2); + R2_INVENTORY.setObjectScene(R2_NEGATOR_GUN, 1); + R2_GLOBALS._player.enableControl(); + break; + case 110: + if (_door._state) { + _door._state = 0; + _object10.setFrame(1); + } else { + _door._state = 1; + _object10.setFrame(2); + } + R2_GLOBALS._player.enableControl(); + break; + case 111: + R2_INVENTORY.setObjectScene(R2_STEPPING_DISKS, 1); + _steppingDisks.remove(); + R2_GLOBALS._player.enableControl(); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene100::dispatch() { + int regionIndex = R2_GLOBALS._player.getRegionIndex(); + if (regionIndex == 13) + R2_GLOBALS._player._shade = 4; + + if ((R2_GLOBALS._player._visage == 13) || (R2_GLOBALS._player._visage == 101)) + R2_GLOBALS._player._shade = 0; + + SceneExt::dispatch(); + + if ((_sceneMode == 101) && (_door._frame == 2) && (_table._strip == 5)) { + _table.setAction(&_sequenceManager2, NULL, 103, &_table, &_object3, &_stasisNegator, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 125 - Computer Terminal + * + *--------------------------------------------------------------------------*/ + +bool Scene125::Object5::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) + return true; + else + return SceneActor::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +Scene125::Icon::Icon(): SceneActor() { + _lookLineNum = 0; + _field98 = 0; + _pressed = false; +} + +void Scene125::Icon::postInit(SceneObjectList *OwnerList) { + SceneObject::postInit(); + + _object1.postInit(); + _object1.fixPriority(255); + _object1.hide(); + + _sceneText1._color1 = 92; + _sceneText1._color2 = 0; + _sceneText1._width = 200; + _sceneText2._color1 = 0; + _sceneText2._color2 = 0; + _sceneText2._width = 200; + setDetails(125, -1, -1, -1, 2, NULL); +} + +void Scene125::Icon::synchronize(Serializer &s) { + SceneActor::synchronize(s); + s.syncAsSint16LE(_lookLineNum); + s.syncAsSint16LE(_field98); + s.syncAsSint16LE(_pressed); +} + +void Scene125::Icon::process(Event &event) { + Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene; + + if (!event.handled && !(_flags & OBJFLAG_HIDING) && R2_GLOBALS._player._uiEnabled) { + + if (event.eventType == EVENT_BUTTON_DOWN) { + int regionIndex = R2_GLOBALS._sceneRegions.indexOf(event.mousePos); + + switch (R2_GLOBALS._events.getCursor()) { + case CURSOR_LOOK: + if (regionIndex == _sceneRegionId) { + event.handled = true; + if (_lookLineNum == 26) { + SceneItem::display2(130, 7); + } else { + SceneItem::display2(130, _lookLineNum); + } + } + break; + + case CURSOR_USE: + if ((regionIndex == _sceneRegionId) && !_pressed) { + scene->_sound1.play(14); + setFrame(2); + + switch (_object1._strip) { + case 1: + _object1.setStrip(2); + break; + case 3: + _object1.setStrip(4); + break; + case 5: + _object1.setStrip(6); + break; + default: + break; + } + + _pressed = true; + event.handled = true; + } + break; + + default: + break; + } + } + + if ((event.eventType == EVENT_BUTTON_UP) && _pressed) { + setFrame(1); + + switch (_object1._strip) { + case 2: + _object1.setStrip(1); + break; + case 4: + _object1.setStrip(3); + break; + case 6: + _object1.setStrip(5); + break; + default: + break; + } + + _pressed = false; + event.handled = true; + scene->consoleAction(_lookLineNum); + } + } +} + +void Scene125::Icon::setIcon(int id) { + Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene; + + _lookLineNum = _field98 = id; + SceneActor::_lookLineNum = id; + + _sceneText1.remove(); + _sceneText2.remove(); + + if (_lookLineNum) { + showIcon(); + _object1.setup(161, ((id - 1) / 10) * 2 + 1, ((id - 1) % 10) + 1); + _object1.setPosition(_position); + + _sceneText1._fontNumber = scene->_iconFontNumber; + _sceneText1.setup(CONSOLE_MESSAGES[id]); + _sceneText1.fixPriority(20); + + _sceneText2._fontNumber = scene->_iconFontNumber; + _sceneText2.setup(CONSOLE_MESSAGES[id]); + _sceneText2.fixPriority(20); + + _sceneText2._fontNumber = scene->_iconFontNumber; + _sceneText2.setup(CONSOLE_MESSAGES[id]); + _sceneText2.fixPriority(10); + + switch (_lookLineNum) { + case 5: + _sceneText1.setPosition(Common::Point(62, _position.y + 8)); + _sceneText2.setPosition(Common::Point(64, _position.y + 10)); + break; + case 6: + case 7: + case 24: + case 25: + _sceneText1.setPosition(Common::Point(65, _position.y + 8)); + _sceneText2.setPosition(Common::Point(67, _position.y + 10)); + break; + case 26: + _sceneText1.setPosition(Common::Point(83, _position.y + 8)); + _sceneText2.setPosition(Common::Point(85, _position.y + 10)); + break; + default: + _sceneText1.setPosition(Common::Point(121, _position.y + 8)); + _sceneText2.setPosition(Common::Point(123, _position.y + 10)); + break; + } + } else { + hideIcon(); + } +} + +void Scene125::Icon::showIcon() { + _sceneText1.show(); + _sceneText2.show(); + _object1.show(); + _object2.show(); + show(); +} + +void Scene125::Icon::hideIcon() { + _sceneText1.hide(); + _sceneText2.hide(); + _object1.hide(); + _object2.hide(); + hide(); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene125::Item4::startAction(CursorType action, Event &event) { + Scene125 *scene = (Scene125 *)R2_GLOBALS._sceneManager._scene; + switch (action) { + case CURSOR_USE: + if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 126; + scene->setAction(&scene->_sequenceManager, scene, 126, &scene->_object7, NULL); + return true; + } + break; + case R2_OPTO_DISK: + if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) { + R2_GLOBALS._player.disableControl(); + scene->_object7.postInit(); + scene->_sceneMode = 125; + scene->setAction(&scene->_sequenceManager, scene, 125, &scene->_object7, NULL); + return true; + } + break; + default: + break; + } + + return SceneHotspot::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +Scene125::Scene125(): SceneExt() { + _iconFontNumber = 50; + _consoleMode = 5; + _logIndex = _databaseIndex = _infodiskIndex = 0; + + _soundCount = _soundIndex = 0; + for (int i = 0; i < 10; ++i) + _soundIndexes[i] = 0; +} + +void Scene125::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(160); + _palette.loadPalette(0); + + if (R2_GLOBALS._sceneManager._previousScene != 125) + // Save the prior scene to return to when the console is turned off + R2_GLOBALS._player._oldCharacterScene[1] = R2_GLOBALS._sceneManager._previousScene; + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.hide(); + R2_GLOBALS._player.disableControl(); + + if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == R2_GLOBALS._player._oldCharacterScene[1]) { + _object7.postInit(); + _object7.setup(160, 3, 5); + _object7.setPosition(Common::Point(47, 167)); + } + + _object6.postInit(); + _object6.setup(162, 1, 1); + _object6.setPosition(Common::Point(214, 168)); + + _item4.setDetails(Rect(27, 145, 81, 159), 126, 9, -1, -1, 1, NULL); + _item3.setDetails(Rect(144, 119, 286, 167), 126, 6, 7, 8, 1, NULL); + _item2.setDetails(1, 126, 3, 4, 5); + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 126, 0, 1, -1, 1, NULL); + + _sceneMode = 1; + signal(); +} + +void Scene125::signal() { + switch (_sceneMode) { + case 1: + _icon1.postInit(); + _icon1._sceneRegionId = 2; + _icon2.postInit(); + _icon2._sceneRegionId = 3; + _icon3.postInit(); + _icon3._sceneRegionId = 4; + _icon4.postInit(); + _icon4._sceneRegionId = 5; + + _sceneMode = 2; + setAction(&_sequenceManager, this, 127, &_icon1, &_icon2, &_icon3, &_icon4, &R2_GLOBALS._player, NULL); + break; + case 2: + _icon1.setup(160, 1, 1); + _icon1.setPosition(Common::Point(65, 17)); + _icon1._object2.postInit(); + _icon1._object2.setup(160, 7, 1); + _icon1._object2.setPosition(Common::Point(106, 41)); + + _icon2.setup(160, 1, 1); + _icon2.setPosition(Common::Point(80, 32)); + _icon2._object2.postInit(); + _icon2._object2.setup(160, 7, 2); + _icon2._object2.setPosition(Common::Point(106, 56)); + + _icon3.setup(160, 1, 1); + _icon3.setPosition(Common::Point(65, 47)); + _icon3._object2.postInit(); + _icon3._object2.setup(160, 7, 1); + _icon3._object2.setPosition(Common::Point(106, 71)); + + _icon4.setup(160, 1, 1); + _icon4.setPosition(Common::Point(80, 62)); + _icon4._sceneRegionId = 5; + _icon4._object2.postInit(); + _icon4._object2.setup(160, 7, 2); + _icon4._object2.setPosition(Common::Point(106, 86)); + + _icon5.postInit(); + _icon5.setup(160, 1, 1); + _icon5.setPosition(Common::Point(37, 92)); + _icon5.setIcon(6); + _icon5._sceneRegionId = 7; + + _icon6.postInit(); + _icon6.setup(160, 1, 1); + _icon6.setPosition(Common::Point(106, 110)); + _icon6.setIcon(5); + _icon6._sceneRegionId = 8; + + consoleAction(5); + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + break; + case 10: + switch (_consoleMode) { + case 12: + _sceneMode = 129; + + _object1.postInit(); + _object2.postInit(); + _object3.postInit(); + + if (R2_GLOBALS.getFlag(13)) { + _object4.postInit(); + setAction(&_sequenceManager, this, 130, &R2_GLOBALS._player, &_object1, &_object2, + &_object3, &_object4, NULL); + } else { + setAction(&_sequenceManager, this, 129, &R2_GLOBALS._player, &_object1, &_object2, &_object3, NULL); + } + break; + case 13: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _infodiskIndex = 0; + setDetails(129, 0); + break; + case 23: + R2_GLOBALS._sceneManager.changeScene(1330); + break; + case 27: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _databaseIndex = 0; + setDetails(128, 0); + break; + case 28: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _databaseIndex = 37; + setDetails(128, 37); + break; + case 29: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _databaseIndex = 68; + setDetails(128, 68); + break; + case 30: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _databaseIndex = 105; + setDetails(128, 105); + break; + default: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + _logIndex = 0; + setDetails(127, 0); + break; + } + break; + case 11: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + + if ((_consoleMode >= 27) && (_consoleMode <= 30)) { + consoleAction(11); + } + consoleAction(2); + _icon6.setIcon(5); + break; + case 12: + if (_soundCount > 0) + --_soundCount; + if (!_soundCount || (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) { + _soundIndex = 0; + R2_GLOBALS._playStream.stop(); + } else { + _sceneMode = 12; + R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex++], this); + } + break; + case 125: + R2_INVENTORY.setObjectScene(R2_OPTO_DISK, R2_GLOBALS._player._oldCharacterScene[1]); + break; + case 126: + R2_INVENTORY.setObjectScene(R2_OPTO_DISK, 1); + _object7.remove(); + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + break; + case 128: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + SceneItem::display2(126, 12); + break; + default: + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + break; + } +} + +void Scene125::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_consoleMode); + s.syncAsSint16LE(_iconFontNumber); + s.syncAsSint16LE(_logIndex); + s.syncAsSint16LE(_databaseIndex); + s.syncAsSint16LE(_infodiskIndex); + s.syncAsSint16LE(_soundCount); + s.syncAsSint16LE(_soundIndex); + + for (int i = 0; i < 10; ++i) + s.syncAsSint16LE(_soundIndexes[i]); +} + +void Scene125::process(Event &event) { + SceneExt::process(event); + + if (R2_GLOBALS._player._uiEnabled) { + _icon1.process(event); + _icon2.process(event); + _icon3.process(event); + _icon4.process(event); + _icon5.process(event); + _icon6.process(event); + } +} + +void Scene125::dispatch() { + if (_soundCount) + R2_GLOBALS._playStream.proc1(); + + Scene::dispatch(); +} + +/** + * Handles actions on the console screen. + */ +void Scene125::consoleAction(int id) { + _icon3.setIcon(0); + _icon4.setIcon(0); + + if (id == 5) + _icon5.setIcon(6); + else { + switch (_consoleMode) { + case 10: + case 12: + case 13: + case 27: + case 28: + case 29: + case 30: + break; + default: + _icon5.setIcon(7); + break; + } + } + + switch (id) { + case 1: + _icon1.setIcon(8); + _icon2.setIcon(9); + break; + case 2: + _icon1.setIcon(10); + _icon2.setIcon(11); + _icon3.setIcon(12); + _icon4.setIcon(13); + break; + case 3: + _icon1.setIcon(15); + _icon2.setIcon(16); + _icon3.setIcon(17); + break; + case 4: + _icon1.setIcon(22); + _icon2.setIcon(23); + break; + case 6: + R2_GLOBALS._sceneManager.changeScene(R2_GLOBALS._player._oldCharacterScene[1]); + break; + case 7: + if (_consoleMode == 11) + consoleAction(2); + else if (_consoleMode == 22) + consoleAction(4); + else + consoleAction(5); + break; + case 8: + _iconFontNumber = 50; + stop(); + _icon6.setIcon(5); + consoleAction(1); + break; + case 9: + _iconFontNumber = 52; + stop(); + _icon6.setIcon(5); + consoleAction(1); + break; + case 10: + R2_GLOBALS._player.disableControl(); + consoleAction(2); + _icon1.hideIcon(); + _icon2.hideIcon(); + _icon3.hideIcon(); + _icon5.setIcon(24); + + _icon4.setPosition(Common::Point(52, 107)); + _icon4._sceneRegionId = 9; + _icon4.setIcon(25); + _icon4._object2.hide(); + + _icon6.setIcon(26); + _sceneMode = 10; + + _palette.loadPalette(161); + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + break; + case 11: + _icon1.setIcon(27); + _icon2.setIcon(28); + _icon3.setIcon(29); + _icon4.setIcon(30); + break; + case 12: + R2_GLOBALS._player.disableControl(); + consoleAction(2); + _icon1.hideIcon(); + _icon2.hideIcon(); + _icon3.hideIcon(); + _icon4.hideIcon(); + _icon5.hideIcon(); + + _icon6.setIcon(26); + _sceneMode = 10; + _palette.loadPalette(161); + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + break; + case 13: + consoleAction(2); + if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) != R2_GLOBALS._player._oldCharacterScene[1]) { + SceneItem::display2(126, 17); + } else { + R2_GLOBALS._player.disableControl(); + + _icon1.hideIcon(); + _icon2.hideIcon(); + _icon3.hideIcon(); + _icon5.setIcon(24); + + _icon4.setPosition(Common::Point(52, 107)); + _icon4._sceneRegionId = 9; + _icon4.setIcon(25); + _icon4._object2.hide(); + + _icon6.setIcon(26); + _sceneMode = 10; + + _palette.loadPalette(161); + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + } + break; + case 15: + consoleAction(3); + + if (R2_GLOBALS._v565F5 < 3) { + R2_GLOBALS._player.disableControl(); + _object5.postInit(); + _object5.setup(162, 2, 2); + _object5.setPosition(Common::Point(216, UI_INTERFACE_Y)); + + R2_GLOBALS._v565F5 += 2; + } else if (R2_GLOBALS._v565F5 == 3) { + SceneItem::display2(126, 13); + } else { + SceneItem::display2(126, 14); + } + break; + case 16: + consoleAction(3); + + if (R2_GLOBALS._v565F5 < 4) { + R2_GLOBALS._player.disableControl(); + _object5.postInit(); + _object5.setup(162, 2, 3); + _object5.setPosition(Common::Point(218, UI_INTERFACE_Y)); + + ++R2_GLOBALS._v565F5; + } else { + SceneItem::display2(126, 15); + } + break; + case 17: + consoleAction(3); + + if (R2_GLOBALS._v565F5 < 4) { + R2_GLOBALS._player.disableControl(); + _object5.postInit(); + _object5.setup(162, 2, 1); + _object5.setPosition(Common::Point(215, UI_INTERFACE_Y)); + + ++R2_GLOBALS._v565F5; + } else { + SceneItem::display2(126, 16); + } + break; + case 22: + _icon1.setIcon(31); + _icon2.setIcon(32); + _icon3.setIcon(33); + _icon4.setIcon(34); + break; + case 23: + R2_GLOBALS._player.disableControl(); + consoleAction(4); + _icon1.hideIcon(); + _icon2.hideIcon(); + _icon3.hideIcon(); + _icon4.hideIcon(); + _icon5.hideIcon(); + _icon6.hideIcon(); + + _sceneMode = 10; + _palette.loadPalette(161); + break; + case 24: + _icon4.setIcon(25); + _icon4._object2.hide(); + + if (_consoleMode == 10) { + setDetails(127, --_logIndex); + } else if (_consoleMode == 13) { + setDetails(129, --_infodiskIndex); + } else { + setDetails(128, --_databaseIndex); + } + break; + case 25: + _icon4.setIcon(25); + _icon4._object2.hide(); + + if (_consoleMode == 10) { + setDetails(127, ++_logIndex); + } else if (_consoleMode == 13) { + setDetails(129, ++_infodiskIndex); + } else { + setDetails(128, ++_databaseIndex); + } + break; + case 26: + R2_GLOBALS._player.disableControl(); + stop(); + _icon4.setPosition(Common::Point(80, 62)); + _icon4._sceneRegionId = 5; + _icon4.hideIcon(); + + R2_GLOBALS._player.hide(); + _object1.hide(); + _object2.hide(); + _object3.hide(); + _object4.hide(); + + _sceneMode = 11; + _palette.loadPalette(160); + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + break; + case 27: + case 28: + case 29: + case 30: + R2_GLOBALS._player.disableControl(); + consoleAction(11); + _consoleMode = id; + + _icon1.hideIcon(); + _icon2.hideIcon(); + _icon3.hideIcon(); + _icon4.hideIcon(); + _icon5.setIcon(24); + + _icon4.setPosition(Common::Point(52, 107)); + _icon4._sceneRegionId = 9; + _icon4.setIcon(25); + _icon4._object2.hide(); + + _icon6.setIcon(26); + _sceneMode = 10; + + _palette.loadPalette(161); + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + break; + case 31: + consoleAction(22); + R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 63 : 10); + break; + case 32: + consoleAction(22); + R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 64 : 10); + break; + case 33: + consoleAction(22); + R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 65 : 10); + break; + case 34: + consoleAction(22); + R2_GLOBALS._sound1.play((R2_GLOBALS._sound1.getSoundNum() == 10) ? 66 : 10); + break; + default: + _icon1.setIcon(1); + _icon2.setIcon(2); + _icon3.setIcon(3); + _icon4.setIcon(4); + break; + } + + if ((id != 6) && (id != 7) && (id != 24) && (id != 25)) + _consoleMode = id; +} + +/** + * Sets the message to be displayed on the console screen. + */ +void Scene125::setDetails(int resNum, int lineNum) { + stop(); + + Common::String msg = g_resourceManager->getMessage(resNum, lineNum, true); + + if (!msg.empty()) { + // Check for any specified sound numbers embedded in the message + msg = parseMessage(msg); + + _sceneText._fontNumber = _iconFontNumber; + _sceneText._color1 = 92; + _sceneText._color2 = 0; + _sceneText._width = 221; + _sceneText.fixPriority(20); + _sceneText.setup(msg); + _sceneText.setPosition(Common::Point(49, 19)); + + R2_GLOBALS._sceneObjects->draw(); + + if ((_soundCount > 0) && (R2_GLOBALS._speechSubtitles & SPEECH_VOICE)) { + _sceneMode = 12; + R2_GLOBALS._playStream.play(_soundIndexes[_soundIndex], this); + } + } else { + // Passed the start or end of the message set, so return to the menu + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._player.hide(); + + _icon4.setPosition(Common::Point(80, 62)); + _icon4._sceneRegionId = 5; + _icon4.hideIcon(); + + _consoleMode = 0; + _palette.loadPalette(160); + _sceneMode = 11; + R2_GLOBALS._scenePalette.addFader(_palette._palette, 256, 5, this); + } +} + +/** + * Stops any playing console sounds and hides any current console message. + */ +void Scene125::stop() { + _sceneText.remove(); + _soundIndex = 0; + _soundCount = 0; + + R2_GLOBALS._playStream.stop(); +} + +/** + * Parses a message to be displayed on the console to see whether there are any sounds to be played. + */ +Common::String Scene125::parseMessage(const Common::String &msg) { + _soundIndex = 0; + _soundCount = 0; + + const char *msgP = msg.c_str(); + while (*msgP == '!') { + // Get the sound number + _soundIndexes[_soundCount++] = atoi(++msgP); + + while (!((*msgP == '\0') || (*msgP < '0') || (*msgP > '9'))) + ++msgP; + } + + return Common::String(msgP); +} + +/*-------------------------------------------------------------------------- + * Scene 200 - Ship Corridor + * + *--------------------------------------------------------------------------*/ + +bool Scene200::NorthDoor::startAction(CursorType action, Event &event) { + Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 202; + scene->setAction(&scene->_sequenceManager, scene, 202, &R2_GLOBALS._player, this, NULL); + return true; + } else { + return SceneActor::startAction(action, event); + } +} + +bool Scene200::EastDoor::startAction(CursorType action, Event &event) { + Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 200; + scene->setAction(&scene->_sequenceManager, scene, 200, &R2_GLOBALS._player, this, NULL); + return true; + } else { + return SceneActor::startAction(action, event); + } +} + +bool Scene200::WestDoor::startAction(CursorType action, Event &event) { + Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 204; + scene->setAction(&scene->_sequenceManager, scene, 204, &R2_GLOBALS._player, this, NULL); + return true; + } else { + return SceneActor::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene200::EastExit::changeScene() { + Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 206; + scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL); +} + +void Scene200::WestExit::changeScene() { + Scene200 *scene = (Scene200 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 208; + scene->setAction(&scene->_sequenceManager, scene, 208, &R2_GLOBALS._player, NULL); +} + +/*--------------------------------------------------------------------------*/ + +void Scene200::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(200); + + _westExit.setDetails(Rect(94, 0, 123, 58), EXITCURSOR_W, 175); + _westExit.setDest(Common::Point(125, 52)); + _eastExit.setDetails(Rect(133, 0, 167, 58), EXITCURSOR_E, 150); + _eastExit.setDest(Common::Point(135, 52)); + + _northDoor.postInit(); + _northDoor.setVisage(200); + _northDoor.setPosition(Common::Point(188, 79)); + _northDoor.setDetails(200, 3, -1, -1, 1, NULL); + + _eastDoor.postInit(); + _eastDoor.setVisage(200); + _eastDoor.setStrip(2); + _eastDoor.setPosition(Common::Point(305, 124)); + _eastDoor.setDetails(200, 6, -1, -1, 1, NULL); + + _westDoor.postInit(); + _westDoor.setVisage(200); + _westDoor.setStrip(3); + _westDoor.setPosition(Common::Point(62, 84)); + _westDoor.setDetails(200, 9, -1, -1, 1, NULL); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); + + _compartment.setDetails(Rect(4, 88, 153, 167), 200, 12, -1, -1, 1, NULL); + _westDoorDisplay.setDetails(Rect(41, 51, 48, 61), 200, 15, -1, -1, 1, NULL); + _eastDoorDisplay.setDetails(Rect(279, 67, 286, 78), 200, 18, -1, -1, 1, NULL); + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 200, 0, -1, -1, 1, NULL); + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 100: + _sceneMode = 201; + setAction(&_sequenceManager, this, 201, &R2_GLOBALS._player, &_eastDoor, NULL); + break; + case 150: + _sceneMode = 207; + setAction(&_sequenceManager, this, 207, &R2_GLOBALS._player, NULL); + break; + case 175: + _sceneMode = 209; + setAction(&_sequenceManager, this, 209, &R2_GLOBALS._player, NULL); + break; + case 250: + _sceneMode = 203; + setAction(&_sequenceManager, this, 203, &R2_GLOBALS._player, &_northDoor, NULL); + break; + case 400: + _sceneMode = 205; + setAction(&_sequenceManager, this, 205, &R2_GLOBALS._player, &_westDoor, NULL); + break; + default: + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setPosition(Common::Point(215, 115)); + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene200::signal() { + switch (_sceneMode) { + case 200: + R2_GLOBALS._sceneManager.changeScene(100); + break; + case 202: + R2_GLOBALS._sceneManager.changeScene(250); + break; + case 204: + R2_GLOBALS._sceneManager.changeScene(400); + break; + case 206: + R2_GLOBALS._sceneManager.changeScene(150); + break; + case 208: + R2_GLOBALS._sceneManager.changeScene(175); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 300 - Bridge + * + *--------------------------------------------------------------------------*/ + +void Scene300::Action1::signal() { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex) { + case 0: + setAction(&scene->_sequenceManager2, this, 311, (R2_GLOBALS._player._characterIndex == 1) ? + (SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn); + _actionIndex = 2; + break; + case 1: + setAction(&scene->_sequenceManager2, this, 312, (R2_GLOBALS._player._characterIndex == 1) ? + (SceneObject *)&R2_GLOBALS._player : (SceneObject *)&scene->_quinn); + _actionIndex = 0; + break; + case 2: + if (!R2_GLOBALS._playStream.isPlaying()) + _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1); + break; + default: + break; + } +} + +void Scene300::Action2::signal() { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex) { + case 0: + setAction(&scene->_sequenceManager3, this, 302, &scene->_seeker, NULL); + _actionIndex = 2; + break; + case 1: + setAction(&scene->_sequenceManager3, this, 303, &scene->_seeker, NULL); + _actionIndex = 2; + break; + case 2: + if (!R2_GLOBALS._playStream.isPlaying()) + _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1); + + setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119)); + break; + default: + break; + } +} + +void Scene300::Action3::signal() { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex) { + case 0: + setAction(&scene->_sequenceManager3, this, 304, &scene->_miranda, NULL); + _actionIndex = 2; + break; + case 1: + setAction(&scene->_sequenceManager3, this, 305, &scene->_miranda, NULL); + _actionIndex = 2; + break; + case 2: + if (!R2_GLOBALS._playStream.isPlaying()) + _actionIndex = R2_GLOBALS._randomSource.getRandomNumber(1); + + setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(119)); + break; + default: + break; + } +} + + +void Scene300::Action4::signal() { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + if (!R2_GLOBALS._playStream.isPlaying()) { + scene->_object7.setStrip2(R2_GLOBALS._randomSource.getRandomNumber(2)); + scene->_object7.setFrame(1); + + scene->_object9.setStrip2(3); + scene->_object9.setFrame(1); + } + + setDelay(60 + R2_GLOBALS._randomSource.getRandomNumber(479)); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene300::QuinnWorkstation::startAction(CursorType action, Event &event) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (R2_GLOBALS._player._characterIndex != 1) + SceneItem::display2(300, 46); + else if (R2_GLOBALS.getFlag(44)) { + R2_GLOBALS._player.setAction(NULL); + R2_GLOBALS._sceneManager.changeScene(325); + } else { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 306; + scene->setAction(&scene->_sequenceManager1, scene, 306, &R2_GLOBALS._player, NULL); + } + return true; + + case CURSOR_LOOK: + if (R2_GLOBALS._player._characterIndex == 1) { + SceneItem::display2(300, 47); + return true; + } + break; + + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +bool Scene300::MirandaWorkstation::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_USE: + if (R2_GLOBALS._player._characterIndex != 3) + SceneItem::display2(300, 49); + else + R2_GLOBALS._sceneManager.changeScene(325); + return true; + + case CURSOR_LOOK: + if (R2_GLOBALS._player._characterIndex == 3) { + SceneItem::display2(300, 47); + return true; + } + break; + + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +bool Scene300::SeekerWorkstation::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + if (R2_GLOBALS._player._characterIndex == 2) { + SceneItem::display2(300, 47); + return true; + } + break; + + case CURSOR_USE: + if (R2_GLOBALS._player._characterIndex != 2) + SceneItem::display2(300, 48); + else + R2_GLOBALS._sceneManager.changeScene(325); + return true; + + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene300::Miranda::startAction(CursorType action, Event &event) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + // Quinn talking to Miranda + R2_GLOBALS._player.disableControl(); + + if (!R2_GLOBALS.getFlag(44)) { + if (R2_GLOBALS.getFlag(40)) + scene->_stripId = 119; + else if (R2_GLOBALS.getFlag(38)) + scene->_stripId = 101; + else { + R2_GLOBALS._sound1.play(69); + scene->_stripId = 100; + } + + scene->_sceneMode = 309; + scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL); + } else if (!R2_GLOBALS.getFlag(55)) { + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + scene->_sceneMode = 10; + scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList); + } else { + scene->_sceneMode = 16; + + if (!R2_GLOBALS.getFlag(57)) { + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + scene->_stripManager.start3(434, scene, R2_GLOBALS._stripManager_lookupList); + } else if (R2_GLOBALS._player._characterScene[R2_MIRANDA] != 500) { + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + scene->_stripManager.start3(407, scene, R2_GLOBALS._stripManager_lookupList); + } else { + scene->_stripId = 433; + scene->_sceneMode = 309; + scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL); + } + } + } else { + // Seeker talking to Miranda + scene->_sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + + if (!R2_GLOBALS.getFlag(44)) + scene->_stripId = 174 + R2_GLOBALS._randomSource.getRandomNumber(2); + else if (!R2_GLOBALS.getFlag(55)) + scene->_stripId = 211; + else + scene->_stripId = 438; + + scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList); + } + return true; + + case R2_OPTO_DISK: + SceneItem::display2(300, 54); + return true; + + case R2_2: + if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1)) + SceneItem::display2(300, 55); + else { + R2_GLOBALS._player.disableControl(); + scene->_stripId = R2_GLOBALS.getFlag(4) ? 121 : 120; + scene->_sceneMode = 309; + scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL); + } + return true; + + default: + break; + } + + return SceneActor::startAction(action, event); +} + +bool Scene300::Seeker::startAction(CursorType action, Event &event) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._player._characterIndex == R2_QUINN) { + if (R2_GLOBALS.getFlag(44)) { + if (!R2_GLOBALS.getFlag(38)) { + R2_GLOBALS._sound1.play(69); + scene->_stripId = 181; + scene->_sceneMode = 310; + scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL); + } else { + scene->_stripId = R2_GLOBALS.getFlag(40) ? 170 : 150; + scene->_sceneMode = 310; + scene->setAction(&scene->_sequenceManager1, scene, 309, &R2_GLOBALS._player, NULL); + } + } else { + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + if (!R2_GLOBALS.getFlag(55)) { + scene->_sceneMode = 10; + scene->_stripManager.start3(205, scene, R2_GLOBALS._stripManager_lookupList); + } else { + scene->_sceneMode = 16; + scene->_stripManager.start3(R2_GLOBALS.getFlag(57) ? 407 : 401, scene, R2_GLOBALS._stripManager_lookupList); + } + } + } else { + scene->_sceneMode = 10; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + + if (!R2_GLOBALS.getFlag(44)) + scene->_stripId = 122 + R2_GLOBALS._randomSource.getRandomNumber(2); + else if (!R2_GLOBALS.getFlag(55)) + scene->_stripId = 209; + else + scene->_stripId = 440; + + scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList); + } + return true; + + case R2_OPTO_DISK: + if (R2_GLOBALS.getFlag(13)) { + SceneItem::display2(300, 53); + } else { + R2_GLOBALS._player.disableControl(); + scene->_stripId = 171; + } + + scene->_sceneMode = 310; + scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL); + return true; + + case R2_2: + if (!R2_GLOBALS.getFlag(2) || !R2_GLOBALS.getFlag(3) || (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1)) + break; + + R2_GLOBALS._player.disableControl(); + scene->_stripId = R2_GLOBALS.getFlag(4) ? 173 : 172; + scene->_sceneMode = 310; + scene->setAction(&scene->_sequenceManager1, scene, 310, &R2_GLOBALS._player, NULL); + return true; + + default: + break; + } + + return SceneActor::startAction(action, event); +} + +bool Scene300::Quinn::startAction(CursorType action, Event &event) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + scene->_sceneMode = 10; + + if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) { + if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500) + scene->_stripId = 442; + else if (!R2_GLOBALS.getFlag(44)) + scene->_stripId = 177 + R2_GLOBALS._randomSource.getRandomNumber(2); + else if (!R2_GLOBALS.getFlag(55)) + scene->_stripId = 208; + else + scene->_stripId = 441; + } else if (R2_GLOBALS._player._characterScene[R2_MIRANDA] == 500) { + scene->_stripId = 442; + } else if (R2_GLOBALS.getFlag(44)) { + scene->_stripId = R2_GLOBALS.getFlag(55) ? 441 : 208; + } else { + scene->_stripId = 125 + R2_GLOBALS._randomSource.getRandomNumber(2); + } + + scene->_stripManager.start3(scene->_stripId, scene, R2_GLOBALS._stripManager_lookupList); + return true; + + default: + return SceneActor::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene300::Scene300(): SceneExt() { + _stripId = 0; + _rotation = NULL; +} + +void Scene300::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_stripId); + SYNC_POINTER(_rotation); +} + +void Scene300::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(300); + _sound1.play(23); + setZoomPercents(75, 93, 120, 100); + + if (R2_GLOBALS._sceneManager._previousScene == -1) { + R2_GLOBALS._sceneManager._previousScene = 1000; + R2_GLOBALS._player._characterIndex = R2_QUINN; + } + + _stripManager.setColors(60, 255); + _stripManager.setFontNumber(3); + _stripManager.addSpeaker(&_mirandaSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_quinnLSpeaker); + _stripManager.addSpeaker(&_seekerLSpeaker); + _stripManager.addSpeaker(&_tealSpeaker); + _stripManager.addSpeaker(&_soldierSpeaker); + + _rotation = R2_GLOBALS._scenePalette.addRotation(237, 254, -1); + _rotation->setDelay(3); + _rotation->_countdown = 1; + + if (R2_GLOBALS.getFlag(51) && !R2_GLOBALS.getFlag(25)) { + _object1.postInit(); + _object1.setup(301, 7, 2); + _object1.setPosition(Common::Point(65, 24)); + + _object2.postInit(); + _object2.setup(301, 8, 2); + _object2.setPosition(Common::Point(254, 24)); + } + + _doorway.postInit(); + _doorway.setVisage(300); + _doorway.setPosition(Common::Point(159, 79)); + + _object3.postInit(); + _object3.setup(300, 4, 1); + _object3.setPosition(Common::Point(84, 48)); + _object3.animate(ANIM_MODE_2, NULL); + _object3._numFrames = 5; + + _object4.postInit(); + _object4.setup(300, 5, 1); + _object4.setPosition(Common::Point(236, 48)); + + _object4.animate(ANIM_MODE_2, NULL); + + _protocolDisplay.postInit(); + _protocolDisplay.setup(300, 6, 1); + _protocolDisplay.setPosition(Common::Point(287, 71)); + _protocolDisplay.animate(ANIM_MODE_7, NULL); + _protocolDisplay._numFrames = 5; + + _object6.postInit(); + _object6.setup(300, 7, 1); + _object6.setPosition(Common::Point(214, 37)); + _object6.animate(ANIM_MODE_2, NULL); + _object6._numFrames = 3; + + _object7.postInit(); + _object7.setup(301, 1, 1); + _object7.setPosition(Common::Point(39, 97)); + _object7.fixPriority(124); + _object7.animate(ANIM_MODE_2, NULL); + _object7._numFrames = 5; + _object7.setAction(&_action4); + + _object8.postInit(); + _object8.setup(300, 8, 1); + _object8.setPosition(Common::Point(105, 37)); + _object8.animate(ANIM_MODE_2, NULL); + _object8._numFrames = 5; + + _object9.postInit(); + _object9.setup(301, 6, 1); + _object9.setPosition(Common::Point(274, 116)); + _object9.fixPriority(143); + _object9.animate(ANIM_MODE_2, NULL); + _object9._numFrames = 5; + + _quinnWorkstation1.setDetails(Rect(243, 148, 315, 167), 300, 30, 31, 32, 1, NULL); + _mirandaWorkstation1.setDetails(Rect(4, 128, 69, 167), 300, 33, 31, 35, 1, NULL); + + switch (R2_GLOBALS._player._characterIndex) { + case 1: + _miranda.postInit(); + _miranda.setup(302, 2, 1); + _miranda.setPosition(Common::Point(47, 128)); + _miranda.setAction(&_action3); + _miranda.setDetails(300, 39, 40, 41, 1, NULL); + + if ((R2_GLOBALS._player._characterScene[2] == 300) || (R2_GLOBALS._player._characterScene[2] == 325)) { + _seeker.postInit(); + _seeker.setVisage(302); + _seeker.setPosition(Common::Point(158, 108)); + _seeker.fixPriority(130); + _seeker.setAction(&_action2); + _seeker.setDetails(300, 42, 43, 44, 1, NULL); + } + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.disableControl(); + break; + + case 2: + _miranda.postInit(); + _miranda.setup(302, 2, 1); + _miranda.setPosition(Common::Point(47, 128)); + _miranda.setAction(&_action3); + _miranda.setDetails(300, 39, 40, 41, 1, NULL); + + if ((R2_GLOBALS._player._characterScene[1] == 300) || (R2_GLOBALS._player._characterScene[1] == 325)) { + _quinn.postInit(); + _quinn.setup(302, 3, 1); + _quinn.setPosition(Common::Point(271, 150)); + _quinn.setAction(&_action1); + _quinn.setDetails(300, 50, 51, 52, 1, NULL); + } + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setup(302, 1, 3); + R2_GLOBALS._player.setPosition(Common::Point(158, 108)); + R2_GLOBALS._player.fixPriority(130); + R2_GLOBALS._player.enableControl(CURSOR_USE); + break; + + case 3: + if ((R2_GLOBALS._player._characterScene[2] == 300) || (R2_GLOBALS._player._characterScene[2] == 325)) { + _seeker.postInit(); + _seeker.setVisage(302); + _seeker.setPosition(Common::Point(158, 108)); + _seeker.fixPriority(130); + _seeker.setAction(&_action2); + _seeker.setDetails(300, 42, 43, 44, 1, NULL); + } + + if ((R2_GLOBALS._player._characterScene[1] == 300) || (R2_GLOBALS._player._characterScene[1] == 325)) { + _quinn.postInit(); + _quinn.setup(302, 3, 1); + _quinn.setPosition(Common::Point(271, 150)); + _quinn.setAction(&_action1); + _quinn.setDetails(300, 50, 51, 52, 1, NULL); + } + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setup(302, 2, 1); + R2_GLOBALS._player.setPosition(Common::Point(47, 128)); + R2_GLOBALS._player.enableControl(CURSOR_USE); + break; + + default: + break; + } + + _seekerWorkstation.setDetails(Rect(101, 95, 217, 143), 300, 36, 31, 35, 1, NULL); + _quinnWorkstation2.setDetails(Rect(224, 102, 315, 143), 300, 30, 31, 32, 1, NULL); + _mirandaWorkstation2.setDetails(Rect(4, 83, 84, 124), 300, 33, 31, 35, 1, NULL); + _hull.setDetails(11, 300, 6, -1, -1); + _statusDisplays.setDetails(12, 300, 9, 10, -1); + _damageControl.setDetails(13, 300, 12, -1, -1); + _manualOverrides.setDetails(14, 300, 15, -1, 17); + _scanners1.setDetails(Rect(126, 15, 183, 25), 300, 18, -1, 20, 1, NULL); + _scanners2.setDetails(Rect(126, 80, 183, 90), 300, 18, -1, 20, 1, NULL); + _protocolDisplay.setDetails(300, 27, -1, 29, 1, NULL); + _indirectLighting1.setDetails(Rect(74, 71, 122, 89), 300, 21, -1, -1, 1, NULL); + _indirectLighting2.setDetails(Rect(197, 71, 245, 89), 300, 21, -1, -1, 1, NULL); + _lighting.setDetails(Rect(129, 3, 190, 14), 300, 24, -1, -1, 1, NULL); + _doorway.setDetails(300, 3, -1, 5, 1, NULL); + _background.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 300, 0, -1, -1, 1, NULL); + + switch (R2_GLOBALS._player._characterIndex) { + case 1: + _sceneMode = 300; + + switch (R2_GLOBALS._sceneManager._previousScene) { + case 250: + setAction(&_sequenceManager1, this, 300, &R2_GLOBALS._player, &_doorway, NULL); + break; + case 325: + if (!R2_GLOBALS.getFlag(44) || R2_GLOBALS.getFlag(25)) + setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL); + else { + R2_GLOBALS.setFlag(60); + R2_GLOBALS._player.setup(302, 3, 1); + R2_GLOBALS._player.setPosition(Common::Point(271, 150)); + R2_GLOBALS._player.setAction(&_action1); + + if (R2_GLOBALS.getFlag(55)) { + if (R2_GLOBALS.getFlag(57)) { + R2_GLOBALS.clearFlag(60); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _sceneMode = 16; + _stripManager.start(404, this); + } else { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + } + } else { + if (R2_GLOBALS.getFlag(45)) { + R2_GLOBALS.clearFlag(60); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _sceneMode = 12; + _stripManager.start3(204, this, R2_GLOBALS._stripManager_lookupList); + } else { + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player._canWalk = false; + } + } + } + break; + case 1000: + R2_GLOBALS.setFlag(60); + R2_GLOBALS._player.setup(302, 3, 1); + R2_GLOBALS._player.setPosition(Common::Point(271, 150)); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + + if (R2_GLOBALS.getFlag(51)) { + _sceneMode = 13; + _stripManager.start3(300, this, R2_GLOBALS._stripManager_lookupList); + } else { + _sceneMode = 11; + _stripManager.start3(200, this, R2_GLOBALS._stripManager_lookupList); + } + break; + + case 1100: + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.setPosition(Common::Point(160, 95)); + _stripId = 400; + _sceneMode = 309; + setAction(&_sequenceManager1, this, 309, &R2_GLOBALS._player, NULL); + break; + + case 1500: + R2_GLOBALS.clearFlag(60); + R2_GLOBALS._player.setup(302, 3, 1); + R2_GLOBALS._player.setPosition(Common::Point(271, 150)); + _sceneMode = 17; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(413, this); + break; + + default: + if (R2_GLOBALS.getFlag(60)) { + R2_GLOBALS._player.setup(302, 3, 1); + R2_GLOBALS._player.setPosition(Common::Point(271, 150)); + R2_GLOBALS._player.setAction(&_action1); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } else { + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.setPosition(Common::Point(200, 150)); + R2_GLOBALS._player.enableControl(); + } + break; + } + break; + + case 3: + if (R2_GLOBALS._sceneManager._previousScene == 1500) { + R2_GLOBALS._player._oldCharacterScene[3] = 3150; + R2_GLOBALS._player._characterScene[3] = 3150; + R2_GLOBALS._player._effect = 0; + R2_GLOBALS._player.setAction(NULL); + R2_GLOBALS._player.disableControl(); + + _quinn.postInit(); + _quinn.setVisage(10); + _quinn.setPosition(Common::Point(10, 10)); + _quinn.hide(); + + _seeker.postInit(); + _seeker.setVisage(20); + _seeker.setPosition(Common::Point(20, 20)); + _seeker.hide(); + + _teal.postInit(); + _soldier.postInit(); + _object12.postInit(); + + R2_GLOBALS._sound1.play(107); + _sceneMode = 308; + + setAction(&_sequenceManager1, this, 308, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, &_doorway, NULL); + } + break; + default: + break; + } +} + +void Scene300::remove() { + R2_GLOBALS._player.setAction(NULL); + SceneExt::remove(); +} + +void Scene300::signal() { + switch (_sceneMode) { + case 10: + switch (_stripManager._field2E8) { + case 0: + R2_GLOBALS._sound1.changeSound(10); + R2_GLOBALS.setFlag(38); + break; + case 1: + R2_GLOBALS.setFlag(3); + break; + case 2: + R2_GLOBALS.setFlag(4); + break; + case 3: + R2_GLOBALS.setFlag(13); + if (R2_GLOBALS._stripManager_lookupList[1] == 6) + R2_GLOBALS.setFlag(40); + break; + case 4: + if (R2_GLOBALS._stripManager_lookupList[1] == 6) + R2_GLOBALS.setFlag(40); + break; + case 5: + R2_GLOBALS._sceneManager.changeScene(1000); + break; + default: + break; + } + + _stripManager._field2E8 = 0; + switch (_stripId) { + case 400: + R2_GLOBALS._player.disableControl(); + _sceneMode = 15; + setAction(&_sequenceManager1, this, 306, &R2_GLOBALS._player, NULL); + break; + case 181: + R2_GLOBALS._player.setStrip(6); + // Deliberate fall-through + default: + R2_GLOBALS._player.enableControl(CURSOR_TALK); + + if ((R2_GLOBALS._player._characterIndex != 1) || R2_GLOBALS.getFlag(44)) + R2_GLOBALS._player._canWalk = false; + break; + } + break; + + case 11: + R2_GLOBALS.setFlag(44); + R2_GLOBALS._player.enableControl(CURSOR_USE); + break; + + case 12: + R2_GLOBALS._player.setAction(NULL); + R2_GLOBALS._sceneManager.changeScene(1010); + break; + + case 13: + R2_GLOBALS._player.disableControl(); + _seeker.changeZoom(-1); + _sceneMode = 313; + _seeker.setAction(NULL); + setAction(&_sequenceManager1, this, 313, &R2_GLOBALS._player, &_seeker, NULL); + break; + + case 14: + if (_seeker._action) + R2_GLOBALS._player.disableControl(); + _sceneMode = 314; + break; + + case 15: + R2_GLOBALS.setFlag(55); + R2_GLOBALS.setFlag(38); + R2_GLOBALS.setFlag(44); + R2_GLOBALS.setFlag(51); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _sceneMode = 16; + _stripManager.start3(401, this, R2_GLOBALS._stripManager_lookupList); + break; + + case 16: + if (_stripManager._field2E8 == 1) { + R2_GLOBALS._player.setAction(NULL); + R2_GLOBALS._sceneManager.changeScene(1000); + } else { + R2_GLOBALS._player.setAction(&_action1); + R2_GLOBALS._player.enableControl(CURSOR_TALK); + } + break; + + case 17: + R2_GLOBALS._player.disableControl(); + _sceneMode = 316; + _seeker.changeZoom(-1); + _seeker.setAction(&_sequenceManager3, this, 316, &_seeker, &_doorway, NULL); + R2_GLOBALS._player.setAction(&_sequenceManager1, NULL, 307, &R2_GLOBALS._player, NULL); + break; + + case 18: + R2_GLOBALS._player.disableControl(); + _sceneMode = 317; + setAction(&_sequenceManager1, this, 317, &_teal, &_doorway, NULL); + break; + + case 19: + R2_GLOBALS._player.disableControl(); + _sceneMode = 318; + setAction(&_sequenceManager1, this, 318, &R2_GLOBALS._player, &_teal, &_soldier, &_object12, NULL); + break; + + case 20: + R2_GLOBALS._player._characterIndex = R2_QUINN; + R2_GLOBALS._sceneManager.changeScene(1500); + break; + + case 300: + case 307: + R2_GLOBALS._player.enableControl(); + break; + + case 301: + R2_GLOBALS._sceneManager.changeScene(250); + break; + + case 306: + R2_GLOBALS._sceneManager.changeScene(325); + break; + + case 308: + _sceneMode = 18; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(418, this); + break; + + case 310: + R2_GLOBALS._player.setStrip(5); + // Deliberate fall-through + case 309: + signal309(); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _sceneMode = 10; + _stripManager.start3(_stripId, this, R2_GLOBALS._stripManager_lookupList); + break; + + case 313: + _sceneMode = 14; + R2_GLOBALS._player._effect = 0; + _seeker.setAction(&_sequenceManager3, this, 314, &_seeker, &_doorway, NULL); + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(301, this); + break; + + case 314: + R2_GLOBALS._player.disableControl(); + _sceneMode = 315; + R2_GLOBALS._player._effect = 1; + setAction(&_sequenceManager1, this, 315, &R2_GLOBALS._player, &_doorway, NULL); + break; + + case 315: + R2_GLOBALS._sceneManager.changeScene(1100); + break; + + case 316: + R2_GLOBALS._player._characterScene[2] = 500; + _seeker.remove(); + R2_GLOBALS._player.enableControl(CURSOR_CROSSHAIRS); + break; + + case 317: + _sceneMode = 19; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(419, this); + break; + + case 318: + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(420, this); + break; + + default: + break; + } +} + +void Scene300::signal309() { + if (R2_GLOBALS.getFlag(2)) + R2_GLOBALS._stripManager_lookupList[0] = (R2_INVENTORY.getObjectScene(R2_2) == 1) ? 3 : 2; + + if (R2_GLOBALS.getFlag(4)) + R2_GLOBALS._stripManager_lookupList[0] = 4; + + if (R2_INVENTORY.getObjectScene(R2_OPTO_DISK) == 1) + R2_GLOBALS._stripManager_lookupList[0] = 5; + + if (R2_GLOBALS.getFlag(13)) { + R2_GLOBALS._stripManager_lookupList[0] = 6; + R2_GLOBALS._stripManager_lookupList[2] = 2; + } + + if (R2_GLOBALS.getFlag(39)) + R2_GLOBALS._stripManager_lookupList[1] = 2; + + if (R2_GLOBALS.getFlag(5)) + R2_GLOBALS._stripManager_lookupList[1] = 3; + + if (R2_GLOBALS.getFlag(6)) + R2_GLOBALS._stripManager_lookupList[1] = 4; + + if (R2_GLOBALS.getFlag(8)) + R2_GLOBALS._stripManager_lookupList[1] = 5; + + if (R2_GLOBALS.getFlag(9)) { + R2_GLOBALS._stripManager_lookupList[1] = 6; + R2_GLOBALS._stripManager_lookupList[3] = 2; + } + + if (R2_GLOBALS.getFlag(48)) + R2_GLOBALS._stripManager_lookupList[4] = 2; + + if (R2_GLOBALS.getFlag(49)) + R2_GLOBALS._stripManager_lookupList[4] = 3; +} + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.h b/engines/tsage/ringworld2/ringworld2_scenes0.h new file mode 100644 index 0000000000..834b91c01c --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes0.h @@ -0,0 +1,285 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_SCENES0_H +#define TSAGE_RINGWORLD2_SCENES0_H + +#include "common/scummsys.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" +#include "tsage/ringworld2/ringworld2_speakers.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene50: public SceneExt { + + class Action1: public Action { + public: + void signal(); + }; + +public: + Action1 _action1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void process(Event &event); +}; + +class Scene100: public SceneExt { + /* Objects */ + class Door: public SceneActorExt { + public: + bool startAction(CursorType action, Event &event); + }; + class Table: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class StasisNegator: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Object10: public SceneActorExt { + public: + bool startAction(CursorType action, Event &event); + }; + class SteppingDisks: public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Terminal: public NamedHotspot{ + public: + bool startAction(CursorType action, Event &event); + }; + +public: + NamedHotspot _background, _duct, _bed, _desk; + Terminal _terminal; + SceneActor _object1, _object2, _object3, _object4, _object5; + SceneActor _object6; + Door _door; + Table _table; + StasisNegator _stasisNegator; + Object10 _object10; + SteppingDisks _steppingDisks; + SequenceManager _sequenceManager1, _sequenceManager2; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene125: public SceneExt { + /* Objects */ + class Object5: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Icon: public SceneActor { + public: + int _lookLineNum, _field98; + bool _pressed; + SceneObject _object1, _object2; + SceneText _sceneText1, _sceneText2; + + Icon(); + virtual Common::String getClassName() { return "Scene125_Icon"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void process(Event &event); + + void setIcon(int id); + void showIcon(); + void hideIcon(); + }; + + /* Items */ + class Item4: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + +public: + ScenePalette _palette; + ASoundExt _sound1; + NamedHotspot _background, _item2, _item3; + Item4 _item4; + SceneActor _object1, _object2, _object3, _object4, _object5, _object6, _object7; + Icon _icon1, _icon2, _icon3, _icon4, _icon5, _icon6; + SequenceManager _sequenceManager; + SceneText _sceneText; + int _consoleMode, _iconFontNumber, _logIndex, _databaseIndex, _infodiskIndex; + int _soundCount, _soundIndex; + int _soundIndexes[10]; + + Scene125(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + + void consoleAction(int id); + void setDetails(int resNum, int lineNum); + void stop(); + Common::String parseMessage(const Common::String &msg); +}; + +class Scene200: public SceneExt { + /* Objects */ + class NorthDoor: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class EastDoor: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class WestDoor: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Scene Exits */ + class EastExit: public SceneExit { + public: + virtual void changeScene(); + }; + class WestExit: public SceneExit { + public: + virtual void changeScene(); + }; +public: + NamedHotspot _background, _compartment, _westDoorDisplay, _eastDoorDisplay; + NorthDoor _northDoor; + EastDoor _eastDoor; + WestDoor _westDoor; + EastExit _eastExit; + WestExit _westExit; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene300: public SceneExt { + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + }; + class Action4: public Action { + public: + virtual void signal(); + }; + + /* Items */ + class QuinnWorkstation: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class MirandaWorkstation: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SeekerWorkstation: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Miranda: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Seeker: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Quinn: public SceneActor { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3, _sequenceManager4; + ASoundExt _sound1; + SpeakerMiranda300 _mirandaSpeaker; + SpeakerSeeker300 _seekerSpeaker; + SpeakerSeekerL _seekerLSpeaker; + SpeakerQuinn300 _quinnSpeaker; + SpeakerQuinnL _quinnLSpeaker; + SpeakerTeal300 _tealSpeaker; + SpeakerSoldier300 _soldierSpeaker; + + NamedHotspot _background, _hull, _statusDisplays, _damageControl, _manualOverrides; + NamedHotspot _scanners1, _scanners2, _indirectLighting1, _indirectLighting2, _lighting; + QuinnWorkstation _quinnWorkstation1, _quinnWorkstation2; + SeekerWorkstation _seekerWorkstation; + MirandaWorkstation _mirandaWorkstation1, _mirandaWorkstation2; + SceneActor _object1, _object2, _object3, _object4, _protocolDisplay; + SceneActor _object6, _object7, _object8, _object9; + SceneActor _teal, _soldier, _object12, _doorway; + Miranda _miranda; + Seeker _seeker; + Quinn _quinn; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + PaletteRotation *_rotation; + int _stripId; + + Scene300(); + void signal309(); + + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +} // End of namespace Ringworld2 + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.cpp b/engines/tsage/ringworld2/ringworld2_scenes2.cpp new file mode 100644 index 0000000000..18fd6e6bde --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes2.cpp @@ -0,0 +1,2507 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_scenes2.h" + +namespace TsAGE { + +namespace Ringworld2 { + +/*-------------------------------------------------------------------------- + * Scene 2000 - Maze + * + *--------------------------------------------------------------------------*/ +void Scene2000::initPlayer() { + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + + warning("initPlayer: %d", _mazePlayerMode); + switch (_mazePlayerMode) { + case 0: + R2_GLOBALS._player.setStrip(5); + if (_exit1._enabled) { + if (_exit2._enabled) + R2_GLOBALS._player.setPosition(Common::Point(140, 129)); + else + R2_GLOBALS._player.setPosition(Common::Point(20, 129)); + } else + R2_GLOBALS._player.setPosition(Common::Point(245, 129)); + R2_GLOBALS._player.enableControl(); + warning("EnableControl, with 2 arguments?"); + break; + case 1: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2001; + else + _sceneMode = 2021; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 2: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2002; + else + _sceneMode = 2022; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 3: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2000; + else + _sceneMode = 2020; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 4: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2005; + else + _sceneMode = 2025; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 5: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2004; + else + _sceneMode = 2024; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 6: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2009; + else + _sceneMode = 2029; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 7: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2008; + else + _sceneMode = 2028; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 8: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2013; + else + _sceneMode = 2033; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 9: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2012; + else + _sceneMode = 2032; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 10: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2016; + else + _sceneMode = 2036; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + case 11: + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2038; + else + _sceneMode = 2040; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + break; + default: + break; + } + for (int i = 0; i < 11; i++) { + if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == R2_GLOBALS._v56605[3 + i]) + _objList1[i].show(); + } + + if ((R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) && (R2_GLOBALS._v56605[1] == R2_GLOBALS._v56605[2])) { + _object1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _object1.setup(20, 5, 1); + _object1.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _object1.setup(2008, 5, 1); + _object1.setDetails(9001, 0, 5, 3, 1, NULL); + } + if (_exit1._enabled) { + if (_exit2._enabled) + _object1.setPosition(Common::Point(180, 128)); + else + _object1.setPosition(Common::Point(75, 128)); + } else + _object1.setPosition(Common::Point(300, 128)); + } +} + +void Scene2000::initExits() { + _exit1._enabled = true; + _exit2._enabled = true; + _exit3._enabled = false; + _exit4._enabled = false; + _exit5._enabled = false; + + _exit1._insideArea = false; + _exit2._insideArea = false; + _exit3._insideArea = false; + _exit4._insideArea = false; + _exit5._insideArea = false; + + _exit1._moving = false; + _exit2._moving = false; + _exit3._moving = false; + _exit4._moving = false; + _exit5._moving = false; + + for (int i = 0; i < 11; i++) + _objList1[i].hide(); + + _object1.remove(); + + warning("initExits: %d", R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]); + + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) { + case 3: + case 10: + case 16: + case 21: + _exit5._enabled = true; + _exit5._bounds.set(61, 68, 90, 125); + _exit5.setDest(Common::Point(92, 129)); + _exit5._cursorNum = EXITCURSOR_W; + break; + case 4: + case 12: + case 25: + case 34: + _exit5._enabled = true; + _exit5._bounds.set(230, 68, 259, 125); + _exit5.setDest(Common::Point(244, 129)); + _exit5._cursorNum = EXITCURSOR_E; + break; + default: + break; + } + + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] - 1) { + case 0: + case 6: + case 13: + case 18: + case 22: + case 27: + case 30: + _exit1._enabled = false; + loadScene(2225); + R2_GLOBALS._walkRegions.load(2225); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + case 1: + case 19: + _exit3._enabled = true; + _exit3._bounds.set(71, 130, 154, 168); + _exit3.setDest(Common::Point(94, 129)); + _exit3._cursorNum = EXITCURSOR_SE; + loadScene(2300); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._walkRegions.load(2000); + break; + case 2: + case 9: + case 15: + case 20: + loadScene(2150); + R2_GLOBALS._walkRegions.load(2000); + switch(R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) { + case 2400: + _mazePlayerMode = 1; + break; + case 2425: + case 2430: + case 2435: + case 2450: + _mazePlayerMode = 3; + break; + default: + if (!_exitingFlag) + _mazePlayerMode = 0; + break; + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 3: + case 11: + case 24: + case 33: + loadScene(2175); + R2_GLOBALS._walkRegions.load(2000); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + if (!_exitingFlag) + _mazePlayerMode = 0; + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350) + _mazePlayerMode = 1; + else + _mazePlayerMode = 10; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 4: + case 8: + loadScene(2000); + R2_GLOBALS._walkRegions.load(2000); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900) + _mazePlayerMode = 1; + else if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 5: + case 12: + case 17: + case 21: + case 26: + loadScene(2200); + R2_GLOBALS._walkRegions.load(2000); + _exit2._enabled = false; + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 1900) + _mazePlayerMode = 2; + else if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 7: + case 29: + _exit4._enabled = true; + _exit4._bounds.set(138, 83, 211, 125); + _exit4.setDest(Common::Point(129, 188)); + _exit4._cursorNum = EXITCURSOR_NW; + loadScene(2250); + R2_GLOBALS._walkRegions.load(2000); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2500) + _mazePlayerMode = 1; + else if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 10: + case 25: + _exit3._enabled = true; + _exit3._bounds.set(78, 130, 148, 168); + _exit3.setDest(Common::Point(100, 129)); + _exit3._cursorNum = EXITCURSOR_SE; + loadScene(2075); + R2_GLOBALS._walkRegions.load(2000); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + case 14: + _exit3._enabled = true; + _exit3._bounds.set(160, 130, 248, 168); + _exit3.setDest(Common::Point(225, 129)); + _exit3._cursorNum = EXITCURSOR_SW; + loadScene(2325); + R2_GLOBALS._walkRegions.load(2000); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + case 16: + case 31: + _exit4._enabled = true; + _exit4._bounds.set(122, 83, 207, 125); + _exit4.setDest(Common::Point(210, 129)); + _exit4._cursorNum = EXITCURSOR_NW; + loadScene(2125); + R2_GLOBALS._walkRegions.load(2000); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2400) + _mazePlayerMode = 2; + else if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + R2_GLOBALS._sceneManager._previousScene = 2000; + break; + case 23: + _exit4._enabled = true; + _exit4._bounds.set(108, 83, 128, 184); + _exit4.setDest(Common::Point(135, 129)); + _exit4._cursorNum = CURSOR_INVALID; + loadScene(2275); + R2_GLOBALS._walkRegions.load(2000); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + case 28: + _exit3._enabled = true; + _exit3._bounds.set(171, 130, 241, 168); + _exit3.setDest(Common::Point(218, 129)); + _exit3._cursorNum = EXITCURSOR_SW; + loadScene(2050); + R2_GLOBALS._walkRegions.load(2000); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2350) + _mazePlayerMode = 11; + else if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + case 32: + loadScene(2025); + R2_GLOBALS._walkRegions.load(2000); + if (!_exitingFlag) + _mazePlayerMode = 0; + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2000; + break; + default: + break; + } + _exitingFlag = false; + R2_GLOBALS._uiElements.show(); +} + +void Scene2000::Action1::signal() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + + switch (_actionIndex) { + case 0: { + _actionIndex = 1; + Common::Point pt(-20, 127); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + scene->_objList1[_state].addMover(mover, &pt, scene); + break; + } + case 1: + scene->_objList1[_state].setPosition(Common::Point(340, 127)); + --R2_GLOBALS._v56605[4 + _state]; + _actionIndex = 0; + switch (_state - 1) { + case 0: + if (R2_GLOBALS._v56605[4] == 1) + _actionIndex = 10; + break; + case 2: + if (R2_GLOBALS._v56605[6] == 7) + _actionIndex = 10; + break; + case 4: + if (R2_GLOBALS._v56605[8] == 14) + _actionIndex = 10; + break; + case 6: + if (R2_GLOBALS._v56605[10] == 19) + _actionIndex = 10; + break; + case 7: + if (R2_GLOBALS._v56605[11] == 23) + _actionIndex = 10; + break; + default: + break; + } + + if (R2_GLOBALS._v56605[3 + _state] == R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) + scene->_objList1[_state].show(); + else + scene->_objList1[_state].hide(); + + signal(); + break; + case 5: { + _actionIndex = 6; + Common::Point pt(340, 127); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + scene->_objList1[_state].addMover(mover, &pt, this); + break; + } + case 6: + scene->_objList1[_state].setPosition(Common::Point(-20, 127)); + ++R2_GLOBALS._v56605[3 + _state]; + _actionIndex = 5; + switch (_state - 1) { + case 0: + if (R2_GLOBALS._v56605[4] == 5) + _actionIndex = 15; + break; + case 2: + if (R2_GLOBALS._v56605[6] == 13) + _actionIndex = 15; + break; + case 4: + if (R2_GLOBALS._v56605[8] == 16) + _actionIndex = 15; + break; + case 6: + if (R2_GLOBALS._v56605[10] == 22) + _actionIndex = 15; + break; + case 7: + if (R2_GLOBALS._v56605[11] == 27) + _actionIndex = 15; + break; + default: + break; + } + + if (R2_GLOBALS._v56605[3 + _state] == R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) + scene->_objList1[_state].show(); + else + scene->_objList1[_state].hide(); + + signal(); + break; + case 10: { + Common::Point pt(290, 127); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + scene->_objList1[_state].addMover(mover, &pt, this); + _actionIndex = 11; + break; + } + case 11: + if (_state == 1) + scene->_objList1[0].setStrip(1); + else if (_state == 5) + scene->_objList1[4].setStrip(1); + setDelay(600); + _actionIndex = 12; + break; + case 12: + if (_state == 1) + scene->_objList1[0].setStrip(2); + else if (_state == 5) + scene->_objList1[4].setStrip(2); + scene->_objList1[_state].setStrip(1); + _actionIndex = 5; + signal(); + break; + case 15: + if ((R2_GLOBALS._v56605[3 + _state] == 13) || (R2_GLOBALS._v56605[3 + _state] == 22) || (R2_GLOBALS._v56605[3 + _state] == 27)) { + Common::Point pt(30, 127); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + scene->_objList1[_state].addMover(mover, &pt, this); + _actionIndex = 16; + } else { + Common::Point pt(120, 127); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + scene->_objList1[_state].addMover(mover, &pt, this); + _actionIndex = 16; + } + break; + case 16: + if (_state == 1) + scene->_objList1[2].setStrip(2); + else if (_state == 8) + scene->_objList1[9].setStrip(2); + setDelay(600); + _actionIndex = 17; + break; + case 17: + if (_state == 1) + scene->_objList1[2].setStrip(1); + else if (_state == 8) + scene->_objList1[9].setStrip(1); + scene->_objList1[_state].setStrip(2); + _actionIndex = 0; + break; + case 99: + error("99"); + break; + default: + break; + } +} + +void Scene2000::Exit1::changeScene() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + warning("exit1"); + + scene->_exitingFlag = true; + scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + scene->_sceneMode = 10; + + warning("TODO: Check sub_22D26"); + Common::Point pt(-10, 129); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + + scene->setAction(&scene->_sequenceManager, scene, 206, &R2_GLOBALS._player, NULL); +} + +void Scene2000::Exit2::changeScene() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + warning("exit2"); + + scene->_exitingFlag = true; + scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + scene->_sceneMode = 11; + + warning("TODO: Check sub_22D26"); + Common::Point pt(330, 129); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene2000::Exit3::changeScene() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + warning("exit13"); + + scene->_exitingFlag = true; + scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + scene->_sceneMode = 12; + + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) { + case 2: + scene->_mazePlayerMode = 4; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 8; + break; + case 11: + scene->_mazePlayerMode = 6; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 17; + break; + case 15: + scene->_mazePlayerMode = 8; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 24; + break; + case 20: + scene->_mazePlayerMode = 4; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 30; + break; + case 26: + scene->_mazePlayerMode = 6; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 32; + break; + case 29: + scene->_mazePlayerMode = 11; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 29; + break; + default: + break; + } + + switch (scene->_mazePlayerMode) { + case 4: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2003, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2023, &R2_GLOBALS._player, NULL); + break; + case 6: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2007, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2027, &R2_GLOBALS._player, NULL); + break; + case 8: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2011, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2031, &R2_GLOBALS._player, NULL); + break; + case 11: + if (R2_GLOBALS._player._characterIndex == 1) + scene->_sceneMode = 2039; + else + scene->_sceneMode = 2041; + scene->setAction(&scene->_sequenceManager, scene, scene->_sceneMode, &R2_GLOBALS._player, NULL); + break; + + default: + break; + } +} +void Scene2000::Exit4::changeScene() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + warning("exit4"); + + scene->_exitingFlag = true; + scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + scene->_sceneMode = 13; + + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) { + case 8: + scene->_mazePlayerMode = 5; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 2; + break; + case 17: + scene->_mazePlayerMode = 7; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 11; + break; + case 24: + scene->_mazePlayerMode = 9; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 15; + break; + case 30: + scene->_mazePlayerMode = 5; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 20; + break; + case 32: + scene->_mazePlayerMode = 7; + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 26; + break; + default: + break; + } + + switch (scene->_mazePlayerMode) { + case 5: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2006, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2026, &R2_GLOBALS._player, NULL); + break; + case 7: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2010, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2030, &R2_GLOBALS._player, NULL); + break; + case 9: + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2014, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2034, &R2_GLOBALS._player, NULL); + break; + default: + break; + } +} + +void Scene2000::Exit5::changeScene() { + Scene2000 *scene = (Scene2000 *)R2_GLOBALS._sceneManager._scene; + warning("exit5"); + + scene->_sceneMode = 0; + R2_GLOBALS._player.disableControl(); + warning("DisableControl, with arguments?"); + scene->_sceneMode = 14; + + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) { + case 3: + scene->_mazePlayerMode = 1; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL); + break; + case 4: + scene->_mazePlayerMode = 7; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL); + break; + case 10: + scene->_mazePlayerMode = 8; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL); + break; + case 12: + scene->_mazePlayerMode = 3; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL); + break; + case 16: + scene->_mazePlayerMode = 4; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL); + break; + case 21: + scene->_mazePlayerMode = 5; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2015, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2035, &R2_GLOBALS._player, NULL); + break; + case 25: + scene->_mazePlayerMode = 2; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL); + break; + case 34: + scene->_mazePlayerMode = 6; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2017, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2037, &R2_GLOBALS._player, NULL); + break; + default: + break; + } +} + +void Scene2000::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(2000); + + if (R2_GLOBALS._sceneManager._previousScene != -1) { + R2_GLOBALS._v56605[1] = 21; + R2_GLOBALS._v56605[2] = 21; + } + if ((R2_GLOBALS._player._characterScene[R2_GLOBALS._player._characterIndex] != R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) && (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] != 2350)) { + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 0; + } + _exitingFlag = false; + + _exit1.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2000); + _exit1.setDest(Common::Point(14, 129)); + _exit2.setDetails(Rect(305, 100, 320, 140), EXITCURSOR_E, 2000); + _exit2.setDest(Common::Point(315, 129)); + _exit3.setDetails(Rect(71, 130, 154, 168), EXITCURSOR_S, 2000); + _exit3.setDest(Common::Point(94, 129)); + _exit4.setDetails(Rect(138, 83, 211, 125), EXITCURSOR_N, 2000); + _exit4.setDest(Common::Point(188, 128)); + _exit5.setDetails(Rect(61, 68, 90, 125), EXITCURSOR_W, 2000); + _exit5.setDest(Common::Point(92, 129)); + + R2_GLOBALS._sound1.play(200); + initExits(); + g_globals->_sceneManager._fadeMode = FADEMODE_IMMEDIATE; + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setup(2008, 3, 1); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setup(20, 3, 1); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + + _action1._state = 8; + _action2._state = 1; + _action3._state = 5; + _action4._state = 7; + _action5._state = 3; + + for (int i = 0; i < 11; i++) + _objList1[i].postInit(); + + _objList1[0].setVisage(2000); + _objList1[0].setStrip(2); + _objList1[0].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[1].setVisage(2001); + _objList1[1].setStrip(2); + _objList1[1].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[2].setVisage(2003); + _objList1[2].setStrip(1); + _objList1[2].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[3].setVisage(2007); + _objList1[3].setStrip(2); + _objList1[3].setDetails(2001, 12, -1, -1, 1, NULL); + + _objList1[4].setVisage(2004); + _objList1[4].setStrip(2); + _objList1[4].setDetails(2001, 19, -1, -1, 1, NULL); + + _objList1[5].setVisage(2003); + _objList1[5].setStrip(2); + _objList1[5].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[6].setVisage(2000); + _objList1[6].setStrip(1); + _objList1[6].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[7].setVisage(2000); + _objList1[7].setStrip(2); + _objList1[7].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[8].setVisage(2000); + _objList1[8].setStrip(2); + _objList1[8].setDetails(2001, 0, -1, -1, 1, NULL); + + _objList1[9].setVisage(2006); + _objList1[9].setStrip(1); + _objList1[9].setDetails(2001, 6, -1, -1, 1, NULL); + + _objList1[10].setVisage(2007); + _objList1[10].setStrip(1); + _objList1[10].setDetails(2001, 12, -1, -1, 1, NULL); + + for (int i = 0; i < 11; i++) { + _objList1[i].animate(ANIM_MODE_1, NULL); + _objList1[i]._moveDiff.x = 3; + _objList1[i]._moveRate = 8; + _objList1[i].hide(); + switch (i - 1) { + case 0: + if (R2_GLOBALS._v56605[3 + i] == 1) + ++R2_GLOBALS._v56605[3 + i]; + else if (R2_GLOBALS._v56605[3 + i] == 5) + --R2_GLOBALS._v56605[3 + i]; + break; + case 2: + if (R2_GLOBALS._v56605[3 + i] == 7) + ++R2_GLOBALS._v56605[3 + i]; + else if (R2_GLOBALS._v56605[3 + i] == 13) + --R2_GLOBALS._v56605[3 + i]; + break; + case 4: + if (R2_GLOBALS._v56605[3 + i] == 14) + ++R2_GLOBALS._v56605[3 + i]; + else if (R2_GLOBALS._v56605[3 + i] == 16) + --R2_GLOBALS._v56605[3 + i]; + break; + case 6: + if (R2_GLOBALS._v56605[3 + i] == 19) + ++R2_GLOBALS._v56605[3 + i]; + else if (R2_GLOBALS._v56605[3 + i] == 22) + --R2_GLOBALS._v56605[3 + i]; + break; + case 8: + if (R2_GLOBALS._v56605[3 + i] == 23) + ++R2_GLOBALS._v56605[3 + i]; + else if (R2_GLOBALS._v56605[3 + i] == 27) + --R2_GLOBALS._v56605[3 + i]; + break; + default: + break; + } + switch (R2_GLOBALS._v56605[3 + i] - 1) { + case 0: + case 6: + case 13: + case 18: + case 22: + case 27: + case 30: + _objList1[i].setPosition(Common::Point(265, 127)); + break; + case 5: + case 12: + case 17: + case 21: + case 26: + _objList1[i].setPosition(Common::Point(55, 127)); + break; + default: + _objList1[i].setPosition(Common::Point(160, 127)); + break; + } + } + _objList1[1].setAction(&_action2); + _objList1[3].setAction(&_action5); + _objList1[5].setAction(&_action4); + _objList1[8].setAction(&_action1); + + initPlayer(); + + _item1.setDetails(Rect(0, 0, 320, 200), 2000, 0, -1, 23, 1, NULL); +} + +void Scene2000::remove() { + R2_GLOBALS._sound1.fadeOut(NULL); + SceneExt::remove(); +} + +void Scene2000::signal() { + switch (_sceneMode) { + case 10: + if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == 6) + g_globals->_sceneManager.changeScene(1900); + else { + _mazePlayerMode = 1; + --R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]; + initExits(); + initPlayer(); + } + break; + case 11: + switch (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]) { + case 5: + g_globals->_sceneManager.changeScene(1900); + break; + case 30: + g_globals->_sceneManager.changeScene(2500); + break; + case 34: + g_globals->_sceneManager.changeScene(2350); + break; + default: + _mazePlayerMode = 2; + ++R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex]; + initExits(); + initPlayer(); + break; + } + break; + case 12: + case 13: + initExits(); + initPlayer(); + break; + case 14: + switch (_mazePlayerMode - 1) { + case 0: + g_globals->_sceneManager.changeScene(2450); + break; + case 1: + g_globals->_sceneManager.changeScene(2440); + break; + case 2: + g_globals->_sceneManager.changeScene(2435); + break; + case 3: + g_globals->_sceneManager.changeScene(2430); + break; + case 4: + g_globals->_sceneManager.changeScene(2425); + break; + case 5: + g_globals->_sceneManager.changeScene(2525); + break; + case 6: + g_globals->_sceneManager.changeScene(2530); + break; + case 7: + g_globals->_sceneManager.changeScene(2535); + break; + default: + break; + } + break; + case 2039: + case 2041: + g_globals->_sceneManager.changeScene(2350); + break; + default: + break; + } +} + +void Scene2000::process(Event &event) { + if ((R2_GLOBALS._player._canWalk) && (event.eventType == EVENT_BUTTON_DOWN) && + (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)) { + warning("TODO: Check sub_22D26"); + + Common::Point pt(event.mousePos.x, 129); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + + event.handled = true; + } + Scene::process(event); +} + +void Scene2000::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsByte(_exitingFlag); + s.syncAsSint16LE(_mazePlayerMode); +} + +/*-------------------------------------------------------------------------- + * Scene 2350 - Balloon Launch Platform + * + *--------------------------------------------------------------------------*/ +bool Scene2350::Actor2::startAction(CursorType action, Event &event) { + if (action != R2_6) + return(SceneActor::startAction(action, event)); + return true; +} + +bool Scene2350::Actor3::startAction(CursorType action, Event &event) { + Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene; + + if ((action == R2_20) && (R2_GLOBALS.getFlag(74))) { + R2_GLOBALS._player.disableControl(); + scene->_actor1.postInit(); + scene->_sceneMode = 2355; + scene->setAction(&scene->_sequenceManager, scene, 2355, &R2_GLOBALS._player, &scene->_actor1, NULL); + return true; + } + + return(SceneActor::startAction(action, event)); +} + +void Scene2350::ExitUp::changeScene() { + Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 12; + if (R2_GLOBALS._player._characterIndex == 1) + scene->setAction(&scene->_sequenceManager, scene, 2350, &R2_GLOBALS._player, NULL); + else + scene->setAction(&scene->_sequenceManager, scene, 2352, &R2_GLOBALS._player, NULL); +} + +void Scene2350::ExitWest::changeScene() { + Scene2350 *scene = (Scene2350 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + + Common::Point pt(-10, 129); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + +} + +void Scene2350::postInit(SceneObjectList *OwnerList) { + loadScene(2350); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(200); + _stripManager.addSpeaker(&_pharishaSpeaker); + _stripManager.addSpeaker(&_quinnSpeaker); + + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS._player._characterScene[2] = 2350; + + _exitUp.setDetails(Rect(25, 83, 93, 125), EXITCURSOR_NW, 2350); + _exitUp.setDest(Common::Point(80, 129)); + _exitWest.setDetails(Rect(0, 100, 14, 140), EXITCURSOR_W, 2350); + _exitWest.setDest(Common::Point(14, 129)); + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setup(2008, 3, 1); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setup(20, 3, 1); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor2.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor2.setup(20, 5, 1); + _actor2.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _actor2.setup(2008, 5, 1); + _actor2.setDetails(9001, 0, 5, 3, 1, NULL); + } + _actor2.setPosition(Common::Point(135, 128)); + } + _actor3.postInit(); + _actor4.postInit(); + + if (R2_INVENTORY.getObjectScene(20) == 2350) { + _actor3.hide(); + _actor4.hide(); + } else { + _actor3.setup(2350, 0, 1); + _actor3.setPosition(Common::Point(197, 101)); + _actor3.setDetails(2000, 12, -1, -1, 1, NULL); + _actor3.fixPriority(10); + _actor4.setup(2350, 1, 2); + _actor4.setPosition(Common::Point(199, 129)); + _actor4.setDetails(2000, 12, -1, -1, 1, NULL); + _actor4.fixPriority(10); + } + _item1.setDetails(Rect(0, 0, 320, 200), 2000, 9, -1, -1, 1, NULL); + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + if (R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] == 34) { + if (R2_GLOBALS._player._characterIndex == 1) + _sceneMode = 2351; + else + _sceneMode = 2353; + setAction(&_sequenceManager, this, _sceneMode, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 10; + R2_GLOBALS._player.setPosition(Common::Point(-20, 129)); + Common::Point pt(20, 129); + warning("TODO: Check sub_22D26"); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + + } + } else { + R2_GLOBALS._player.setPosition(Common::Point(100, 129)); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.enableControl(); + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2350; +} + +void Scene2350::remove() { + R2_GLOBALS._sound1.fadeOut(NULL); + SceneExt::remove(); +} + +void Scene2350::signal() { + switch (_sceneMode) { + case 11: + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 34; + g_globals->_sceneManager.changeScene(2000); + break; + case 12: + R2_GLOBALS._v56605[R2_GLOBALS._player._characterIndex] = 29; + g_globals->_sceneManager.changeScene(2000); + break; + case 20: + _sceneMode = 21; + _stripManager.start(712, this); + break; + case 21: + R2_GLOBALS._player.disableControl(); + R2_INVENTORY.setObjectScene(36, 1); + _sceneMode = 2354; + setAction(&_sequenceManager, this, 2354, &R2_GLOBALS._player, NULL); + break; + case 2354: + R2_INVENTORY.setObjectScene(20, 2350); + g_globals->_sceneManager.changeScene(2900); + break; + case 2355: + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + _stripManager.start(711, this); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +void Scene2350::process(Event &event) { + if ((R2_GLOBALS._player._canWalk) && (event.eventType != EVENT_BUTTON_DOWN) && + (R2_GLOBALS._events.getCursor() == CURSOR_CROSSHAIRS)){ + Common::Point pt(event.mousePos.x, 129); + PlayerMover *mover = new PlayerMover(); + R2_GLOBALS._player.addMover(mover, &pt); + event.handled = true; + } + Scene::process(event); +} + +/*-------------------------------------------------------------------------- + * Scene 2400 - Maze: Large empty room + * + *--------------------------------------------------------------------------*/ +void Scene2400::Exit1::changeScene() { + Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 10; + + Common::Point pt(-10, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + +} + +void Scene2400::Exit2::changeScene() { + Scene2400 *scene = (Scene2400 *)R2_GLOBALS._sceneManager._scene; + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + + Common::Point pt(330, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene2400::postInit(SceneObjectList *OwnerList) { + loadScene(2400); + SceneExt::postInit(); + _exit1.setDetails(Rect(0, 125, 14, 165), EXITCURSOR_W, 2000); + _exit1.setDest(Common::Point(14, 150)); + _exit2.setDetails(Rect(305, 125, 320, 165), EXITCURSOR_E, 2000); + _exit2.setDest(Common::Point(315, 150)); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._v56605[1] == 16) { + _sceneMode = 2400; + setAction(&_sequenceManager, this, 2400, &R2_GLOBALS._player, NULL); + } else { + _sceneMode = 2401; + setAction(&_sequenceManager, this, 2401, &R2_GLOBALS._player, NULL); + } +} + +void Scene2400::signal() { + switch (_sceneMode) { + case 10: + R2_GLOBALS._v56605[1] = 16; + g_globals->_sceneManager.changeScene(2000); + break; + case 11: + R2_GLOBALS._v56605[1] = 17; + g_globals->_sceneManager.changeScene(2000); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2425 - Maze: + * + *--------------------------------------------------------------------------*/ + +bool Scene2425::Item1::startAction(CursorType action, Event &event) { + Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene; + + if ((action == R2_37) && (!R2_GLOBALS.getFlag(84))) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2426; + scene->setAction(&scene->_sequenceManager, scene, 2426, &R2_GLOBALS._player, &scene->_actor1, NULL); + R2_GLOBALS.setFlag(84); + return true; + } else if (action == R2_37) { + R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS); + R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS); + return NamedHotspot::startAction(R2_STEPPING_DISKS, event); + } else + return NamedHotspot::startAction(action, event); +} + +bool Scene2425::Item2::startAction(CursorType action, Event &event) { + Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene; + + if ((action == R2_37) && (R2_GLOBALS.getFlag(84))) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2427; + scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_actor1, NULL); + R2_GLOBALS.clearFlag(84); + return true; + } else if (action == R2_37) { + R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS); + R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS); + return NamedHotspot::startAction(R2_STEPPING_DISKS, event); + } else + return NamedHotspot::startAction(action, event); +} + +bool Scene2425::Item3::startAction(CursorType action, Event &event) { + Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene; + + if (action != R2_37) + return NamedHotspot::startAction(action, event); + else { + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS.getFlag(84)) { + scene->_sceneMode = 20; + scene->setAction(&scene->_sequenceManager, scene, 2427, &R2_GLOBALS._player, &scene->_actor1, NULL); + R2_GLOBALS.clearFlag(84); + } else { + scene->_sceneMode = 2425; + scene->setAction(&scene->_sequenceManager, scene, 2425, &R2_GLOBALS._player, &scene->_actor1, NULL); + } + return true; + } +} + +bool Scene2425::Item4::startAction(CursorType action, Event &event) { + if (action != R2_37) + return NamedHotspot::startAction(action, event); + else { + R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS); + R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS); + return NamedHotspot::startAction(R2_STEPPING_DISKS, event); + } +} + +bool Scene2425::Actor1::startAction(CursorType action, Event &event) { + if (action == R2_STEPPING_DISKS) { + if (R2_GLOBALS._player._characterIndex == 2) { + R2_GLOBALS._events.setCursor(R2_37); + return true; + } else { + return SceneActor::startAction(action, event); + } + } else if (R2_GLOBALS._events.getCursor() == R2_37) + return false; + else + return SceneActor::startAction(action, event); +} + +bool Scene2425::Actor2::startAction(CursorType action, Event &event) { + if (action != R2_37) + return SceneActor::startAction(action, event); + else { + R2_GLOBALS._events.setCursor(R2_STEPPING_DISKS); + R2_GLOBALS._player.enableControl(R2_STEPPING_DISKS); + return SceneActor::startAction(R2_STEPPING_DISKS, event); + } +} + +void Scene2425::Exit1::changeScene() { + Scene2425 *scene = (Scene2425 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + + Common::Point pt(340, 200); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + + +void Scene2425::postInit(SceneObjectList *OwnerList) { + loadScene(2425); + SceneExt::postInit(); + if (R2_GLOBALS._sceneManager._previousScene == -1) { + R2_GLOBALS._player._characterIndex = R2_SEEKER; + R2_GLOBALS._sceneManager._previousScene = 2000; + } + + R2_GLOBALS._sound1.play(200); + _exit1.setDetails(Rect(270, 136, 319, 168), EXITCURSOR_SE, 2000); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setVisage(2008); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setVisage(20); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor2.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor2.setup(20, 5, 1); + _actor2.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _actor2.setup(2008, 5, 1); + _actor2.setDetails(9001, 0, 5, 3, 1, NULL); + } + _actor2.setPosition(Common::Point(250, 185)); + } + + _actor1.postInit(); + if (R2_GLOBALS._sceneManager._previousScene == 2455) + _actor1.setup(2426, 1, 1); + else + _actor1.setup(2426, 1, 2); + + _actor1.setPosition(Common::Point(290, 9)); + _actor1.fixPriority(20); + _actor1.setDetails(2455, 12, -1, -1, 1, NULL); + _item1.setDetails(Rect(225, 52, 248, 65), 2425, -1, -1, -1, 1, NULL); + _item2.setDetails(Rect(292, 81, 316, 94), 2425, -1, -1, -1, 1, NULL); + +// CHECKME: SceneActor using a SceneItem function?? +// _actor3.setDetails(11, 2425, 3, -1, 6); + _actor3._sceneRegionId = 11; + _actor3._resNum = 2425; + _actor3._lookLineNum = 3; + _actor3._talkLineNum = -1; + _actor3._useLineNum = 6; + g_globals->_sceneItems.push_back(&_actor3); + + _item3.setDetails(12, 2425, 7, -1, 9); + _item4.setDetails(Rect(0, 0, 320, 200), 2425, 0, -1, -1, 1, NULL); + + R2_GLOBALS._player.disableControl(); + switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) { + case 2000: { + _sceneMode = 10; + R2_GLOBALS._player.setPosition(Common::Point(340, 200)); + + Common::Point pt(280, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + break; + } + case 2425: + _sceneMode = 10; + R2_GLOBALS._player.setPosition(Common::Point(280, 150)); + _action->signal(); + break; + case 2455: + _sceneMode = 2428; + setAction(&_sequenceManager, this, 2428, &R2_GLOBALS._player, &_actor1, NULL); + break; + default: + R2_GLOBALS._player.setPosition(Common::Point(280, 150)); + R2_GLOBALS._player.setStrip(8); + R2_GLOBALS._player.enableControl(); + break; + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2425; +} + +void Scene2425::remove() { + R2_GLOBALS._sound1.fadeOut(NULL); + SceneExt::remove(); +} + +void Scene2425::signal() { + switch (_sceneMode) { + case 11: + g_globals->_sceneManager.changeScene(2000); + break; + case 20: + _sceneMode = 2425; + setAction(&_sequenceManager, this, 2425, &R2_GLOBALS._player, &_actor1, NULL); + break; + case 2425: + g_globals->_sceneManager.changeScene(2455); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2430 - Maze: Bedroom + * + *--------------------------------------------------------------------------*/ + +bool Scene2430::Actor1::startAction(CursorType action, Event &event) { + return SceneActor::startAction(action, event); +} + +bool Scene2430::Actor2::startAction(CursorType action, Event &event) { + Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene; + + if ((action != R2_STEPPING_DISKS) || (R2_GLOBALS._player._characterIndex != 2)) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2430; + scene->setAction(&scene->_sequenceManager, scene, 2430, &R2_GLOBALS._player, &scene->_actor2, NULL); + return true; +} + +bool Scene2430::Actor3::startAction(CursorType action, Event &event) { + Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene; + + if ((action != R2_STEPPING_DISKS) || (R2_GLOBALS._player._characterIndex != 2)) + return SceneActor::startAction(action, event); + + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2435; + scene->setAction(&scene->_sequenceManager, scene, 2435, &R2_GLOBALS._player, &scene->_actor3, NULL); + return true; +} + +void Scene2430::Exit1::changeScene() { + Scene2430 *scene = (Scene2430 *)R2_GLOBALS._sceneManager._scene; + + scene->_sceneMode = 0; + R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + Common::Point pt(108, 200); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene2430::postInit(SceneObjectList *OwnerList) { + loadScene(2430); + SceneExt::postInit(); + _exit1.setDetails(Rect(68, 155, 147, 168), EXITCURSOR_S, 2000); + _exit1.setDest(Common::Point(108, 160)); + + if (R2_INVENTORY.getObjectScene(37) == 2430) { + _actor2.postInit(); + _actor2.setup(2435, 1, 5); + _actor2.setPosition(Common::Point(205, 119)); + _actor2.fixPriority(152); + _actor2.setDetails(2430, 51, -1, 53, 1, NULL); + } + + if (R2_INVENTORY.getObjectScene(50) == 2435) { + _actor3.postInit(); + _actor3.setup(2435, 1, 1); + _actor3.setPosition(Common::Point(31, 65)); + _actor3.setDetails(2430, 48, -1, -1, 1, NULL); + } + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setVisage(2008); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setVisage(20); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + R2_GLOBALS._player.setPosition(Common::Point(100, 200)); + + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor1.setup(20, 5, 1); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _actor1.setup(2008, 5, 1); + _actor1.setDetails(9001, 0, 5, 3, 1, NULL); + } + _actor1.setPosition(Common::Point(189, 137)); + R2_GLOBALS._walkRegions.enableRegion(4); + } + + _item2.setDetails(Rect(11, 30, 37, 45), 2430, 3, -1, 5, 1, NULL); + _item3.setDetails(Rect(9, 58, 63, 92), 2430, 6, -1, -1, 1, NULL); + _item4.setDetails(Rect(20, 89, 127, 107), 2430, 9, -1, 11, 1, NULL); + _item5.setDetails(Rect(49, 7, 60, 27), 2430, 12, 13, 14, 1, NULL); + _item6.setDetails(Rect(69, 10, 95, 72), 2430, 15, -1, 14, 1, NULL); + _item10.setDetails(Rect(198, 4, 222, 146), 2430, 30, 31, 32, 1, NULL); + _item7.setDetails(Rect(155, 40, 304, 120), 2430, 21, -1, 23, 1, NULL); + _item8.setDetails(Rect(249, 3, 261, 39), 2430, 24, 25, -1, 1, NULL); + _item9.setDetails(Rect(279, 13, 305, 34), 2430, 33, -1, 18, 1, NULL); + // CHECKME: initialized for the 2nd time?? + _item2.setDetails(Rect(11, 30, 37, 45), 2430, 33, -1, 18, 1, NULL); + _item11.setDetails(Rect(116, 104, 148, 111), 2430, 39, -1, -1, 1, NULL); + _item12.setDetails(Rect(66, 77, 84, 83), 2430, 39, -1, -1, 1, NULL); + _item13.setDetails(Rect(117, 118, 201, 141), 2430, 9, -1, 11, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2430; + Common::Point pt(108, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.setPosition(Common::Point(105, 145)); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.enableControl(); + } +} + +void Scene2430::signal() { + switch (_sceneMode) { + case 11: + g_globals->_sceneManager.changeScene(2000); + break; + case 2430: + _actor2.remove(); + R2_INVENTORY.setObjectScene(R2_37, 2); + R2_GLOBALS._player.enableControl(); + break; + case 2435: + _actor3.remove(); + R2_INVENTORY.setObjectScene(R2_50, 2); + R2_GLOBALS._player.enableControl(); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2435 - Maze: Throne room + * + *--------------------------------------------------------------------------*/ +bool Scene2435::Actor1::startAction(CursorType action, Event &event) { + return SceneActor::startAction(action, event); +} + +bool Scene2435::Actor2::startAction(CursorType action, Event &event) { + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case R2_34: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(R2_2); + R2_GLOBALS.setFlag(82); + scene->_stripManager.start(603, scene); + return true; + case R2_35: + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._events.setCursor(R2_2); + R2_GLOBALS.setFlag(82); + scene->_stripManager.start(602, scene); + R2_INVENTORY.setObjectScene(R2_35, 2000); + return true; + case CURSOR_TALK: + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 20; + R2_GLOBALS._events.setCursor(R2_2); + if ((R2_GLOBALS._player._characterIndex == 1) || (R2_GLOBALS.getFlag(82))) { + scene->_stripManager.start(605, scene); + return true; + } else if (R2_INVENTORY.getObjectScene(R2_35) == 2) { + scene->_stripManager.start(601, scene); + return true; + } else { + R2_GLOBALS.setFlag(82); + scene->_stripManager.start(600, scene); + return true; + } + default: + return SceneActor::startAction(action, event); + } +} + +void Scene2435::Exit1::changeScene() { + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._events.setCursor(R2_NEGATOR_GUN); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + Common::Point pt(175, 200); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + +} + +void Scene2435::postInit(SceneObjectList *OwnerList) { + loadScene(2435); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(201); + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + _stripManager.addSpeaker(&_pharishaSpeaker); + _exit1.setDetails(Rect(142, 155, 207, 167), EXITCURSOR_S, 2000); + _exit1.setDest(Common::Point(175, 160)); + _actor2.postInit(); + _actor2.setup(2005, 3, 1); + _actor2.setPosition(Common::Point(219, 106)); + _actor2.setDetails(2001, 25, 26, -1, 1, NULL); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setVisage(2008); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setVisage(20); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + R2_GLOBALS._player.setPosition(Common::Point(715, 200)); + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor1.setup(20, 5, 1); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _actor1.setup(2008, 5, 1); + _actor1.setDetails(9001, 0, 5, 3, 1, NULL); + } + _actor1.setPosition(Common::Point(107, 145)); + R2_GLOBALS._walkRegions.enableRegion(2); + } + + _item2.setDetails(Rect(52, 44, 96, 82), 2430, 3, -1, 5, 1, NULL); + _item3.setDetails(Rect(117, 36, 161, 74), 2430, 3, -1, 5, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL); + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + _sceneMode = 10; + Common::Point pt(175, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2450) { + _sceneMode = 30; + Common::Point pt(175, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.setPosition(Common::Point(210, 150)); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.enableControl(); + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2435; + R2_GLOBALS._v56605[1 + R2_GLOBALS._player._characterIndex] = 12; +} + +void Scene2435::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene2435::signal() { + switch (_sceneMode) { + case 11: + g_globals->_sceneManager.changeScene(2000); + break; + case 20: + R2_GLOBALS._player.enableControl(R2_6); + break; + case 30: + R2_GLOBALS._player._characterScene[1] = 2435; + R2_GLOBALS._player._characterScene[2] = 2435; + R2_GLOBALS._player._oldCharacterScene[1] = 2435; + R2_GLOBALS._player._oldCharacterScene[2] = 2435; + R2_GLOBALS._v56605[1] = 12; + R2_GLOBALS._v56605[2] = 12; + R2_GLOBALS.setFlag(81); + _sceneMode = 2436; + R2_GLOBALS._player.setStrip(7); + _actor1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) + _actor1.setVisage(20); + else + _actor1.setVisage(2008); + setAction(&_sequenceManager, this, 2436, &_actor1, NULL); + break; + case 2436: + R2_GLOBALS._walkRegions.enableRegion(2); + _sceneMode = 20; + R2_GLOBALS._events.setCursor(R2_2); + _stripManager.start(709, this); + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2440 - Maze: Another bedroom + * + *--------------------------------------------------------------------------*/ + +bool Scene2440::Actor1::startAction(CursorType action, Event &event) { + return SceneActor::startAction(action, event); +} + +bool Scene2440::Actor2::startAction(CursorType action, Event &event) { + Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == 2)){ + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2440; + scene->setAction(&scene->_sequenceManager, scene, 2440, &R2_GLOBALS._player, &scene->_actor2, NULL); + return true; + } + + return SceneActor::startAction(action, event); +} + +void Scene2440::Exit1::changeScene() { + Scene2440 *scene = (Scene2440 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + Common::Point pt(210, 200); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene2440::postInit(SceneObjectList *OwnerList) { + loadScene(2440); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(200); + // Fix exit cursor, the original was using NW + _exit1.setDetails(Rect(172, 155, 250, 167), EXITCURSOR_SE, 2000); + _exit1.setDest(Common::Point(210, 160)); + if (R2_INVENTORY.getObjectScene(49) == 2440) { + _actor2.postInit(); + _actor2.setup(2435, 1, 1); + _actor2.setPosition(Common::Point(94, 80)); + _actor2.fixPriority(106); + _actor2.setDetails(2430, 48, -1, -1, 1, NULL); + } + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.enableControl(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setVisage(2008); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setVisage(20); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + R2_GLOBALS._player.setPosition(Common::Point(210, 200)); + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor1.setup(20, 5, 1); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + } else { + _actor1.setup(2008, 5, 1); + _actor1.setDetails(9002, 0, 5, 3, 1, NULL); + } + _actor1.setPosition(Common::Point(38, 119)); + } + + _item2.setDetails(Rect(125, 25, 142, 73), 2430, 15, -1, 14, 1, NULL); + _item3.setDetails(Rect(124, 78, 237, 120), 2430, 36, -1, 38, 1, NULL); + _item4.setDetails(Rect(250, 3, 265, 133), 2430, 30, 31, 32, 1, NULL); + _item5.setDetails(Rect(91, 117, 203, 140), 2430, 9, -1, 11, 1, NULL); + _item6.setDetails(Rect(48, 78, 103, 112), 2430, 6, -1, -1, 1, NULL); + _item7.setDetails(Rect(48, 31, 73, 52), 2430, 33, -1, 18, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL); + + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2440; + Common::Point pt(210, 150); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else { + R2_GLOBALS._player.setPosition(Common::Point(210, 150)); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.enableControl(); + } +} + +void Scene2440::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene2440::signal() { + switch (_sceneMode) { + case 11: + g_globals->_sceneManager.changeScene(2000); + break; + case 2440: + _actor2.remove(); + R2_INVENTORY.setObjectScene(49, 2); + // No break on purpose + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2445 - Maze: + * + *--------------------------------------------------------------------------*/ +void Scene2445::postInit(SceneObjectList *OwnerList) { + loadScene(2445); + SceneExt::postInit(); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.setVisage(10); + R2_GLOBALS._player.setPosition(Common::Point(160, 140)); + R2_GLOBALS._player.disableControl(); +} + +void Scene2445::signal() { + R2_GLOBALS._player.enableControl(); +} + +/*-------------------------------------------------------------------------- + * Scene 2450 - Maze: Another bedroom + * + *--------------------------------------------------------------------------*/ + +bool Scene2450::Actor2::startAction(CursorType action, Event &event) { + Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && (R2_GLOBALS._player._characterIndex == 1)) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2452; + scene->setAction(&scene->_sequenceManager, scene, 2452, &R2_GLOBALS._player, &scene->_actor2, NULL); + return true; + } + return SceneActor::startAction(action, event); +} + +bool Scene2450::Actor3::startAction(CursorType action, Event &event) { + Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + R2_GLOBALS._player.disableControl(); + if (R2_GLOBALS._v565AE < 3) { + ++R2_GLOBALS._v565AE; + scene->_sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + if (R2_GLOBALS._player._characterIndex == 1) + scene->_stripManager.start(699 + (R2_GLOBALS._v565AE * 2), scene); + else + scene->_stripManager.start(700 + (R2_GLOBALS._v565AE * 2), scene); + } + return true;} else { + return SceneActor::startAction(action, event); + } +} + +void Scene2450::Exit1::changeScene() { + Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene; + + if ((R2_GLOBALS._player._characterIndex == 2) || (R2_GLOBALS.getFlag(61))) { + _enabled = false; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 10; + Common::Point pt(-10, 180); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); + } else { + _moving = false; + SceneItem::display(2450, 3, 0, 280, 1, 160, 9, 1, 2, 20, 7, 7, -999); + Common::Point pt(60, 140); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, NULL); + } +} + +void Scene2450::postInit(SceneObjectList *OwnerList) { + loadScene(2450); + SceneExt::postInit(); + R2_GLOBALS._sound1.play(200); + if (R2_GLOBALS._sceneManager._previousScene == -1) { + R2_GLOBALS._sceneManager._previousScene = 1900; + R2_GLOBALS._player._oldCharacterScene[1] = 1900; + R2_GLOBALS._player._oldCharacterScene[2] = 1900; + } + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + _stripManager.addSpeaker(&_caretakerSpeaker); + + if (R2_GLOBALS.getFlag(72)) { + _exit1.setDetails(Rect(0, 143, 47, 168), EXITCURSOR_SW, 2000); + _exit1.setDest(Common::Point(10, 160)); + } + + if (!R2_GLOBALS.getFlag(61)) { + _actor2.postInit(); + _actor2.setVisage(2009); + _actor2.setPosition(Common::Point(190, 119)); + _actor2.fixPriority(50); + _actor2.setDetails(2450, 0, -1, -1, 1, NULL); + } + + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.disableControl(); + switch (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex]) { + case 1900: + R2_GLOBALS._v565AE = 0; + R2_GLOBALS._player._characterScene[1] = 2450; + R2_GLOBALS._player._characterScene[2] = 2450; + R2_GLOBALS._player._oldCharacterScene[1] = 2450; + R2_GLOBALS._player._oldCharacterScene[2] = 2450; + R2_GLOBALS._player.setup(2450, 1, 1); + R2_GLOBALS._player.setPosition(Common::Point(126, 101)); + setAction(&_sequenceManager, this, 2450, &R2_GLOBALS._player, NULL); + break; + case 2000: + _sceneMode = 2451; + if (R2_GLOBALS._player._characterIndex == 1) { + if (R2_GLOBALS._player._characterScene[2] == 2450) { + _actor1.postInit(); + _actor1.setup(20, 6, 1); + _actor1.setPosition(Common::Point(240, 120)); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + } + setAction(&_sequenceManager, this, 2451, &R2_GLOBALS._player, NULL); + } else { + R2_GLOBALS._player._oldCharacterScene[2] = 2450; + R2_GLOBALS._player._characterScene[2] = 2450; + if (R2_GLOBALS._player._characterScene[1] == 2450) { + _actor1.postInit(); + if (R2_GLOBALS.getFlag(61)) + _actor1.setup(2008, 6, 1); + else + _actor1.setup(10, 6, 1); + _actor1.setDetails(9001, 0, 5, 3, 1, NULL); + _actor1.setPosition(Common::Point(106, 111)); + } + setAction(&_sequenceManager, this, 2456, &R2_GLOBALS._player, NULL); + } + break; + case 2450: + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.postInit(); + if (R2_GLOBALS.getFlag(61)) { + R2_GLOBALS._player.setup(2008, 6, 1); + } else { + R2_GLOBALS._player.setup(10, 6, 1); + } + R2_GLOBALS._player.setPosition(Common::Point(106, 111)); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS.getFlag(72)) { + if (R2_GLOBALS._player._characterScene[2] == 2450) { + _actor1.postInit(); + _actor1.setup(20, 6, 1); + _actor1.setPosition(Common::Point(240, 120)); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + } + } else { + _actor1.postInit(); + _actor1.setup(20, 8, 1); + _actor1.setPosition(Common::Point(93, 158)); + _actor1.setDetails(9002, 0, 4, 3, 1, NULL); + + _actor3.postInit(); + _actor3.setup(2001, 7, 1); + _actor3.setPosition(Common::Point(34, 153)); + _actor3.setDetails(2001, 40, -1, -1, 1, NULL); + + _exit1._enabled = false; + } + } else { + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.setup(20, 8, 1); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + R2_GLOBALS._player.setPosition(Common::Point(93, 158)); + if (R2_GLOBALS.getFlag(72)) { + if (R2_GLOBALS._player._characterScene[1] == 2450) { + _actor1.postInit(); + if (R2_GLOBALS.getFlag(61)) { + _actor1.setup(2008, 6, 1); + } else { + _actor1.setup(10, 6, 1); + } + _actor1.setPosition(Common::Point(106, 111)); + _actor1.setDetails(9001, 0, 5, 3, 1, NULL); + } + } else { + _actor1.postInit(); + if (R2_GLOBALS.getFlag(61)) { + _actor1.setup(2008, 6, 1); + } else { + _actor1.setup(10, 6, 1); + } + _actor1.setPosition(Common::Point(106, 111)); + _actor1.setDetails(9001, 0, 5, 3, 1, NULL); + + _actor3.postInit(); + _actor3.setup(2001, 7, 1); + _actor3.setPosition(Common::Point(34, 153)); + _actor3.setDetails(2001, 40, -1, -1, 1, NULL); + + _exit1._enabled = false; + } + } + R2_GLOBALS._player.enableControl(); + if (!R2_GLOBALS.getFlag(72)) { + R2_GLOBALS._player._canWalk = false; + } + break; + default: + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + if (R2_GLOBALS._player._characterIndex == 1) { + if (R2_GLOBALS.getFlag(61)) { + R2_GLOBALS._player.setup(2008, 3, 1); + } else { + R2_GLOBALS._player.setup(10, 3, 1); + } + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } else { + R2_GLOBALS._player.setVisage(20); + R2_GLOBALS._player._moveDiff = Common::Point(5, 3); + } + R2_GLOBALS._player.setPosition(Common::Point(100, 130)); + R2_GLOBALS._player.enableControl(); + break; + } + _item2.setDetails(Rect(174, 4, 199, 123), 2430, 30, 31, 32, 1, NULL); + _item3.setDetails(Rect(67, 73, 207, 121), 2430, 36, -1, 38, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL); +} + +void Scene2450::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene2450::signal() { + switch (_sceneMode) { + case 10: + g_globals->_sceneManager.changeScene(2000); + break; + case 20: + if (R2_GLOBALS._v565AE == 3) { + R2_GLOBALS._player.disableControl(); + R2_GLOBALS._v565AE = 4; + _sceneMode = 2454; + setAction(&_sequenceManager, this, 2454, &_actor3, NULL); + } else { + R2_GLOBALS._player.enableControl(CURSOR_TALK); + if (R2_GLOBALS._v565AE < 4) + R2_GLOBALS._player._canWalk = false; + } + break; + case 30: + R2_GLOBALS._player.disableControl(); + _sceneMode = 2455; + setAction(&_sequenceManager, this, 2455, &_actor1, NULL); + break; + case 31: + R2_GLOBALS.setFlag(61); + g_globals->_sceneManager.changeScene(2435); + break; + case 2451: + R2_GLOBALS._player.enableControl(); + break; + case 2452: + R2_GLOBALS.setFlag(61); + _actor2.remove(); + R2_GLOBALS._player.enableControl(); + if (!R2_GLOBALS.getFlag(72)) { + R2_GLOBALS._player.setStrip(6); + R2_GLOBALS._player._canWalk = false; + } + break; + case 2453: + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(700, this); + break; + case 2454: + _exit1._enabled = true; + R2_GLOBALS.setFlag(72); + _actor3.remove(); + if (R2_GLOBALS.getFlag(61)) { + g_globals->_sceneManager.changeScene(2435); + } else { + _sceneMode = 31; + if (R2_GLOBALS._player._characterIndex == 1) { + setAction(&_sequenceManager, this, 2452, &R2_GLOBALS._player, NULL); + } else { + setAction(&_sequenceManager, this, 2452, &_actor1, &_actor2, NULL); + } + } + break; + case 2455: + R2_GLOBALS._player._oldCharacterScene[2] = 2450; + R2_GLOBALS._player._characterScene[2] = 2000; + R2_GLOBALS._v56605[2] = 3; + _actor1.remove(); + R2_GLOBALS._player.enableControl(CURSOR_ARROW); + break; + default: + _actor1.postInit(); + _actor1.setDetails(9002, 0, 4, 3, 2, NULL); + _actor3.postInit(); + _actor3.setDetails(2001, 40, -1, -1, 2, NULL); + _sceneMode = 2453; + setAction(&_sequenceManager, this, 2453, &_actor3, &_actor1, NULL); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2455 - Maze: Inside crevasse + * + *--------------------------------------------------------------------------*/ + +bool Scene2455::Actor1::startAction(CursorType action, Event &event) { + Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene; + + if (action == R2_29) { + if ((R2_INVENTORY.getObjectScene(49) == 2455) || (R2_INVENTORY.getObjectScene(50) == 2455)) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2458; + scene->_actor2._lookLineNum = 9; + scene->_actor1.remove(); + scene->_actor3.postInit(); + scene->_actor3.setDetails(2455, 16, 1, -1, 2, NULL); + scene->setAction(&scene->_sequenceManager, scene, 2458, &R2_GLOBALS._player, &scene->_actor2, &scene->_actor3, NULL); + return true; + } + } + + return SceneActor::startAction(action, event); +} + +bool Scene2455::Actor2::startAction(CursorType action, Event &event) { + Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene; + + switch (action) { + case R2_49: + if (R2_INVENTORY.getObjectScene(50) != 2455) { + R2_GLOBALS._player.disableControl(); + scene->_actor1.postInit(); + scene->_actor1.setup(2456, 3, 3); + scene->_actor1.setPosition(Common::Point(162, 165)); + scene->_actor1.setDetails(2455, 15, 1, -1, 2, NULL); + scene->_sceneMode = 11; + scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_actor2, NULL); + return true; + } + break; + case R2_50: + if (R2_INVENTORY.getObjectScene(49) != 2455) { + R2_GLOBALS._player.disableControl(); + scene->_actor1.postInit(); + scene->_actor1.setup(2456, 3, 3); + scene->_actor1.setPosition(Common::Point(162, 165)); + scene->_actor1.setDetails(2455, 15, 1, -1, 2, NULL); + scene->_sceneMode = 12; + scene->setAction(&scene->_sequenceManager, scene, 2457, &R2_GLOBALS._player, &scene->_actor2, NULL); + return true; + } + break; + default: + break; + } + + return SceneActor::startAction(action, event); +} + +bool Scene2455::Actor3::startAction(CursorType action, Event &event) { + Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2459; + scene->setAction(&scene->_sequenceManager, scene, 2459, &R2_GLOBALS._player, &scene->_actor3, NULL); + return true; + } + + return SceneActor::startAction(action, event); +} + +void Scene2455::Exit1::changeScene() { + Scene2455 *scene = (Scene2455 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 2461; + scene->setAction(&scene->_sequenceManager, scene, 2461, &R2_GLOBALS._player, NULL); +} + +void Scene2455::postInit(SceneObjectList *OwnerList) { + loadScene(2455); + SceneExt::postInit(); + + if (R2_GLOBALS._sceneManager._previousScene == -1) { + R2_INVENTORY.setObjectScene(29, 2); + R2_INVENTORY.setObjectScene(50, 2); + } + + R2_GLOBALS._sound1.play(200); + _exit1.setDetails(Rect(0, 0, 320, 15), EXITCURSOR_N, 2425); + + if (R2_INVENTORY.getObjectScene(29) == 2455) { + if ((R2_INVENTORY.getObjectScene(50) == 2455) || (R2_INVENTORY.getObjectScene(49) == 2455)) { + _actor1.postInit(); + _actor1.setup(2456, 3, 3); + _actor1.setPosition(Common::Point(162, 165)); + _actor1.setDetails(2455, 15, 1, -1, 1, NULL); + } + } else { + _actor3.postInit(); + _actor3.setup(2456, 3, 1); + _actor3.setPosition(Common::Point(176, 165)); + _actor3.setDetails(2455, 16, 1, -1, 1, NULL); + } + + _actor2.postInit(); + if (R2_INVENTORY.getObjectScene(29) == 2455) { + _actor2.setup(2456, 3, 2); + _actor2.setDetails(2455, 9, 1, -1, 1, NULL); + } else { + if ((R2_INVENTORY.getObjectScene(50) != 2455) && (R2_INVENTORY.getObjectScene(49) != 2455)) + _actor2.setup(2455, 1, 1); + else + _actor2.setup(2456, 1, 1); + _actor2.setDetails(2455, 3, 1, -1, 1, NULL); + } + _actor2.setPosition(Common::Point(162, 165)); + _actor2.fixPriority(20); + if (R2_INVENTORY.getObjectScene(29) != 2455) + _actor2.animate(ANIM_MODE_2, NULL); + + R2_GLOBALS._player.postInit(); + _item1.setDetails(Rect(0, 0, 320, 200), 2455, 0, 1, -1, 1, NULL); + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2425) { + _sceneMode = 2460; + setAction(&_sequenceManager, this, 2460, &R2_GLOBALS._player, NULL); + } else { + R2_GLOBALS._player.setup(2455, 2, 9); + R2_GLOBALS._player.setPosition(Common::Point(118, 165)); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2455; +} + +void Scene2455::remove() { + R2_GLOBALS._sound1.fadeOut2(NULL); + SceneExt::remove(); +} + +void Scene2455::signal() { + switch (_sceneMode) { + case 10: + // No break on purpose + case 2461: + g_globals->_sceneManager.changeScene(2425); + break; + case 11: + R2_INVENTORY.setObjectScene(49, 2455); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + break; + case 12: + R2_INVENTORY.setObjectScene(50, 2455); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + break; + case 2458: + R2_INVENTORY.setObjectScene(29, 2455); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + break; + case 2459: + _actor3.remove(); + R2_INVENTORY.setObjectScene(31, 2); + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + break; + default: + R2_GLOBALS._player.enableControl(CURSOR_USE); + R2_GLOBALS._player._canWalk = false; + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 2500 - Maze: Large Cave + * + *--------------------------------------------------------------------------*/ + +void Scene2500::Exit1::changeScene() { + Scene2500 *scene = (Scene2500 *)R2_GLOBALS._sceneManager._scene; + + _enabled = false; + R2_GLOBALS._events.setCursor(CURSOR_ARROW); + R2_GLOBALS._player.disableControl(); + scene->_sceneMode = 11; + + Common::Point pt(20, 105); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, scene); +} + +void Scene2500::postInit(SceneObjectList *OwnerList) { + loadScene(2500); + SceneExt::postInit(); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100) + R2_GLOBALS._v58CE2 = 0; + + _stripManager.addSpeaker(&_quinnSpeaker); + _stripManager.addSpeaker(&_seekerSpeaker); + _stripManager.addSpeaker(&_mirandaSpeaker); + _stripManager.addSpeaker(&_webbsterSpeaker); + + if (R2_GLOBALS._sceneManager._previousScene == -1) + R2_GLOBALS._sceneManager._previousScene = 2000; + + _exit1.setDetails(Rect(30, 50, 85, 105), EXITCURSOR_W, 2000); + _exit1.setDest(Common::Point(84, 104)); + R2_GLOBALS._player.postInit(); + R2_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (R2_GLOBALS._player._characterIndex == 1) { + R2_GLOBALS._player.setVisage(11); + R2_GLOBALS._player._moveDiff = Common::Point(2, 1); + } else { + R2_GLOBALS._player.setVisage(21); + R2_GLOBALS._player._moveDiff = Common::Point(3, 2); + } + + if (R2_GLOBALS._player._characterScene[1] == R2_GLOBALS._player._characterScene[2]) { + _actor1.postInit(); + if (R2_GLOBALS._player._characterIndex == 1) { + _actor1.setup(21, 3, 1); + _actor1.setDetails(9002, 1, -1, -1, 1, NULL); + } else { + _actor1.setup(2008, 3, 1); + _actor1.changeZoom(50); + _actor1.setDetails(9001, 0, -1, -1, 1, NULL); + } + _actor1.setPosition(Common::Point(141, 94)); + } + + _item1.setDetails(Rect(0, 0, 320, 200), 2430, 0, -1, -1, 1, NULL); + R2_GLOBALS._player.disableControl(); + + if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 2000) { + _sceneMode = 10; + R2_GLOBALS._player.setPosition(Common::Point(20, 105)); + Common::Point pt(95, 105); + NpcMover *mover = new NpcMover(); + R2_GLOBALS._player.addMover(mover, &pt, this); + } else if (R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] == 3100) { + _sceneMode = 2500; + _actor2.postInit(); + _actor3.postInit(); + setAction(&_sequenceManager, this, 2500, &R2_GLOBALS._player, &_actor2, &_actor3, NULL); + } else { + R2_GLOBALS._player.setPosition(Common::Point(160, 150)); + R2_GLOBALS._player.setStrip(3); + R2_GLOBALS._player.enableControl(); + } + R2_GLOBALS._player._oldCharacterScene[R2_GLOBALS._player._characterIndex] = 2500; +} + +void Scene2500::signal() { + switch (_sceneMode) { + case 11: + g_globals->_sceneManager.changeScene(2000); + break; + case 20: + R2_GLOBALS._player.disableControl(); + _sceneMode = 2501; + setAction(&_sequenceManager, this, 2501, &R2_GLOBALS._player, &_actor2, &_actor3, NULL); + break; + case 2500: + _sceneMode = 20; + R2_GLOBALS._events.setCursor(CURSOR_CROSSHAIRS); + _stripManager.start(900, this); + break; + case 2501: + g_globals->_sceneManager.changeScene(1000); + break; + default: + R2_GLOBALS._player.enableControl(); + break; + } +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_scenes2.h b/engines/tsage/ringworld2/ringworld2_scenes2.h new file mode 100644 index 0000000000..82898a45dd --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_scenes2.h @@ -0,0 +1,389 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_SCENES2_H +#define TSAGE_RINGWORLD2_SCENES2_H + +#include "common/scummsys.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" +#include "tsage/ringworld2/ringworld2_logic.h" +#include "tsage/ringworld2/ringworld2_speakers.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class Scene2000 : public SceneExt { + class Action1 : public ActionExt { + public: + virtual void signal(); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; + class Exit2 : public SceneExit { + public: + virtual void changeScene(); + }; + class Exit3 : public SceneExit { + public: + virtual void changeScene(); + }; + class Exit4 : public SceneExit { + public: + virtual void changeScene(); + }; + class Exit5 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + bool _exitingFlag; + int _mazePlayerMode; + + NamedHotspot _item1; + SceneActor _object1; + SceneActor _objList1[11]; + Exit1 _exit1; + Exit2 _exit2; + Exit3 _exit3; + Exit4 _exit4; + Exit5 _exit5; + Action1 _action1, _action2, _action3, _action4, _action5; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void synchronize(Serializer &s); + + void initExits(); + void initPlayer(); +}; + +class Scene2350 : public SceneExt { + class Actor2 : public SceneActor { + virtual bool startAction(CursorType action, Event &event); + }; + class Actor3 : public SceneActor { + virtual bool startAction(CursorType action, Event &event); + }; + + class ExitUp : public SceneExit { + virtual void changeScene(); + }; + class ExitWest : public SceneExit { + virtual void changeScene(); + }; +public: + + SpeakerQuinn2350 _quinnSpeaker; + SpeakerPharisha2350 _pharishaSpeaker; + NamedHotspot _item1; + SceneActor _actor1; + Actor2 _actor2; + Actor3 _actor3; + Actor3 _actor4; + ExitUp _exitUp; + ExitWest _exitWest; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene2400 : public SceneExt { + class Exit1 : public SceneExit { + virtual void changeScene(); + }; + class Exit2 : public SceneExit { + virtual void changeScene(); + }; +public: + Exit1 _exit1; + Exit2 _exit2; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene2425 : public SceneExt { + class Item1 : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2 : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3 : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item4 : public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + class Actor1 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + Item1 _item1; + Item2 _item2; + Item3 _item3; + Item4 _item4; + Actor1 _actor1; + Actor2 _actor2; + Actor2 _actor3; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene2430 : public SceneExt { + class Actor1 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor3 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + NamedHotspot _item4; + NamedHotspot _item5; + NamedHotspot _item6; + NamedHotspot _item7; + NamedHotspot _item8; + NamedHotspot _item9; + NamedHotspot _item10; + NamedHotspot _item11; + NamedHotspot _item12; + NamedHotspot _item13; + Actor1 _actor1; + Actor2 _actor2; + Actor3 _actor3; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene2435 : public SceneExt { + class Actor1 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + SpeakerQuinn2435 _quinnSpeaker; + SpeakerSeeker2435 _seekerSpeaker; + SpeakerPharisha2435 _pharishaSpeaker; + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + Actor1 _actor1; + Actor2 _actor2; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene2440 : public SceneExt { + class Actor1 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + NamedHotspot _item4; + NamedHotspot _item5; + NamedHotspot _item6; + NamedHotspot _item7; + Actor1 _actor1; + Actor2 _actor2; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene2445 : public SceneExt { +public: + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene2450 : public SceneExt { + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor3 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + SpeakerQuinn2450 _quinnSpeaker; + SpeakerSeeker2450 _seekerSpeaker; + SpeakerCaretaker2450 _caretakerSpeaker; + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + SceneActor _actor1; + Actor2 _actor2; + Actor3 _actor3; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene2455 : public SceneExt { + class Actor1 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor2 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + class Actor3 : public SceneActor { + public: + bool startAction(CursorType action, Event &event); + }; + + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + NamedHotspot _item1; + Actor1 _actor1; + Actor2 _actor2; + Actor3 _actor3; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene2500 : public SceneExt { + class Exit1 : public SceneExit { + public: + virtual void changeScene(); + }; +public: + SpeakerQuinn2500 _quinnSpeaker; + SpeakerSeeker2500 _seekerSpeaker; + SpeakerMiranda2500 _mirandaSpeaker; + SpeakerWebbster2500 _webbsterSpeaker; + NamedHotspot _item1; + SceneActor _actor1; + SceneActor _actor2; + SceneActor _actor3; + Exit1 _exit1; + SequenceManager _sequenceManager; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/ringworld2/ringworld2_speakers.cpp b/engines/tsage/ringworld2/ringworld2_speakers.cpp new file mode 100644 index 0000000000..8c8bd7171a --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_speakers.cpp @@ -0,0 +1,738 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "tsage/ringworld2/ringworld2_speakers.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/graphics.h" +#include "tsage/staticres.h" +#include "tsage/ringworld2/ringworld2_scenes0.h" +#include "tsage/ringworld2/ringworld2_scenes2.h" + +namespace TsAGE { + +namespace Ringworld2 { + +VisualSpeaker::VisualSpeaker(): Speaker() { + _delayAmount = 0; + _frameNumber = R2_GLOBALS._events.getFrameNumber(); + _color1 = 8; + _color2 = 0; + _displayMode = 0; + _fieldF6 = 0; +} + +void VisualSpeaker::remove() { + if (_object2) { + if (_fieldF8) { + _fieldF8 = 0; + _object1.setStrip(_object1._strip - 1); + _object1.setFrame(_object1.getFrameCount()); + _object1.animate(ANIM_MODE_6, (_fieldF6 == 0xff) ? this : NULL); + } else { + _object1.animate(ANIM_MODE_6, (_fieldF6 == 0xff) ? this : NULL); + } + } + + Speaker::remove(); +} + +void VisualSpeaker::synchronize(Serializer &s) { + Speaker::synchronize(s); + + SYNC_POINTER(_object2); + s.syncAsSint16LE(_fieldF6); + s.syncAsSint16LE(_fieldF8); + s.syncAsSint16LE(_displayMode); + s.syncAsSint16LE(_soundId); + s.syncAsSint16LE(_delayAmount); + s.syncAsByte(_removeObject); + s.syncAsSint32LE(_frameNumber); + s.syncAsSint16LE(_numFrames); +} + +void VisualSpeaker::setText(const Common::String &msg) { + _sceneText.remove(); + + // Position the text depending on the specified display mode + switch (_displayMode) { + case 2: + _textPos = Common::Point(60, 20); + break; + case 3: + _textPos = Common::Point(110, 20); + break; + case 4: + _textPos = Common::Point(10, 100); + break; + case 5: + _textPos = Common::Point(60, 100); + break; + case 6: + _textPos = Common::Point(110, 100); + break; + case 7: + _textPos = Common::Point(170, 20); + break; + case 8: + _textPos = Common::Point(170, 100); + break; + case 9: + _textPos = Common::Point(330, 20); + break; + default: + _textPos = Common::Point(10, 20); + break; + } + + // Check if the message starts with a '!'. If so, it indicates a speech resource Id to be played, + // in which case extract the resource number from the message. + _soundId = 0; + Common::String s = msg; + if (s.hasPrefix("!")) { + s.deleteChar(0); + _soundId = atoi(s.c_str()); + + while (!s.empty() && (*s.c_str() >= '0' && *s.c_str() <= '9')) + s.deleteChar(0); + } + + // Set up the text details + _sceneText._color1 = _color1; + _sceneText._color2 = _color2; + _sceneText._color3 = _color3; + _sceneText._width = _textWidth; + _sceneText._fontNumber = _fontNumber; + _sceneText._textMode = _textMode; + _sceneText.setup(s); + + //_sceneText.clone(); + + _sceneText.setPosition(_textPos); + _sceneText.setPriority(0x100); + + // If subtitles are turned off, don't show the text + if (!(R2_GLOBALS._speechSubtitles & SPEECH_TEXT)) { + _sceneText.hide(); + } + + // Figure out the text delay if subtitles are turned on, or there's no speech resource specified + if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId) { + const char *msgP = s.c_str(); + int numWords = 0; + while (*msgP != '\0') { + if (*msgP++ == ' ') + ++numWords; + } + + if (!numWords && !s.empty()) + ++numWords; + + _numFrames = numWords * 30 + 120; + setFrame(_numFrames); + } else { + _numFrames = 1; + } + + // If the text is empty, no delay is needed + if (s.empty()) + _numFrames = 0; + + + if (_fieldF6) { + if ((R2_GLOBALS._speechSubtitles & SPEECH_TEXT) || !_soundId) + _sceneText.hide(); + } else { + if ((R2_GLOBALS._speechSubtitles & SPEECH_VOICE) && _soundId) { + if (!R2_GLOBALS._playStream.play(_soundId, NULL)) + _sceneText.show(); + } + } +} + +void VisualSpeaker::proc16() { + R2_GLOBALS._playStream.stop(); + _fieldF6 = 0; + _object1.remove(); + + assert(_object2); + _object2->show(); + _object2 = NULL; + _fieldF8 = 0; +} + +void VisualSpeaker::setFrame(int numFrames) { + _delayAmount = numFrames; + _frameNumber = R2_GLOBALS._events.getFrameNumber(); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerMiranda300::SpeakerMiranda300(): VisualSpeaker() { + _speakerName = "MIRANDA"; + _color1 = 154; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerMiranda300::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 3) { + _object2 = &R2_GLOBALS._player; + } else { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_miranda; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + + if (_object2->_mover) + _object2->addMover(NULL); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else if (v == 100) { + _numFrames = 0; + ((SceneItem *)_action)->_sceneRegionId = 0; + + _object1.setStrip(_object1._strip - 1); + _object1.setFrame(_object1.getFrameCount()); + _object1.animate(ANIM_MODE_6, this); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + + if (v == 4) { + _object1.setup(304, 5, 1); + } else { + _object1.setup(305, v * 2 - 1, 1); + } + _object1.animate(ANIM_MODE_5, this); + } +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSeeker300::SpeakerSeeker300(): VisualSpeaker() { + _speakerName = "SEEKER"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerSeeker300::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 3) { + _object2 = &R2_GLOBALS._player; + } else { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_seeker; + } + + _object2->hide(); + _object1.postInit(); + _object1.fixPriority(140); + _object1.setPosition(_object2->_position); + + if (_object2->_mover) + _object2->addMover(NULL); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else if (v == 100) { + _numFrames = 0; + ((SceneItem *)_action)->_sceneRegionId = 0; + + _object1.setStrip(_object1._strip - 1); + _object1.setFrame(_object1.getFrameCount()); + _object1.animate(ANIM_MODE_6, this); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object1.setup(306, v * 2 - 1, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSeekerL::SpeakerSeekerL(): VisualSpeaker() { + _speakerName = "SEEKERL"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; + _fontNumber = 10; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinnL::SpeakerQuinnL(): VisualSpeaker() { + _speakerName = "QUINNL"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; + _fontNumber = 10; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinn300::SpeakerQuinn300(): VisualSpeaker() { + _speakerName = "QUINN"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerQuinn300::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 3) { + _object2 = &R2_GLOBALS._player; + } else { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_quinn; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + + if (_object2->_mover) + _object2->addMover(NULL); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else if (v == 100) { + _numFrames = 0; + ((SceneItem *)_action)->_sceneRegionId = 0; + + _object1.setStrip(_object1._strip - 1); + _object1.setFrame(_object1.getFrameCount()); + _object1.animate(ANIM_MODE_6, this); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + + switch (_object2->_visage) { + case 10: + _object1.setup((v - 1) / 4 + 4010, ((v - ((v - 1) / 4 * 4) - 1) % 8) * 2 + 1, 1); + break; + case 302: + _object1.setup(308, (v - 1) % 8 + 1, 1); + break; + case 308: + _object1.setup(308, 5, 1); + break; + } + + _object1.animate(ANIM_MODE_5, this); + } +} + +/*--------------------------------------------------------------------------*/ + +SpeakerTeal300::SpeakerTeal300(): VisualSpeaker() { + _speakerName = "TEAL"; + _color1 = 22; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerTeal300::proc15() { + int v = _fieldF6; + + if (!_object2) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_teal; + _object2->hide(); + + _object1.postInit(); + _object1.setPosition(_object2->_position); + + if (_object2->_mover) + _object2->addMover(NULL); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object1.setup(303, 1, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + + +/*--------------------------------------------------------------------------*/ + +SpeakerSoldier300::SpeakerSoldier300(): VisualSpeaker() { + _speakerName = "SOLDIER"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerSoldier300::proc15() { + int v = _fieldF6; + + if (!_object2) { + Scene300 *scene = (Scene300 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_teal; + _object2->hide(); + + _object1.postInit(); + _object1.setPosition(_object2->_position); + + if (_object2->_mover) + _object2->addMover(NULL); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object1.setup(303, 3, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinn2350::SpeakerQuinn2350(): VisualSpeaker() { + _speakerName = "QUINN"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +SpeakerPharisha2350::SpeakerPharisha2350(): VisualSpeaker() { + _speakerName = "PHARISHA"; + _color1 = 151; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinn2435::SpeakerQuinn2435() { + _speakerName = "QUINN"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} +void SpeakerQuinn2435::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 1) { + _object2 = &R2_GLOBALS._player; + } else { + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_actor1; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object2->setStrip(7); + _object1.setup(2020, 5, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +SpeakerSeeker2435::SpeakerSeeker2435() { + _speakerName = "SEEKER"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerSeeker2435::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 2) { + _object2 = &R2_GLOBALS._player; + } else { + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_actor1; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object2->setStrip(7); + _object1.setup(4099, 1, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +SpeakerPharisha2435::SpeakerPharisha2435() { + _speakerName = "PHARISHA"; + _color1 = 151; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerPharisha2435::proc15() { + int v = _fieldF6; + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + + if (!_object2) { + _object2 = &scene->_actor2; + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object1.setup(4098, 5, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinn2450::SpeakerQuinn2450() { + _speakerName = "QUINN"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} +void SpeakerQuinn2450::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 1) { + _object2 = &R2_GLOBALS._player; + } else { + Scene2435 *scene = (Scene2435 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_actor1; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + if (R2_GLOBALS.getFlag(61)) + _object1.setup(2020, 3, 1); + else + _object1.setup(2020, 1, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +SpeakerSeeker2450::SpeakerSeeker2450() { + _speakerName = "SEEKER"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +void SpeakerSeeker2450::proc15() { + int v = _fieldF6; + + if (!_object2) { + if (R2_GLOBALS._player._characterIndex == 2) { + _object2 = &R2_GLOBALS._player; + } else { + Scene2450 *scene = (Scene2450 *)R2_GLOBALS._sceneManager._scene; + _object2 = &scene->_actor1; + } + + _object2->hide(); + _object1.postInit(); + _object1.setPosition(_object2->_position); + } + + if (v == 0) { + _object1.animate(ANIM_MODE_2, NULL); + } else { + ((SceneItem *)_action)->_sceneRegionId = 0; + _object1.setup(4099, 3, 1); + _object1.animate(ANIM_MODE_5, this); + } +} + +SpeakerCaretaker2450::SpeakerCaretaker2450() { + _speakerName = "CARETAKER"; + _color1 = 43; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerQuinn2500::SpeakerQuinn2500() { + _speakerName = "QUINN"; + _color1 = 60; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +SpeakerSeeker2500::SpeakerSeeker2500() { + _speakerName = "SEEKER"; + _color1 = 35; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +SpeakerMiranda2500::SpeakerMiranda2500() { + // Not in uppercase in the original + _speakerName = "Miranda"; + _color1 = 154; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +SpeakerWebbster2500::SpeakerWebbster2500() { + // Not in uppercase in the original + _speakerName = "Webbster"; + _color1 = 27; + _color2 = 0; + _fieldF6 = 0; + _textWidth = 300; + _hideObjects = false; + _object2 = NULL; + _displayMode = 1; + _numFrames = 0; +} + +} // End of namespace Ringworld2 +} // End of namespace TsAGE diff --git a/engines/tsage/ringworld2/ringworld2_speakers.h b/engines/tsage/ringworld2/ringworld2_speakers.h new file mode 100644 index 0000000000..e6a805f31b --- /dev/null +++ b/engines/tsage/ringworld2/ringworld2_speakers.h @@ -0,0 +1,209 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef TSAGE_RINGWORLD2_SPEAKERS_H +#define TSAGE_RINGWORLD2_SPEAKERS_H + +#include "common/scummsys.h" +#include "tsage/converse.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/ringworld2/ringworld2_logic.h" + +namespace TsAGE { + +namespace Ringworld2 { + +using namespace TsAGE; + +class VisualSpeaker : public Speaker { +public: + SceneActor _object1; + SceneObject *_object2; + int _fieldF6, _fieldF8; + int _displayMode; + int _soundId; + int _delayAmount; + bool _removeObject; + int _frameNumber; + int _numFrames; +private: + void setFrame(int numFrames); +public: + VisualSpeaker(); + + virtual Common::String getClassName() { return "VisualSpeaker"; } + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void setText(const Common::String &msg); + virtual void proc15() {} + virtual void proc16(); +}; + +class SpeakerMiranda300 : public VisualSpeaker { +public: + SpeakerMiranda300(); + + virtual Common::String getClassName() { return "SpeakerMiranda300"; } + virtual void proc15(); +}; + +class SpeakerSeeker300 : public VisualSpeaker { +public: + SpeakerSeeker300(); + + virtual Common::String getClassName() { return "SpeakerSeeker300"; } + virtual void proc15(); +}; + +class SpeakerSeekerL : public VisualSpeaker { +public: + SpeakerSeekerL(); + + virtual Common::String getClassName() { return "SpeakerSeekerL"; } +}; + +class SpeakerQuinnL : public VisualSpeaker { +public: + SpeakerQuinnL(); + + virtual Common::String getClassName() { return "SpeakerQuinnL"; } +}; + +class SpeakerQuinn300 : public VisualSpeaker { +public: + SpeakerQuinn300(); + + virtual Common::String getClassName() { return "SpeakerQuinn300"; } + virtual void proc15(); +}; + +class SpeakerTeal300 : public VisualSpeaker { +public: + SpeakerTeal300(); + + virtual Common::String getClassName() { return "SpeakerTeal300"; } + virtual void proc15(); +}; + +class SpeakerSoldier300 : public VisualSpeaker { +public: + SpeakerSoldier300(); + + virtual Common::String getClassName() { return "SpeakerSoldier300"; } + virtual void proc15(); +}; + +class SpeakerQuinn2350 : public VisualSpeaker { +public: + SpeakerQuinn2350(); + + virtual Common::String getClassName() { return "SpeakerQuinn2350"; } +}; + +class SpeakerPharisha2350 : public VisualSpeaker { +public: + SpeakerPharisha2350(); + + virtual Common::String getClassName() { return "SpeakerPharisha2350"; } +}; + +class SpeakerQuinn2435 : public VisualSpeaker { +public: + SpeakerQuinn2435(); + + virtual Common::String getClassName() { return "SpeakerQuinn2435"; } + virtual void proc15(); +}; + +class SpeakerSeeker2435 : public VisualSpeaker { +public: + SpeakerSeeker2435(); + + virtual Common::String getClassName() { return "SpeakerSeeker2435"; } + virtual void proc15(); +}; + +class SpeakerPharisha2435 : public VisualSpeaker { +public: + SpeakerPharisha2435(); + + virtual Common::String getClassName() { return "SpeakerPharisha2435"; } + virtual void proc15(); +}; + +class SpeakerQuinn2450 : public VisualSpeaker { +public: + SpeakerQuinn2450(); + + virtual Common::String getClassName() { return "SpeakerQuinn2450"; } + virtual void proc15(); +}; + +class SpeakerSeeker2450 : public VisualSpeaker { +public: + SpeakerSeeker2450(); + + virtual Common::String getClassName() { return "SpeakerSeeker2450"; } + virtual void proc15(); +}; + +class SpeakerCaretaker2450 : public VisualSpeaker { +public: + SpeakerCaretaker2450(); + + virtual Common::String getClassName() { return "SpeakerCaretaker2450"; } +}; + +class SpeakerQuinn2500 : public VisualSpeaker { +public: + SpeakerQuinn2500(); + + virtual Common::String getClassName() { return "SpeakerQuinn2500"; } +}; + +class SpeakerSeeker2500 : public VisualSpeaker { +public: + SpeakerSeeker2500(); + + virtual Common::String getClassName() { return "SpeakerSeeker2500"; } +}; + +class SpeakerMiranda2500 : public VisualSpeaker { +public: + SpeakerMiranda2500(); + + virtual Common::String getClassName() { return "SpeakerMiranda2500"; } +}; + +class SpeakerWebbster2500 : public VisualSpeaker { +public: + SpeakerWebbster2500(); + + virtual Common::String getClassName() { return "SpeakerWebbster2500"; } +}; +} // End of namespace Ringworld2 +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp index c261d091dd..e56968acdf 100644 --- a/engines/tsage/saveload.cpp +++ b/engines/tsage/saveload.cpp @@ -129,8 +129,12 @@ Common::Error Saver::save(int slot, const Common::String &saveName) { _macroSaveFlag = true; _saveSlot = slot; - // Set up the serializer + // Try and create the save file Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(g_vm->generateSaveName(slot)); + if (!saveFile) + return Common::kCreatingFileFailed; + + // Set up the serializer Serializer serializer(NULL, saveFile); serializer.setSaveVersion(TSAGE_SAVEGAME_VERSION); @@ -177,6 +181,9 @@ Common::Error Saver::restore(int slot) { // Set up the serializer Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(g_vm->generateSaveName(slot)); + if (!saveFile) + return Common::kReadingFailed; + Serializer serializer(saveFile, NULL); // Read in the savegame header @@ -283,6 +290,7 @@ void Saver::writeSavegameHeader(Common::OutSaveFile *out, tSageSavegameHeader &h ::createThumbnail(thumb, (const byte *)s.pixels, SCREEN_WIDTH, SCREEN_HEIGHT, thumbPalette); Graphics::saveThumbnail(*out, *thumb); g_globals->_screenSurface.unlockSurface(); + thumb->free(); delete thumb; // Write out the save date/time diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index 52b23413d4..ff78abf52d 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -33,7 +33,7 @@ namespace TsAGE { typedef void (*SaveNotifierFn)(bool postFlag); -#define TSAGE_SAVEGAME_VERSION 7 +#define TSAGE_SAVEGAME_VERSION 9 class SavedObject; diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index baa114218e..6362c63bc3 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -259,7 +259,7 @@ Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), _sceneMode = 0; _activeScreenNumber = 0; _oldSceneBounds = Rect(4000, 4000, 4100, 4100); - Common::set_to(&_zoomPercents[0], &_zoomPercents[256], 0); + Common::fill(&_zoomPercents[0], &_zoomPercents[256], 0); } Scene::~Scene() { @@ -316,11 +316,39 @@ void Scene::loadScene(int sceneNum) { void Scene::loadSceneData(int sceneNum) { _activeScreenNumber = sceneNum; - // Get the basic scene size - byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999); - _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); + if (g_vm->getGameID() == GType_Ringworld2) { + // Most scenes in Ringworld 2 don't have a scene size resource, but rather just have + // a standard 320x200 size. Only read the scene size data for the specific few scenes + switch (sceneNum) { + case 700: + case 1020: + case 1100: + case 1700: + case 2600: + case 2950: + case 3100: + case 3101: + case 3275: + case 3600: { + // Get the basic scene size from the resource + byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999); + _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); + DEALLOCATE(data); + break; + } + default: + // For all other scenes, use a standard screen size + _backgroundBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + break; + } + } else { + // Get the basic scene size + byte *data = g_resourceManager->getResource(RES_BITMAP, sceneNum, 9999); + _backgroundBounds = Rect(0, 0, READ_LE_UINT16(data), READ_LE_UINT16(data + 2)); + DEALLOCATE(data); + } + g_globals->_sceneManager._scene->_sceneBounds.contain(_backgroundBounds); - DEALLOCATE(data); // Set up a surface for storing the scene background SceneManager::setBackSurface(); @@ -335,7 +363,7 @@ void Scene::loadSceneData(int sceneNum) { _priorities.load(sceneNum); // Initialize the section enabled list - Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff); + Common::fill(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff); g_globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; g_globals->_sceneOffset.y = (_sceneBounds.top / 100) * 100; @@ -428,8 +456,9 @@ void Scene::refreshBackground(int xAmount, int yAmount) { (xSectionSrc + 1) * 160, (ySectionSrc + 1) * 100); Rect destBounds(xSectionDest * 160, ySectionDest * 100, (xSectionDest + 1) * 160, (ySectionDest + 1) * 100); - if (g_vm->getGameID() == GType_BlueForce) { - // For Blue Force, if the scene has an interface area, exclude it from the copy + if (g_vm->getGameID() != GType_Ringworld) { + // For Blue Force and Return to Ringworld, if the scene has an interface area, + // exclude it from the copy srcBounds.bottom = MIN<int16>(srcBounds.bottom, BF_GLOBALS._interfaceY); destBounds.bottom = MIN<int16>(destBounds.bottom, BF_GLOBALS._interfaceY); } diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h index da813f019a..2daa71ba98 100644 --- a/engines/tsage/scenes.h +++ b/engines/tsage/scenes.h @@ -63,10 +63,11 @@ public: virtual void process(Event &event); virtual void dispatch(); virtual void loadScene(int sceneNum); + virtual void refreshBackground(int xAmount, int yAmount); void setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent); void loadBackground(int xAmount, int yAmount); - void refreshBackground(int xAmount, int yAmount); + void loadSceneData(int sceneNum); }; @@ -133,6 +134,8 @@ public: virtual Scene *createScene(int sceneNumber) = 0; virtual void processEvent(Event &event) {} virtual void rightClick() {} + virtual bool canSaveGameStateCurrently() = 0; + virtual bool canLoadGameStateCurrently() = 0; }; } // End of namespace TsAGE diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 71e69283e7..9df5a6666b 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -36,7 +36,7 @@ static SoundManager *_soundManager = NULL; SoundManager::SoundManager() { _soundManager = this; - __sndmgrReady = false; + _sndmgrReady = false; _ourSndResVersion = 0x102; _ourDrvResVersion = 0x10A; @@ -52,7 +52,7 @@ SoundManager::SoundManager() { } SoundManager::~SoundManager() { - if (__sndmgrReady) { + if (_sndmgrReady) { Common::StackLock slock(_serverDisabledMutex); g_vm->_mixer->stopAll(); @@ -83,7 +83,7 @@ SoundManager::~SoundManager() { } void SoundManager::postInit() { - if (!__sndmgrReady) { + if (!_sndmgrReady) { g_saver->addSaveNotifier(&SoundManager::saveNotifier); g_saver->addLoadNotifier(&SoundManager::loadNotifier); g_saver->addListener(this); @@ -94,7 +94,7 @@ void SoundManager::postInit() { // thread, and doesn't get too far ahead, I've left it to the AdlibSoundDriver class to // call the update method, rather than having it be called separately // g_system->getTimerManager()->installTimerProc(_sfUpdateCallback, 1000000 / SOUND_FREQUENCY, NULL, "tsageSoundUpdate"); - __sndmgrReady = true; + _sndmgrReady = true; } } @@ -136,7 +136,7 @@ void SoundManager::update() { } Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { - assert(__sndmgrReady); + assert(_sndmgrReady); _availableDrivers.clear(); // Build up a list of available drivers. Currently we only implement an Adlib music @@ -549,7 +549,7 @@ void SoundManager::loadNotifier(bool postFlag) { void SoundManager::loadNotifierProc(bool postFlag) { if (!postFlag) { // Stop any currently playing sounds - if (__sndmgrReady) { + if (_sndmgrReady) { Common::StackLock slock(_serverDisabledMutex); for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) { @@ -569,7 +569,7 @@ void SoundManager::loadNotifierProc(bool postFlag) { void SoundManager::listenerSynchronize(Serializer &s) { s.validate("SoundManager"); - assert(__sndmgrReady && _driversDetected); + assert(_sndmgrReady && _driversDetected); if (s.getVersion() < 6) return; @@ -798,7 +798,7 @@ void SoundManager::_sfRethinkVoiceTypes() { continue; _sfUpdateVoiceStructs(); - Common::set_to(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false); + Common::fill(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false); for (;;) { // Scan for sub priority @@ -1485,7 +1485,7 @@ Sound::Sound() { memset(_chNumVoices, 0, SOUND_ARR_SIZE * sizeof(int)); memset(_chSubPriority, 0, SOUND_ARR_SIZE * sizeof(int)); memset(_chFlags, 0, SOUND_ARR_SIZE * sizeof(int)); - Common::set_to(_chWork, _chWork + SOUND_ARR_SIZE, false); + Common::fill(_chWork, _chWork + SOUND_ARR_SIZE, false); memset(_channelData, 0, SOUND_ARR_SIZE * sizeof(byte *)); memset(_trkChannel, 0, SOUND_ARR_SIZE * sizeof(int)); memset(_trkState, 0, SOUND_ARR_SIZE * sizeof(int)); @@ -2432,7 +2432,7 @@ void ASound::dispatch() { } } -void ASound::play(int soundNum, Action *action, int volume) { +void ASound::play(int soundNum, EventHandler *action, int volume) { _action = action; _cueValue = 0; @@ -2557,7 +2557,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); - Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); + Common::fill(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); memset(_v4405E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); memset(_v44067, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); @@ -2565,7 +2565,7 @@ AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { memset(_v44079, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); memset(_v44082, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); _v44082[ADLIB_CHANNEL_COUNT] = 0x90; - Common::set_to(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000); + Common::fill(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000); memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); _patchData = NULL; } diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 010394a42e..77d1f3d3ac 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -87,7 +87,7 @@ public: int _driverResID; public: SoundDriver(); - virtual ~SoundDriver() {}; + virtual ~SoundDriver() {} const Common::String &getShortDriverDescription() { return _shortDescription; } const Common::String &getLongDriverDescription() { return _longDescription; } @@ -169,7 +169,7 @@ class SoundManager : public SaveListener { private: SoundDriver *instantiateDriver(int driverNum); public: - bool __sndmgrReady; + bool _sndmgrReady; int _ourSndResVersion, _ourDrvResVersion; SynchronizedList<Sound *> _playList; Common::List<SoundDriver *> _installedDrivers; @@ -373,7 +373,7 @@ public: virtual void synchronize(Serializer &s); virtual void dispatch(); - void play(int soundNum, Action *action = NULL, int volume = 127); + void play(int soundNum, EventHandler *action = NULL, int volume = 127); void stop(); void prime(int soundNum, Action *action = NULL); void unPrime(); @@ -414,6 +414,16 @@ public: virtual void signal(); }; +class PlayStream { +public: + Sound _sound; + + void setFile(const Common::String &filename) {} + bool play(int soundNum, EventHandler *endAction) { return false; } + void stop() {} + void proc1() {} + bool isPlaying() const { return false; } +}; #define ADLIB_CHANNEL_COUNT 9 diff --git a/engines/tsage/staticres.cpp b/engines/tsage/staticres.cpp index 626e2a7cd1..238e7b3049 100644 --- a/engines/tsage/staticres.cpp +++ b/engines/tsage/staticres.cpp @@ -77,7 +77,6 @@ const char *INV_EMPTY_MSG = "You have nothing in your possesion."; const char *QUIT_CONFIRM_MSG = "Do you want to quit playing this game?"; const char *RESTART_MSG = "Do you want to restart this game?"; const char *GAME_PAUSED_MSG = "Game is paused."; -const char *OPTIONS_MSG = "\x01Options..."; const char *OK_BTN_STRING = " Ok "; const char *CANCEL_BTN_STRING = "Cancel"; const char *QUIT_BTN_STRING = " Quit "; @@ -99,6 +98,7 @@ F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game"; const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?"; const char *START_PLAY_BTN_STRING = " Start Play "; const char *INTRODUCTION_BTN_STRING = "Introduction"; +const char *OPTIONS_MSG = "\x01Options..."; // Scene specific resources const char *EXIT_MSG = " EXIT "; @@ -134,6 +134,7 @@ F4 - Restart\rF5 - Save game\rF7 - Restore Game\rF10 - Pause game"; const char *WATCH_INTRO_MSG = "Do you wish to watch the introduction?"; const char *START_PLAY_BTN_STRING = " Play "; const char *INTRODUCTION_BTN_STRING = " Watch "; +const char *OPTIONS_MSG = "Options..."; // Blue Force general messages const char *BF_NAME = "Blue Force"; @@ -175,6 +176,46 @@ const char *SCENE570_PROTODATA = "PROTODATA"; const char *SCENE570_WACKYEXE = "WACKYEXE"; const char *SCENE570_WACKYDATA = "WACKYDATA"; +// Scene 180 messages +const char *THE_NEXT_DAY = "The Next Day"; + } // End of namespace BlueForce +namespace Ringworld2 { + +const char *CONSOLE_MESSAGES[] = { + NULL, "Select Language", "Computer Services", "Food Services", "Entertainment Services", + "Main Menu", "Exit Menu", "Previous Menu", "Interworld", "Hero's Tongue", "Personal Log", + "Database", "Starchart", "Iso-Opto Disk Reader", "Eject Disk", "Meals", "Snacks", + "Beverages", "Human Basic Snacks", "Kzin Basic Snacks", "Hot Beverages", "Cold Beverages", + "Music", "Outpost Alpha", " ", " ", "Done", "A-G", "H-O", "P-S", "T-Z", "Tchaikovsky", + "Mozart", "Bach", "Rossini" +}; + +const char *HELP_MSG = "\x1\rRETURN TO\r RINGWORLD\x14"; +const char *CHAR_TITLE = "\x01Select Character:"; +const char *CHAR_QUINN_MSG = " Quinn "; +const char *CHAR_SEEKER_MSG = " Seeker "; +const char *CHAR_MIRANDA_MSG = "Miranda"; +const char *CHAR_CANCEL_MSG = " Cancel "; + +const char *GAME_VERSION = "ScummVM Version"; +const char *SOUND_OPTIONS = "Sound options"; +const char *QUIT_GAME = "Quit"; +const char *RESTART_GAME = "Restart"; +const char *SAVE_GAME = "Save game"; +const char *RESTORE_GAME = "Restore game"; +const char *SHOW_CREDITS = "Show credits"; +const char *PAUSE_GAME = "Pause game"; +const char *RESUME_PLAY = " Resume play "; +const char *F2 = "F2"; +const char *F3 = "F3"; +const char *F4 = "F4"; +const char *F5 = "F5"; +const char *F7 = "F7"; +const char *F8 = "F8"; +const char *F10 = "F10"; + +} // End of namespace Ringworld2 + } // End of namespace TsAGE diff --git a/engines/tsage/staticres.h b/engines/tsage/staticres.h index 6829ff2568..faff3f4103 100644 --- a/engines/tsage/staticres.h +++ b/engines/tsage/staticres.h @@ -44,7 +44,6 @@ extern const char *RESTORING_NOT_ALLOWED_MSG; extern const char *QUIT_CONFIRM_MSG; extern const char *RESTART_MSG; extern const char *GAME_PAUSED_MSG; -extern const char *OPTIONS_MSG; extern const char *OK_BTN_STRING; extern const char *CANCEL_BTN_STRING; extern const char *QUIT_BTN_STRING; @@ -64,6 +63,7 @@ extern const char *HELP_MSG; extern const char *WATCH_INTRO_MSG; extern const char *START_PLAY_BTN_STRING; extern const char *INTRODUCTION_BTN_STRING; +extern const char *OPTIONS_MSG; // Scene specific resources extern const char *EXIT_MSG; @@ -98,6 +98,7 @@ extern const char *HELP_MSG; extern const char *WATCH_INTRO_MSG; extern const char *START_PLAY_BTN_STRING; extern const char *INTRODUCTION_BTN_STRING; +extern const char *OPTIONS_MSG; // Blue Force messages extern const char *BF_NAME; @@ -138,8 +139,43 @@ extern const char *SCENE570_WACKYDATA; // Scene 60 radio dispatch buttons extern const char *RADIO_BTN_LIST[8]; +// Scene 180 message +extern const char *THE_NEXT_DAY; + } // End of namespace BlueForce +namespace Ringworld2 { + +// Scene 125 - Console messages +extern const char *CONSOLE_MESSAGES[]; + +// Dialog messages +extern const char *HELP_MSG; +extern const char *CHAR_TITLE; +extern const char *CHAR_QUINN_MSG; +extern const char *CHAR_SEEKER_MSG; +extern const char *CHAR_MIRANDA_MSG; +extern const char *CHAR_CANCEL_MSG; + +extern const char *GAME_VERSION; +extern const char *SOUND_OPTIONS; +extern const char *QUIT_GAME; +extern const char *RESTART_GAME; +extern const char *SAVE_GAME; +extern const char *RESTORE_GAME; +extern const char *SHOW_CREDITS; +extern const char *PAUSE_GAME; +extern const char *RESUME_PLAY; +extern const char *F2; +extern const char *F3; +extern const char *F4; +extern const char *F5; +extern const char *F7; +extern const char *F8; +extern const char *F10; + +} // End of namespace Ringworld2 + } // End of namespace TsAGE #endif diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 90fdecc90b..40f4dfcfd2 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -38,7 +38,14 @@ TSageEngine::TSageEngine(OSystem *system, const tSageGameDescription *gameDesc) _gameDescription(gameDesc) { g_vm = this; DebugMan.addDebugChannel(kRingDebugScripts, "scripts", "Scripts debugging"); - _debugger = new Debugger(); + if (g_vm->getFeatures() & GF_DEMO) + _debugger = new DemoDebugger(); + else if (g_vm->getGameID() == GType_Ringworld) + _debugger = new RingworldDebugger(); + else if (g_vm->getGameID() == GType_BlueForce) + _debugger = new BlueForceDebugger(); + else if (g_vm->getGameID() == GType_Ringworld2) + _debugger = new Ringworld2Debugger(); } Common::Error TSageEngine::init() { @@ -61,6 +68,9 @@ bool TSageEngine::hasFeature(EngineFeature f) const { } void TSageEngine::initialize() { + // Set up the correct graphics mode + init(); + g_saver = new Saver(); // Set up the resource manager @@ -84,11 +94,20 @@ void TSageEngine::initialize() { g_globals = new BlueForce::BlueForceGlobals(); // Setup the user interface - BF_GLOBALS._uiElements.setup(Common::Point(0, BF_INTERFACE_Y - 2)); + T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2)); // Reset all global variables BF_GLOBALS.reset(); - } + } else if (g_vm->getGameID() == GType_Ringworld2) { + g_resourceManager->addLib("R2RW.RLB"); + g_globals = new Ringworld2::Ringworld2Globals(); + + // Setup the user interface + T2_GLOBALS._uiElements.setup(Common::Point(0, UI_INTERFACE_Y - 2)); + + // Reset all global variables + R2_GLOBALS.reset(); + } g_globals->gfxManager().setDefaults(); @@ -119,14 +138,14 @@ Common::Error TSageEngine::run() { * Returns true if it is currently okay to restore a game */ bool TSageEngine::canLoadGameStateCurrently() { - return (g_globals->getFlag(50) == 0); + return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canLoadGameStateCurrently(); } /** * Returns true if it is currently okay to save the game */ bool TSageEngine::canSaveGameStateCurrently() { - return (g_globals->getFlag(50) == 0); + return (g_globals != NULL) && (g_globals->_game != NULL) && g_globals->_game->canSaveGameStateCurrently(); } /** diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index a4e9240aee..eb36cf0790 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -40,7 +40,8 @@ namespace TsAGE { enum { GType_Ringworld = 0, - GType_BlueForce = 1 + GType_BlueForce = 1, + GType_Ringworld2 = 2 }; enum { @@ -62,7 +63,7 @@ struct tSageGameDescription; #define SCREEN_HEIGHT 200 #define SCREEN_CENTER_X 160 #define SCREEN_CENTER_Y 100 -#define BF_INTERFACE_Y 168 +#define UI_INTERFACE_Y 168 class TSageEngine : public Engine { private: diff --git a/engines/tsage/blue_force/blueforce_ui.cpp b/engines/tsage/user_interface.cpp index fb4008d2c1..2d06e268e4 100644 --- a/engines/tsage/blue_force/blueforce_ui.cpp +++ b/engines/tsage/user_interface.cpp @@ -20,16 +20,15 @@ * */ -#include "tsage/blue_force/blueforce_ui.h" +#include "tsage/user_interface.h" +#include "tsage/core.h" +#include "tsage/tsage.h" #include "tsage/blue_force/blueforce_dialogs.h" #include "tsage/blue_force/blueforce_logic.h" -#include "tsage/tsage.h" -#include "tsage/core.h" +#include "tsage/ringworld2/ringworld2_logic.h" namespace TsAGE { -namespace BlueForce { - void StripProxy::process(Event &event) { if (_action) _action->process(event); @@ -72,19 +71,34 @@ void UIQuestion::process(Event &event) { } void UIQuestion::showDescription(CursorType cursor) { - if (cursor == INV_FOREST_RAP) { - // Forest rap item has a graphical display - showItem(5, 1, 1); - } else { - // Display object description - SceneItem::display2(9001, (int)cursor); + switch (g_vm->getGameID()) { + case GType_BlueForce: + if (cursor == INV_FOREST_RAP) { + // Forest rap item has a graphical display + showItem(5, 1, 1); + } else { + // Display object description + SceneItem::display2(9001, (int)cursor); + } + break; + case GType_Ringworld2: + if ((cursor == R2_9) || (cursor == R2_39)) { + // Show communicator + warning("TODO: Communicator"); + } else { + // Show object description + SceneItem::display2(3, (int)cursor); + } + break; + default: + break; } } void UIQuestion::setEnabled(bool flag) { if (_enabled != flag) { UIElement::setEnabled(flag); - BF_GLOBALS._uiElements.draw(); + T2_GLOBALS._uiElements.draw(); } } @@ -98,16 +112,16 @@ void UIQuestion::showItem(int resNum, int rlbNum, int frameNum) { imgRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); // Save the area behind where the image will be displayed - GfxSurface *savedArea = Surface_getArea(BF_GLOBALS.gfxManager().getSurface(), imgRect); + GfxSurface *savedArea = Surface_getArea(GLOBALS.gfxManager().getSurface(), imgRect); // Draw the image - BF_GLOBALS.gfxManager().copyFrom(objImage, imgRect); + GLOBALS.gfxManager().copyFrom(objImage, imgRect); // Wait for a press - BF_GLOBALS._events.waitForPress(); + GLOBALS._events.waitForPress(); // Restore the old area - BF_GLOBALS.gfxManager().copyFrom(*savedArea, imgRect); + GLOBALS.gfxManager().copyFrom(*savedArea, imgRect); delete savedArea; } @@ -136,7 +150,7 @@ void UIScore::draw() { } void UIScore::updateScore() { - int score = BF_GLOBALS._uiElements._scoreValue; + int score = T2_GLOBALS._uiElements._scoreValue; _digit3.setFrame(score / 1000 + 1); score %= 1000; _digit2.setFrame(score / 100 + 1); score %= 100; @@ -161,22 +175,13 @@ void UIInventorySlot::process(Event &event) { if (event.eventType == EVENT_BUTTON_DOWN) { event.handled = true; - if (_objIndex == INV_AMMO_BELT) { - // Handle showing ammo belt - showAmmoBelt(); - - } else if (_objIndex != INV_NONE) { + // Check if game has a select item handler, and if so, give it a chance to check + // whether something special happens when the item is selected + if (!T2_GLOBALS._onSelectItem || !T2_GLOBALS._onSelectItem((CursorType)_objIndex)) _object->setCursor(); - } } } -void UIInventorySlot::showAmmoBelt() { - AmmoBeltDialog *dlg = new AmmoBeltDialog(); - dlg->execute(); - delete dlg; -} - /*--------------------------------------------------------------------------*/ UIInventoryScroll::UIInventoryScroll() { @@ -201,7 +206,7 @@ void UIInventoryScroll::process(Event &event) { toggle(false); // Scroll the inventory as necessary - BF_GLOBALS._uiElements.scrollInventory(_isLeft); + T2_GLOBALS._uiElements.scrollInventory(_isLeft); event.handled = true; break; default: @@ -212,7 +217,7 @@ void UIInventoryScroll::process(Event &event) { void UIInventoryScroll::toggle(bool pressed) { if (_enabled) { setFrame(pressed ? (_frameNum + 1) : _frameNum); - BF_GLOBALS._uiElements.draw(); + T2_GLOBALS._uiElements.draw(); } } @@ -242,9 +247,9 @@ void UICollection::show() { void UICollection::erase() { if (_clearScreen) { - Rect tempRect(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); - BF_GLOBALS._screenSurface.fillRect(tempRect, 0); - BF_GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0); + Rect tempRect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); + GLOBALS._screenSurface.fillRect(tempRect, 0); + GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0); _clearScreen = false; } } @@ -255,23 +260,31 @@ void UICollection::resetClear() { void UICollection::draw() { if (_visible) { + // Temporarily reset the sceneBounds when drawing UI elements to force them on-screen + Rect savedBounds = g_globals->_sceneManager._scene->_sceneBounds; + g_globals->_sceneManager._scene->_sceneBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + // Draw the elements onto the background for (uint idx = 0; idx < _objList.size(); ++idx) _objList[idx]->draw(); // Draw the resulting UI onto the screen - BF_GLOBALS._screenSurface.copyFrom(BF_GLOBALS._sceneManager._scene->_backSurface, - Rect(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT), - Rect(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT)); + GLOBALS._screenSurface.copyFrom(GLOBALS._sceneManager._scene->_backSurface, + Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT), + Rect(0, UI_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT)); _clearScreen = 1; + g_globals->_sceneManager._scene->_sceneBounds = savedBounds; } } /*--------------------------------------------------------------------------*/ UIElements::UIElements(): UICollection() { - _cursorVisage.setVisage(1, 5); + if (g_vm->getGameID() == GType_Ringworld2) + _cursorVisage.setVisage(5, 1); + else + _cursorVisage.setVisage(1, 5); g_saver->addLoadNotifier(&UIElements::loadNotifierProc); } @@ -303,16 +316,18 @@ void UIElements::synchronize(Serializer &s) { } void UIElements::process(Event &event) { - if (_clearScreen && BF_GLOBALS._player._enabled && (BF_GLOBALS._sceneManager._sceneNumber != 50)) { + if (_clearScreen && GLOBALS._player._enabled && + ((g_vm->getGameID() != GType_BlueForce) || (GLOBALS._sceneManager._sceneNumber != 50))) { if (_bounds.contains(event.mousePos)) { // Cursor inside UI area if (!_cursorChanged) { - if (BF_GLOBALS._events.isInventoryIcon()) { + if (GLOBALS._events.isInventoryIcon()) { // Inventory icon being displayed, so leave alone } else { // Change to the inventory use cursor - GfxSurface surface = _cursorVisage.getFrame(6); - BF_GLOBALS._events.setCursor(surface); + int cursorId = (g_vm->getGameID() == GType_Ringworld2) ? 11 : 6; + GfxSurface surface = _cursorVisage.getFrame(cursorId); + GLOBALS._events.setCursor(surface); } _cursorChanged = true; } @@ -331,14 +346,15 @@ void UIElements::process(Event &event) { } else if (_cursorChanged) { // Cursor outside UI area, so reset as necessary - BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + GLOBALS._events.setCursor(GLOBALS._events.getCursor()); _cursorChanged = false; - - SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; +/* + SceneExt *scene = (SceneExt *)GLOBALS._sceneManager._scene; if (scene->_focusObject) { GfxSurface surface = _cursorVisage.getFrame(7); - BF_GLOBALS._events.setCursor(surface); + GLOBALS._events.setCursor(surface); } +*/ } } } @@ -351,8 +367,8 @@ void UIElements::setup(const Common::Point &pt) { UICollection::setup(pt); hide(); - _object1.setup(1, 3, 1, 0, 0, 255); - add(&_object1); + _background.setup(1, 3, 1, 0, 0, 255); + add(&_background); // Set up the inventory slots int xp = 0; @@ -374,32 +390,48 @@ void UIElements::setup(const Common::Point &pt) { } xp = idx * 63 + 2; - item->setup(9, 1, idx, xp, 4, 255); + if (g_vm->getGameID() == GType_BlueForce) { + item->setup(9, 1, idx, xp, 4, 255); + } else { + item->setup(7, 1, idx, xp, 4, 255); + } add(item); } // Setup bottom-right hand buttons xp += 62; - _question.setup(1, 4, 7, xp, 16, 255); + int yp = (g_vm->getGameID() == GType_BlueForce) ? 16 : 17; + _question.setup(1, 4, 7, xp, yp, 255); _question.setEnabled(false); add(&_question); xp += 21; - _scrollLeft.setup(1, 4, 1, xp, 16, 255); + _scrollLeft.setup(1, 4, 1, xp, yp, 255); add(&_scrollLeft); _scrollLeft._isLeft = true; xp += 22; - _scrollRight.setup(1, 4, 4, xp, 16, 255); + _scrollRight.setup(1, 4, 4, xp, yp, 255); add(&_scrollRight); _scrollRight._isLeft = false; - // Set up the score - _score.postInit(); - add(&_score); + switch (g_vm->getGameID()) { + case GType_BlueForce: + // Set up the score + _score.postInit(); + add(&_score); + break; + case GType_Ringworld2: + // Set up the character display + _character.setup(1, 5, R2_GLOBALS._player._characterIndex, 285, 11, 255); + add(&_character); + break; + default: + break; + } // Set interface area - _bounds = Rect(0, BF_INTERFACE_Y - 1, SCREEN_WIDTH, SCREEN_HEIGHT); + _bounds = Rect(0, UI_INTERFACE_Y - 1, SCREEN_WIDTH, SCREEN_HEIGHT); updateInventory(); } @@ -420,7 +452,16 @@ void UIElements::add(UIElement *obj) { * Handles updating the visual inventory in the user interface */ void UIElements::updateInventory() { - _score.updateScore(); + switch (g_vm->getGameID()) { + case GType_BlueForce: + // Update the score + _score.updateScore(); + break; + case GType_Ringworld2: + _character.setFrame(R2_GLOBALS._player._characterIndex); + break; + } + updateInvList(); // Enable scroll buttons if the player has more than four items @@ -445,7 +486,7 @@ void UIElements::updateInventory() { // Loop through the inventory objects SynchronizedList<InvObject *>::iterator i; int objIndex = 0; - for (i = BF_INVENTORY._itemList.begin(); i != BF_INVENTORY._itemList.end(); ++i, ++objIndex) { + for (i = GLOBALS._inventory->_itemList.begin(); i != GLOBALS._inventory->_itemList.end(); ++i, ++objIndex) { InvObject *obj = *i; // Check whether the object is in any of the four inventory slots @@ -461,6 +502,8 @@ void UIElements::updateInventory() { slot->setVisage(obj->_visage); slot->setStrip(obj->_strip); slot->setFrame(obj->_frame); + + slot->reposition(); } } } @@ -479,7 +522,7 @@ void UIElements::updateInvList() { SynchronizedList<InvObject *>::iterator i; int itemIndex = 0; - for (i = BF_GLOBALS._inventory->_itemList.begin(); i != BF_GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) { + for (i = GLOBALS._inventory->_itemList.begin(); i != GLOBALS._inventory->_itemList.end(); ++i, ++itemIndex) { InvObject *invObject = *i; if (invObject->inInventory()) _itemList.push_back(itemIndex); @@ -491,7 +534,7 @@ void UIElements::updateInvList() { */ void UIElements::addScore(int amount) { _scoreValue += amount; - BF_GLOBALS._sound2.play(0); + T2_GLOBALS._inventorySound.play(0); updateInventory(); } @@ -508,10 +551,8 @@ void UIElements::scrollInventory(bool isLeft) { } void UIElements::loadNotifierProc(bool postFlag) { - if (postFlag && BF_GLOBALS._uiElements._active) - BF_GLOBALS._uiElements.show(); + if (postFlag && T2_GLOBALS._uiElements._active) + T2_GLOBALS._uiElements.show(); } -} // End of namespace BlueForce - } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_ui.h b/engines/tsage/user_interface.h index 601b97a9fe..0fbfc5a00f 100644 --- a/engines/tsage/blue_force/blueforce_ui.h +++ b/engines/tsage/user_interface.h @@ -20,8 +20,8 @@ * */ -#ifndef TSAGE_BLUEFORCE_UI_H -#define TSAGE_BLUEFORCE_UI_H +#ifndef TSAGE_USER_INTERFACE_H +#define TSAGE_USER_INTERFACE_H #include "common/scummsys.h" #include "tsage/core.h" @@ -30,10 +30,6 @@ namespace TsAGE { -namespace BlueForce { - -using namespace TsAGE; - class StripProxy: public EventHandler { public: virtual void process(Event &event); @@ -76,8 +72,6 @@ public: }; class UIInventorySlot: public UIElement { -private: - void showAmmoBelt(); public: int _objIndex; InvObject *_object; @@ -124,7 +118,7 @@ private: void add(UIElement *obj); void updateInvList(); public: - UIElement _object1; + UIElement _background; UIQuestion _question; UIScore _score; UIInventorySlot _slot1, _slot2, _slot3, _slot4; @@ -134,6 +128,7 @@ public: bool _active; Common::Array<int> _itemList; Visage _cursorVisage; + UIElement _character; UIElements(); virtual Common::String getClassName() { return "UIElements"; } @@ -149,8 +144,6 @@ public: static void loadNotifierProc(bool postFlag); }; -} // End of namespace BlueForce - } // End of namespace TsAGE #endif |