diff options
Diffstat (limited to 'engines/tsage/blue_force')
28 files changed, 21750 insertions, 605 deletions
diff --git a/engines/tsage/blue_force/blueforce_dialogs.cpp b/engines/tsage/blue_force/blueforce_dialogs.cpp new file mode 100644 index 0000000000..86feceb015 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_dialogs.cpp @@ -0,0 +1,434 @@ +/* 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/blue_force/blueforce_dialogs.h" +#include "tsage/ringworld/ringworld_logic.h" + +namespace TsAGE { + +namespace BlueForce { + +/** + * This dialog implements the right-click dialog + */ +RightClickDialog::RightClickDialog() : GfxDialog() { + // Setup button areas + _rectList1[0] = Rect(7, 50, 41, 67); + _rectList1[1] = Rect(13, 27, 50, 50); + _rectList1[2] = Rect(49, 27, 84, 50); + _rectList1[3] = Rect(56, 50, 90, 67); + _rectList1[4] = Rect(26, 68, 69, 99); + + _rectList3[0] = Rect(12, 49, 27, 64); + _rectList3[1] = Rect(27, 31, 42, 46); + _rectList3[2] = Rect(56, 31, 71, 46); + _rectList3[3] = Rect(72, 50, 87, 65); + _rectList3[4] = Rect(41, 81, 56, 96); + + // Set the palette and change the cursor + GfxSurface cursor = surfaceFromRes(1, 5, 9); + BF_GLOBALS._events.setCursor(cursor); + + setPalette(); + + // Get the dialog image + _surface = surfaceFromRes(1, 1, 1); + + // 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); + + // Load selected button images + _btnImages.setVisage(1, 2); + + _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); + + // Pre-process rect lists + for (int idx = 0; idx < 5; ++idx) { + _rectList2[idx] = _rectList1[idx]; + _rectList4[idx] = _rectList3[idx]; + + _rectList2[idx].translate(_bounds.left, _bounds.top); + _rectList4[idx].translate(_bounds.left, _bounds.top); + } +} + +bool RightClickDialog::process(Event &event) { + switch (event.eventType) { + case EVENT_MOUSE_MOVE: { + // Check whether a button is highlighted + int buttonIndex = 0; + while ((buttonIndex < 5) && !_rectList1[buttonIndex].contains(event.mousePos)) + ++buttonIndex; + if (buttonIndex == 5) + buttonIndex = -1; + + // 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, _rectList3[buttonIndex].left, _rectList3[buttonIndex].top); + } + + _highlightedAction = buttonIndex; + } + + event.handled = true; + return true; + } + + case EVENT_BUTTON_DOWN: + // Specify the selected action + _selectedAction = (_highlightedAction == -1) ? 5 : _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: + // Walk action + cursorNum = BF_GLOBALS._player._canWalk ? CURSOR_WALK : CURSOR_USE; + break; + case 1: + // Use action + cursorNum = CURSOR_USE; + break; + case 2: + // Look action + cursorNum = CURSOR_LOOK; + break; + case 3: + // Talk action + cursorNum = CURSOR_TALK; + break; + case 4: + // Options dialog + break; + } + + if (cursorNum != CURSOR_NONE) + BF_GLOBALS._events.setCursor(cursorNum); + + _gfxManager.deactivate(); +} + +/*--------------------------------------------------------------------------*/ + +AmmoBeltDialog::AmmoBeltDialog() : GfxDialog() { + _cursorNum = BF_GLOBALS._events.getCursor(); + _inDialog = -1; + _closeFlag = false; + + // Get the dialog image + _surface = surfaceFromRes(9, 5, 2); + + // Set the dialog position + _dialogRect.resize(_surface, 0, 0, 100); + _dialogRect.center(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2); + + _bounds = _dialogRect; + _gfxManager._bounds = _bounds; + _savedArea = NULL; + + // Set up area rects + _gunRect.set(0, 0, 82, 48); + _clip1Rect.set(90, 6, _bounds.width(), 39); + _clip2Rect.set(90, 40, _bounds.width(), _bounds.height()); + _loadedRect.set(50, 40, 60, 50); +} + +AmmoBeltDialog::~AmmoBeltDialog() { + BF_GLOBALS._events.setCursor(_cursorNum); +} + +void AmmoBeltDialog::execute() { + // Draw the dialog + draw(); + + // Dialog event handler loop + _gfxManager.activate(); + + while (!g_vm->shouldQuit() && !_closeFlag) { + 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(); + } + + _gfxManager.deactivate(); +} + +bool AmmoBeltDialog::process(Event &event) { + switch (event.eventType) { + case EVENT_MOUSE_MOVE: { + // Handle updating cursor depending on whether cursor is in dialog or not + int inDialog = Rect(0, 0, _bounds.width(), _bounds.height()).contains(event.mousePos); + if (inDialog != _inDialog) { + // Update cursor + BF_GLOBALS._events.setCursor(inDialog ? CURSOR_USE : CURSOR_EXIT); + _inDialog = inDialog; + } + return true; + } + + case EVENT_BUTTON_DOWN: + if (!_inDialog) + // Clicked outside dialog, so flag to close it + _closeFlag = true; + else { + int v = (BF_GLOBALS.getFlag(fGunLoaded) ? 1 : 0) * (BF_GLOBALS.getFlag(fLoadedSpare) ? 2 : 1); + + // Handle first clip + if ((v != 1) && _clip1Rect.contains(event.mousePos)) { + if (BF_GLOBALS.getFlag(fGunLoaded)) { + event.mousePos.x = event.mousePos.y = 0; + } + + BF_GLOBALS.setFlag(fGunLoaded); + BF_GLOBALS.clearFlag(fLoadedSpare); + } + + // Handle second clip + if ((v != 2) && _clip2Rect.contains(event.mousePos)) { + if (BF_GLOBALS.getFlag(fGunLoaded)) { + event.mousePos.x = event.mousePos.y = 0; + } + + BF_GLOBALS.setFlag(fGunLoaded); + BF_GLOBALS.setFlag(fLoadedSpare); + } + + if (_gunRect.contains(event.mousePos) && BF_GLOBALS.getFlag(fGunLoaded)) { + BF_GLOBALS.clearFlag(fGunLoaded); + v = (BF_GLOBALS.getFlag(fGunLoaded) ? 1 : 0) * (BF_GLOBALS.getFlag(fLoadedSpare) ? 2 : 1); + + if (v != 2) + BF_GLOBALS.clearFlag(fLoadedSpare); + } + + draw(); + } + + return true; + + case EVENT_KEYPRESS: + if ((event.kbd.keycode == Common::KEYCODE_ESCAPE) || (event.kbd.keycode == Common::KEYCODE_RETURN)) { + // Escape pressed, so flag to close dialog + _closeFlag = true; + return true; + } + break; + + default: + break; + } + + return false; +} + +void AmmoBeltDialog::draw() { + Rect bounds = _bounds; + + if (!_savedArea) { + // Save the covered background area + _savedArea = Surface_getArea(g_globals->_gfxManagerInstance.getSurface(), _bounds); + } else { + bounds.moveTo(0, 0); + } + + // Draw the dialog image + g_globals->gfxManager().copyFrom(_surface, bounds.left, bounds.top); + + // Setup clip flags + bool clip1 = true, clip2 = true; + bool gunLoaded = BF_GLOBALS.getFlag(fGunLoaded); + if (gunLoaded) { + // A clip is currently loaded. Hide the appropriate clip + if (BF_GLOBALS.getFlag(fLoadedSpare)) + clip2 = false; + else + clip1 = false; + } + + // Draw the first clip if necessary + if (clip1) { + GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip1Bullets); + _clip1Rect.resize(clipSurface, _clip1Rect.left, _clip1Rect.top, 100); + g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip1Rect.left, + bounds.top + _clip1Rect.top); + } + + // Draw the second clip if necessary + if (clip2) { + GfxSurface clipSurface = surfaceFromRes(9, 6, BF_GLOBALS._clip2Bullets); + _clip2Rect.resize(clipSurface, _clip2Rect.left, _clip2Rect.top, 100); + g_globals->gfxManager().copyFrom(clipSurface, bounds.left + _clip2Rect.left, + bounds.top + _clip2Rect.top); + } + + // If a clip is loaded, draw the 'loaded' portion of the gun + if (gunLoaded) { + GfxSurface loadedSurface = surfaceFromRes(9, 7, 1); + _loadedRect.resize(loadedSurface, _loadedRect.left, _loadedRect.top, 100); + g_globals->gfxManager().copyFrom(loadedSurface, bounds.left + _loadedRect.left, + bounds.top + _loadedRect.top); + } +} + +/*--------------------------------------------------------------------------*/ + +RadioConvDialog::RadioConvDialog() : GfxDialog() { + int idx; + + // Set up the list of buttons + int maxWidth = 0; + for (idx = 0; idx < 8; ++idx) { + _buttons[idx].setText(RADIO_BTN_LIST[idx]); + maxWidth = MAX(maxWidth, (int)_buttons[idx]._bounds.width()); + + add(&_buttons[idx]); + } + + // Set up the button positions and add them to the dialog + for (idx = 0; idx < 8; ++idx) { + _buttons[idx]._bounds.moveTo((idx % 2) * maxWidth + 2, + idx / 2 * _buttons[idx]._bounds.height() + 2); + _buttons[idx]._bounds.setWidth(maxWidth); + + add(&_buttons[idx]); + } + + // Set the dialog size and position + setDefaults(); + setTopLeft(8, 92); + + BF_GLOBALS._events.setCursor(CURSOR_ARROW); +} + +RadioConvDialog::~RadioConvDialog() { + BF_GLOBALS._events.setCursor(CURSOR_WALK); +} + +int RadioConvDialog::execute() { + GfxButton *btn = GfxDialog::execute(); + + // Get which button was pressed + int btnIndex = -1; + for (int idx = 0; idx < 8; ++idx) { + if (btn == &_buttons[idx]) { + btnIndex = idx; + break; + } + } + + return btnIndex; +} + +int RadioConvDialog::show() { + // Show the dialog + RadioConvDialog *dlg = new RadioConvDialog(); + dlg->draw(); + + int btnIndex = dlg->execute(); + + // Close the dialog + dlg->remove(); + delete dlg; + + return btnIndex; +} + + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_dialogs.h b/engines/tsage/blue_force/blueforce_dialogs.h new file mode 100644 index 0000000000..ca51c97aa2 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_dialogs.h @@ -0,0 +1,92 @@ +/* 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_BLUEFORCE_DIALOGS_H +#define TSAGE_BLUEFORCE_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 BlueForce { + +using namespace TsAGE; + +class RightClickDialog : public GfxDialog { +private: + GfxSurface _surface; + Visage _btnImages; + 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 AmmoBeltDialog : public GfxDialog { +private: + GfxSurface _surface; + Visage _cursorImages; + Rect _dialogRect, _loadedRect, _gunRect, _clip1Rect, _clip2Rect; + CursorType _cursorNum; + int _inDialog; + bool _closeFlag; +public: + AmmoBeltDialog(); + ~AmmoBeltDialog(); + + virtual void draw(); + virtual bool process(Event &event); + void execute(); +}; + +class RadioConvDialog : public GfxDialog { +private: + GfxButton _buttons[8]; +public: + RadioConvDialog(); + virtual ~RadioConvDialog(); + int execute(); + + static int show(); +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 60bbddbabc..247fc4b9f2 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -21,9 +21,17 @@ */ #include "tsage/blue_force/blueforce_logic.h" +#include "tsage/blue_force/blueforce_dialogs.h" #include "tsage/blue_force/blueforce_scenes0.h" #include "tsage/blue_force/blueforce_scenes1.h" +#include "tsage/blue_force/blueforce_scenes2.h" #include "tsage/blue_force/blueforce_scenes3.h" +#include "tsage/blue_force/blueforce_scenes4.h" +#include "tsage/blue_force/blueforce_scenes5.h" +#include "tsage/blue_force/blueforce_scenes6.h" +#include "tsage/blue_force/blueforce_scenes7.h" +#include "tsage/blue_force/blueforce_scenes8.h" +#include "tsage/blue_force/blueforce_scenes9.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/graphics.h" @@ -35,9 +43,9 @@ namespace BlueForce { void BlueForceGame::start() { // Start the game - _globals->_sceneManager.changeScene(300); + g_globals->_sceneManager.changeScene(300); - _globals->_events.setCursor(CURSOR_WALK); + g_globals->_events.setCursor(CURSOR_WALK); } Scene *BlueForceGame::createScene(int sceneNumber) { @@ -47,9 +55,11 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Tsunami Title Screen return new Scene20(); case 50: + // Map screen return new Scene50(); case 60: - error("Scene group 0 not implemented"); + // Motorcycle + return new Scene60(); /* Scene Group #1 */ case 100: // Tsnunami Title Screen #2 @@ -58,7 +68,6 @@ Scene *BlueForceGame::createScene(int sceneNumber) { // Introduction Bar Room return new Scene109(); case 110: - case 114: case 115: case 125: @@ -66,75 +75,205 @@ Scene *BlueForceGame::createScene(int sceneNumber) { case 150: case 160: case 180: - case 190: error("Scene group 1 not implemented"); + case 190: + // Front of Police Station + return new Scene190(); case 200: + // Credits - Motorcycle Training + return new Scene200(); case 210: + // Credits - Car Training + return new Scene210(); case 220: + // Credits - Martial Arts + return new Scene220(); case 225: + // Credits - Gun Training + return new Scene225(); case 265: + // Graduation Article + return new Scene265(); case 270: + // Living Room & Kitchen + return new Scene270(); case 271: + // Living Room & Kitchen #2 + return new Scene271(); case 280: error("Scene group 2 not implemented"); case 300: // Outside Police Station return new Scene300(); case 315: + // Inside Police Station + return new Scene315(); case 325: + // Police Station Conference Room + return new Scene325(); case 330: + // Approaching Marina + return new Scene330(); case 340: + // Marina, Domestic Disturbance + return new Scene340(); case 342: + // Marina, Normal + return new Scene342(); case 350: + // Marina, Outside Boat + return new Scene350(); case 355: + // Future Wave Exterior + return new Scene355(); case 360: + // Future Wave Interior + return new Scene360(); case 370: + // Future Wave Bedroom + return new Scene370(); case 380: + // Outside City Hall & Jail + return new Scene380(); case 385: + // City Hall + return new Scene385(); case 390: - error("Scene group 3 not implemented"); + // City Jail + return new Scene390(); case 410: + // Traffic Stop Gang Members + return new Scene410(); case 415: + // Searching Truck + return new Scene415(); case 440: + // Outside Alleycat Bowl + return new Scene440(); case 450: - error("Scene group 4 not implemented"); + // Inside Alleycat Bowl + return new Scene450(); case 550: + // Outside Bikini Hut + return new Scene550(); case 551: + // Outside Bikini Hut (Drunk Stop) + return new Scene551(); case 560: + // Study + return new Scene560(); case 570: + // Computer + return new Scene570(); case 580: + // Child Protective Services Parking Lot + return new Scene580(); case 590: - error("Scene group 5 not implemented"); + // Child Protective Services + return new Scene590(); case 600: + // Crash cut-scene + return new Scene600(); case 620: + // Hospital cut-scene + return new Scene620(); case 666: + // Death scene + return new Scene666(); case 690: - error("Scene group 6 not implemented"); + // Decking + return new Scene690(); case 710: - error("Scene group 7 not implemented"); + return new Scene710(); case 800: + // Jamison & Ryan + return new Scene800(); case 810: case 820: + error("Scene group 8 not implemented"); case 830: + // Outside Boat Rentals + return new Scene830(); case 840: + // Boat Rentals + return new Scene840(); case 850: case 860: case 870: case 880: error("Scene group 8 not implemented"); case 900: + // Outside Warehouse + return new Scene900(); case 910: + error("Scene group 9 not implemented"); case 920: + // Inside Warehouse: Secret room + return new Scene920(); case 930: + // Inside the caravan + return new Scene930(); case 935: + // Hidden in the wardrobe + return new Scene935(); case 940: - error("Scene group 9 not implemented"); + return new Scene940(); default: error("Unknown scene number - %d", sceneNumber); break; } } +void BlueForceGame::rightClick() { + RightClickDialog *dlg = new RightClickDialog(); + dlg->execute(); + delete dlg; +} + +void BlueForceGame::processEvent(Event &event) { + if (event.eventType == EVENT_KEYPRESS) { + switch (event.kbd.keycode) { + case Common::KEYCODE_F1: + // F1 - Help + MessageDialog::show(HELP_MSG, OK_BTN_STRING); + 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_F10: + // F10 - Pause + GfxDialog::setPalette(); + MessageDialog::show(GAME_PAUSED_MSG, OK_BTN_STRING); + g_globals->_events.setCursorFromFlag(); + break; + + default: + break; + } + } +} + /*--------------------------------------------------------------------------*/ AObjectArray::AObjectArray(): EventHandler() { @@ -150,7 +289,7 @@ void AObjectArray::clear() { void AObjectArray::synchronize(Serializer &s) { EventHandler::synchronize(s); for (int i = 0; i < OBJ_ARRAY_SIZE; ++i) - SYNC_POINTER(_objList[i]); + SYNC_POINTER(_objList[i]); } void AObjectArray::process(Event &event) { @@ -205,13 +344,13 @@ void AObjectArray::remove(EventHandler *obj) { Timer::Timer() { _endFrame = 0; - _endAction = NULL; + _endHandler = NULL; _tickAction = NULL; } void Timer::remove() { _endFrame = 0; - _endAction = NULL; + _endHandler = NULL; ((Scene100 *)BF_GLOBALS._sceneManager._scene)->removeTimer(this); } @@ -219,15 +358,15 @@ void Timer::remove() { void Timer::synchronize(Serializer &s) { EventHandler::synchronize(s); SYNC_POINTER(_tickAction); - SYNC_POINTER(_endAction); + SYNC_POINTER(_endHandler); s.syncAsUint32LE(_endFrame); } void Timer::signal() { - assert(_endAction); - Action *action = _endAction; + assert(_endHandler); + EventHandler *item = _endHandler; remove(); - action->signal(); + item->signal(); } void Timer::dispatch() { @@ -242,11 +381,11 @@ void Timer::dispatch() { } } -void Timer::set(uint32 delay, Action *endAction) { +void Timer::set(uint32 delay, EventHandler *endHandler) { assert(delay != 0); _endFrame = BF_GLOBALS._sceneHandler->getFrameDifference() + delay; - _endAction = endAction; + _endHandler = endHandler; ((SceneExt *)BF_GLOBALS._sceneManager._scene)->addTimer(this); } @@ -257,9 +396,9 @@ TimerExt::TimerExt(): Timer() { _action = NULL; } -void TimerExt::set(uint32 delay, Action *endAction, Action *newAction) { +void TimerExt::set(uint32 delay, EventHandler *endHandler, Action *newAction) { _newAction = newAction; - Timer::set(delay, endAction); + Timer::set(delay, endHandler); } void TimerExt::synchronize(Serializer &s) { @@ -269,22 +408,18 @@ void TimerExt::synchronize(Serializer &s) { void TimerExt::remove() { _action = NULL; - remove(); + Timer::remove(); } void TimerExt::signal() { - Action *endAction = _endAction; + EventHandler *endHandler = _endHandler; Action *newAction = _newAction; remove(); // If the end action doesn't have an action anymore, set it to the specified new action - assert(endAction); - if (!endAction->_action) - endAction->setAction(newAction); -} - -void TimerExt::dispatch() { - + assert(endHandler); + if (!endHandler->_action) + endHandler->setAction(newAction); } /*--------------------------------------------------------------------------*/ @@ -307,7 +442,39 @@ void NamedObject::synchronize(Serializer &s) { s.syncAsSint16LE(_useLineNum); } -void NamedObject::setup(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { +bool NamedObject::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 *)BF_GLOBALS._sceneManager._scene)->display(action); + return handled; +} + +void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item) { _resNum = resNum; _lookLineNum = lookLineNum; _talkLineNum = talkLineNum; @@ -315,20 +482,27 @@ void NamedObject::setup(int resNum, int lookLineNum, int talkLineNum, int useLin switch (mode) { case 2: - _globals->_sceneItems.push_front(this); + g_globals->_sceneItems.push_front(this); break; case 4: - _globals->_sceneItems.addBefore(item, this); + g_globals->_sceneItems.addBefore(item, this); break; case 5: - _globals->_sceneItems.addAfter(item, this); + g_globals->_sceneItems.addAfter(item, this); break; default: - _globals->_sceneItems.push_back(this); + g_globals->_sceneItems.push_back(this); break; } } +void NamedObject::setDetails(int resNum, int lookLineNum, int talkLineNum, int useLineNum) { + _resNum = resNum; + _lookLineNum = lookLineNum; + _talkLineNum = talkLineNum; + _useLineNum = useLineNum; +} + /*--------------------------------------------------------------------------*/ CountdownObject::CountdownObject(): NamedObject() { @@ -412,17 +586,84 @@ void FollowerObject::setup(SceneObject *object, int visage, int frameNum, int yD /*--------------------------------------------------------------------------*/ -SceneExt::SceneExt(): Scene() { - warning("TODO: dword_503AA/dword_503AE/dword_53030"); +FocusObject::FocusObject(): NamedObject() { + _img = surfaceFromRes(1, 5, 7); +} - _field372 = 0; - _field37A = 0; - _eventHandler = NULL; +void FocusObject::postInit(SceneObjectList *OwnerList) { + NamedObject::postInit(OwnerList); + _resNum = 560; + _lookLineNum = 43; + _talkLineNum = 44; + _useLineNum = -1; + _v90 = 0; + _v92 = 1; + + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_focusObject = this; + BF_GLOBALS._sceneItems.push_front(this); +} + +void FocusObject::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_v90); + s.syncAsSint16LE(_v92); +} + +void FocusObject::remove() { + BF_GLOBALS._sceneItems.remove(this); + + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene->_focusObject == this) + scene->_focusObject = NULL; + + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + NamedObject::remove(); +} + +void FocusObject::process(Event &event) { + if (BF_GLOBALS._player._enabled) { + if (_bounds.contains(event.mousePos)) { + // Reset the cursor back to normal + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (event.btnState == 3)) { + BF_GLOBALS._events.setCursor(CURSOR_USE); + event.handled = true; + } + } else if (event.mousePos.y < 168) { + // Change the cursor to an 'Exit' image + BF_GLOBALS._events.setCursor(_img); + if (event.eventType == EVENT_BUTTON_DOWN) { + // Remove the object from display + event.handled = true; + remove(); + } + } + } + + if (_action) + _action->process(event); +} + +/*--------------------------------------------------------------------------*/ + +SceneExt::SceneExt(): Scene() { + _stripManager._onBegin = SceneExt::startStrip; + _stripManager._onEnd = SceneExt::endStrip; + + _field372 = _field37A = 0; + _savedPlayerEnabled = false; + _savedUiEnabled = false; + _savedCanWalk = false; + _focusObject = NULL; + _cursorVisage.setVisage(1, 8); } void SceneExt::postInit(SceneObjectList *OwnerList) { Scene::postInit(OwnerList); - if (BF_GLOBALS._v4CEA2) { + if (BF_GLOBALS._dayNumber) { // Blank out the bottom portion of the screen BF_GLOBALS._interfaceY = BF_INTERFACE_Y; @@ -441,11 +682,11 @@ void SceneExt::dispatch() { _timerList.dispatch(); if (_field37A) { - if ((--_field37A == 0) && BF_GLOBALS._v4CEA2) { - if (BF_GLOBALS._v4E238 && (BF_GLOBALS._v4CF9E == 1)) { - warning("sub_1B052"); + if ((--_field37A == 0) && BF_GLOBALS._dayNumber) { + if (BF_GLOBALS._uiElements._active && BF_GLOBALS._player._enabled) { + BF_GLOBALS._uiElements.show(); } - + _field37A = 0; } } @@ -455,330 +696,543 @@ void SceneExt::dispatch() { void SceneExt::loadScene(int sceneNum) { Scene::loadScene(sceneNum); - + _v51C34.top = 0; _v51C34.bottom = 300; } +void SceneExt::checkGun() { + // Remove a bullet from the currently loaded clip + if (BF_GLOBALS.getFlag(fLoadedSpare) && (BF_GLOBALS._clip2Bullets > 0)) { + if (--BF_GLOBALS._clip2Bullets == 0) + BF_GLOBALS.clearFlag(fGunLoaded); + } else { + if (BF_GLOBALS._clip1Bullets > 0) + --BF_GLOBALS._clip1Bullets; + + if (!BF_GLOBALS._clip1Bullets) + BF_GLOBALS.clearFlag(fGunLoaded); + } + + BF_GLOBALS._sound3.play(4); +} + +bool SceneExt::display(CursorType action) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2)); + break; + case CURSOR_USE: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 6); + break; + case CURSOR_TALK: + SceneItem::display2(9000, BF_GLOBALS._randomSource.getRandomNumber(2) + 3); + break; + case INV_COLT45: + gunDisplay(); + break; + default: + if (action < BF_LAST_INVENT) + SceneItem::display2(9002, (int)action); + else + return false; + break; + } + + return true; +} + +void SceneExt::fadeOut() { + uint32 black = 0; + BF_GLOBALS._scenePalette.fade((const byte *)&black, false, 100); +} + +void SceneExt::gunDisplay() { + if (!BF_GLOBALS.getFlag(gunDrawn)) { + // Gun not drawn + SceneItem::display2(1, BF_GLOBALS.getFlag(fCanDrawGun) ? 0 : 4); + } else if (!BF_GLOBALS.getFlag(fGunLoaded)) { + // Gun not loaded + SceneItem::display2(1, 1); + } else if (!BF_GLOBALS.getHasBullets()) { + // Out of ammunition + SceneItem::display2(1, 2); + } else { + // Check scene for whether gun can fire + checkGun(); + } +} + +void SceneExt::startStrip() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_field372 = 1; + scene->_savedPlayerEnabled = BF_GLOBALS._player._enabled; + + if (scene->_savedPlayerEnabled) { + scene->_savedUiEnabled = BF_GLOBALS._player._uiEnabled; + scene->_savedCanWalk = BF_GLOBALS._player._canWalk; + BF_GLOBALS._player.disableControl(); + + if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) + BF_GLOBALS._uiElements.hide(); + } +} + +void SceneExt::endStrip() { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + scene->_field372 = 0; + + if (scene->_savedPlayerEnabled) { + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._uiEnabled = scene->_savedUiEnabled; + BF_GLOBALS._player._canWalk = scene->_savedCanWalk; + + if (!BF_GLOBALS._v50696 && BF_GLOBALS._uiElements._active) + BF_GLOBALS._uiElements.show(); + } +} + +void SceneExt::clearScreen() { + BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); +} + /*--------------------------------------------------------------------------*/ -GameScene::GameScene() { +PalettedScene::PalettedScene(): SceneExt() { + _field794 = 0; +} +void PalettedScene::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field794); } -void GameScene::postInit(SceneObjectList *OwnerList) { +void PalettedScene::postInit(SceneObjectList *OwnerList) { _field794 = 0; - _field412 = 1; + _palette._field412 = 1; SceneExt::postInit(OwnerList); } -void GameScene::remove() { +void PalettedScene::remove() { SceneExt::remove(); if (_field794 == 1) { for (SynchronizedList<SceneObject *>::iterator i = BF_GLOBALS._sceneObjects->begin(); i != BF_GLOBALS._sceneObjects->end(); ++i) (*i)->remove(); - + BF_GLOBALS._sceneObjects->draw(); BF_GLOBALS._scenePalette.loadPalette(2); BF_GLOBALS._v51C44 = 1; - BF_GLOBALS._v51C42 = 1; + BF_GLOBALS._sceneManager._hasPalette = true; } - BF_GLOBALS._scenePalette._field412 = 1; + BF_GLOBALS._scenePalette._field412 = 0; } -/*--------------------------------------------------------------------------*/ - -void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { - SceneHandler::postInit(OwnerList); - - // Load the low end palette data - GLOBALS._scenePalette.loadPalette(2); - GLOBALS._scenePalette.refresh(); +PaletteFader *PalettedScene::addFader(const byte *arrBufferRGB, int step, Action *action) { + _field794 = 1; + return BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, step, action); } -void SceneHandlerExt::process(Event &event) { - SceneHandler::process(event); - - // TODO: All the new stuff from Blue Force +void PalettedScene::add2Faders(const byte *arrBufferRGB, int step, int paletteNum, Action *action) { + BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, 100, NULL); + _palette.loadPalette(paletteNum); + _palette.loadPalette(2); + 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) { + byte tmpPalette[768]; -VisualSpeaker::VisualSpeaker(): Speaker() { - _textWidth = 312; - _color1 = 19; - _hideObjects = false; - _removeObject1 = false; - _removeObject2 = false; - _field20E = 160; - _fontNumber = 4; - _color2 = 82; - _offsetPos = Common::Point(4, 170); - _numFrames = 0; -} - -void VisualSpeaker::remove() { - if (_removeObject2) - _object2.remove(); - if (_removeObject1) - _object1.remove(); - - Speaker::remove(); -} - -void VisualSpeaker::synchronize(Serializer &s) { - Speaker::synchronize(s); - - s.syncAsByte(_removeObject1); - s.syncAsByte(_removeObject2); - s.syncAsSint16LE(_field20C); - s.syncAsSint16LE(_field20E); - s.syncAsSint16LE(_numFrames); - s.syncAsSint16LE(_offsetPos.x); - s.syncAsSint16LE(_offsetPos.y); -} - -void VisualSpeaker::proc12(Action *action) { - Speaker::proc12(action); - _textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left, - _offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top); - _numFrames = 0; -} - -void VisualSpeaker::setText(const Common::String &msg) { - BF_GLOBALS._events.waitForPress(); - _objectList.draw(); - - _sceneText._color1 = _color1; - _sceneText._color2 = _color2; - _sceneText._color3 = _color3; - _sceneText._width = _textWidth; - _sceneText._fontNumber = _fontNumber; - _sceneText._textMode = _textMode; - _sceneText.setup(msg); - - // Get the string bounds - GfxFont f; - f.setFontNumber(_fontNumber); - Rect bounds; - f.getStringBounds(msg.c_str(), bounds, _textWidth); - - // Set the position for the text - switch (_textMode) { - case ALIGN_LEFT: - case ALIGN_JUSTIFIED: - _sceneText.setPosition(_textPos); - break; - case ALIGN_CENTER: - _sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y)); - break; - case ALIGN_RIGHT: - _sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y)); - break; - default: - break; + _palette.loadPalette(paletteNum); + _palette.loadPalette(2); + 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]; + tmpPalette[(3 * i) + 2] = BF_GLOBALS._scenePalette._palette[(3 * i) + 2]; + } + } else { + for (int i = fromColor1; i <= fromColor2; i++) { + tmpPalette[(3 * i)] = _palette._palette[(3 * i)]; + tmpPalette[(3 * i) + 1] = _palette._palette[(3 * i) + 1]; + tmpPalette[(3 * i) + 2] = _palette._palette[(3 * i) + 2]; + } } - // Ensure the text is in the foreground - _sceneText.fixPriority(256); - - // Count the number of words (by spaces) in the string - const char *s = msg.c_str(); - int spaceCount = 0; - while (*s) { - if (*s++ == ' ') - ++spaceCount; + 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; } - _numFrames = spaceCount * 3 + 2; + BF_GLOBALS._scenePalette.addFader((const byte *)tmpPalette, 256, 100, action); } + /*--------------------------------------------------------------------------*/ -SpeakerSutter::SpeakerSutter() { - _speakerName = "SUTTER"; - _color1 = 20; - _color2 = 22; - _textMode = ALIGN_CENTER; +void SceneHandlerExt::postInit(SceneObjectList *OwnerList) { + SceneHandler::postInit(OwnerList); + + // Load the low end palette data + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); } -void SpeakerSutter::setText(const Common::String &msg) { - _removeObject1 = _removeObject2 = true; +void SceneHandlerExt::process(Event &event) { + SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; + if (scene && scene->_focusObject) + scene->_focusObject->process(event); - _object1.postInit(); - _object1.setVisage(329); - _object1.setStrip2(2); - _object1.fixPriority(254); - _object1.changeZoom(100); - _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, - BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + if (BF_GLOBALS._uiElements._active) { + BF_GLOBALS._uiElements.process(event); + if (event.handled) + return; + } - _object2.postInit(); - _object2.setVisage(329); - _object2.setStrip2(1); - _object2.fixPriority(255); - _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, - BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + // If the strip proxy is currently being controlled by the strip manager, + // then pass all events to it first + if (BF_GLOBALS._stripProxy._action) { + BF_GLOBALS._stripProxy._action->process(event); + if (event.handled) + return; + } - VisualSpeaker::setText(msg); - _object2.fixCountdown(8, _numFrames); + SceneHandler::process(event); } -/*--------------------------------------------------------------------------*/ - -SpeakerDoug::SpeakerDoug(): VisualSpeaker() { - _color1 = 32; - _speakerName = "DOUG"; +void SceneHandlerExt::playerAction(Event &event) { + if (BF_GLOBALS._events.getCursor() == INV_DOG_WHISTLE) { + SceneItem::display2(1, 6); + event.handled = true; + } } -/*--------------------------------------------------------------------------*/ - -SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() { - _color1 = 13; - _speakerName = "JAKE_NO_HEAD"; +void SceneHandlerExt::processEnd(Event &event) { + // Check for a fallback text display for the given cursor/item being used in the scene + if (!event.handled && BF_GLOBALS._sceneManager._scene) { + CursorType cursor = BF_GLOBALS._events.getCursor(); + if (((SceneExt *)BF_GLOBALS._sceneManager._scene)->display(cursor)) + event.handled = true; + } } /*--------------------------------------------------------------------------*/ BlueForceInvObjectList::BlueForceInvObjectList(): - _business_card(9, 4, 2, 0), - _lauras_sweater(9, 4, 3, 0), - _handcuffs(9, 1, 4, 0), - _magnum(9, 1, 5, 0), - _ticket_book(9, 1, 6, 0), - _miranda_card(9, 1, 7, 0), - _forest_follet(9, 1, 8, 0), - _bradford_id(9, 1, 9, 0), - _baseball_card(9, 1, 10, 0), - _slip_bradford(9, 1, 11, 0), - _flare(9, 1, 12, 0), - _rap_sheet(9, 1, 13, 0), - _cartridges(9, 1, 14, 0), - _rifle(9, 1, 15, 0), - _wig(9, 1, 16, 0), - _frankies_id(9, 1, 17, 0), - _tyrones_id(9, 1, 18, 0), - _pistol22(9, 1, 19, 0), - _unused(1, 1, 1, 0), - _slip_frankie(9, 2, 1, 0), - _slip_tyrone(9, 2, 2, 0), - _atf_teletype(9, 2, 3, 0), - _da_note(9, 2, 4, 0), - _blueprints(9, 2, 5, 0), - _planter_key(9, 2, 6, 0), - _center_punch(9, 2, 7, 0), - _tranquilizer(9, 2, 8, 0), - _boat_hook(9, 2, 9, 0), - _oily_rags(9, 2, 10, 0), - _fuel_jar(9, 2, 11, 0), - _screwdriver(9, 2, 12, 0), - _floppy_disk1(9, 2, 13, 0), - _floppy_disk2(9, 2, 14, 0), - _driftwood(9, 2, 15, 0), - _crate_piece1(9, 2, 16, 0), - _crate_piece2(9, 2, 17, 0), - _shoebox(9, 2, 18, 0), - _badge(9, 2, 19, 0), - _unused2(1, 1, 1, 0), - _rental_coupons(9, 3, 1, 0), - _nickel(9, 3, 2, 0), - _calendar(9, 3, 3, 0), - _dixon_note(9, 3, 4, 0), - _cobb_mugshot(9, 3, 5, 0), - _murder_article(9, 3, 6, 0), - _microfiche(9, 3, 7, 0), - _future_wave_keys(9, 3, 8, 0), - _rental_boat_keys(9, 3, 9, 0), - _napkin(9, 3, 10, 0), - _cobb_printout(9, 3, 11, 0), - _fishing_net(9, 3, 12, 0), - _id(9, 3, 13, 0), - _rounds_9mm(9, 3, 14, 0), - _dates_note(9, 3, 15, 0), - _hand_grenade(9, 3, 16, 0), - _cord_110(9, 3, 17, 0), - _cord_110_plug(9, 3, 18, 0), - _cord_220(9, 3, 19, 0), - _unused3(1, 1, 1, 0), - _cord_220_plug(9, 4, 1, 0), - _official_document(9, 4, 2, 0), - _red_sweater(9, 4, 3, 0), - _jackknife(9, 4, 4, 0), - _whistle(9, 4, 5, 0), - _gun(9, 1, 2, 0), - _alley_cat_key(9, 4, 7, 0) { + _none(9, 5, 1), + _colt45(9, 1, 1), + _ammoClip(9, 4, 2), + _spareClip(9, 4, 3), + _handcuffs(9, 1, 4), + _greensGun(9, 1, 5), + _ticketBook(9, 1, 6), + _mirandaCard(9, 1, 7), + _forestRap(9, 1, 8), + _greenId(9, 1, 9), + _baseballCard(9, 1, 10), + _bookingGreen(9, 1, 11), + _flare(9, 1, 12), + _cobbRap(9, 1, 13), + _bullet22(9, 1, 14), + _autoRifle(9, 1, 15), + _wig(9, 1, 16), + _frankieId(9, 1, 17), + _tyroneId(9, 1, 18), + _snub22(9, 1, 19), + _bug(1, 1, 1), + _bookingFrankie(9, 2, 1), + _bookingGang(9, 2, 2), + _fbiTeletype(9, 2, 3), + _daNote(9, 2, 4), + _printOut(9, 2, 5), + _warehouseKeys(9, 2, 6), + _centerPunch(9, 2, 7), + _tranqGun(9, 2, 8), + _hook(9, 2, 9), + _rags(9, 2, 10), + _jar(9, 2, 11), + _screwdriver(9, 2, 12), + _dFloppy(9, 2, 13), + _blankDisk(9, 2, 14), + _stick(9, 2, 15), + _crate1(9, 2, 16), + _crate2(9, 2, 17), + _shoebox(9, 2, 18), + _badge(9, 2, 19), + _bug2(1, 1, 1), + _rentalCoupon(9, 3, 1), + _nickel(9, 3, 2), + _lyleCard(9, 3, 3), + _carterNote(9, 3, 4), + _mugshot(9, 3, 5), + _clipping(9, 3, 6), + _microfilm(9, 3, 7), + _waveKeys(9, 3, 8), + _rentalKeys(9, 3, 9), + _napkin(9, 3, 10), + _dmvPrintout(9, 3, 11), + _fishingNet(9, 3, 12), + _id(9, 3, 13), + _bullets9mm(9, 3, 14), + _schedule(9, 3, 15), + _grenades(9, 3, 16), + _yellowCord(9, 3, 17), + _halfYellowCord(9, 3, 18), + _blackCord(9, 3, 19), + _bug3(1, 1, 1), + _halfBlackCord(9, 4, 1), + _warrant(9, 4, 2), + _jacket(9, 4, 3), + _greensKnife(9, 4, 4), + _dogWhistle(9, 4, 5), + _ammoBelt(9, 1, 2), + _alleyCatKey(9, 4, 7) { // Add the items to the list - _itemList.push_back(&_business_card); - _itemList.push_back(&_lauras_sweater); + _itemList.push_back(&_none); + _itemList.push_back(&_colt45); + _itemList.push_back(&_ammoClip); + _itemList.push_back(&_spareClip); _itemList.push_back(&_handcuffs); - _itemList.push_back(&_magnum); - _itemList.push_back(&_ticket_book); - _itemList.push_back(&_miranda_card); - _itemList.push_back(&_forest_follet); - _itemList.push_back(&_bradford_id); - _itemList.push_back(&_baseball_card); - _itemList.push_back(&_slip_bradford); + _itemList.push_back(&_greensGun); + _itemList.push_back(&_ticketBook); + _itemList.push_back(&_mirandaCard); + _itemList.push_back(&_forestRap); + _itemList.push_back(&_greenId); + _itemList.push_back(&_baseballCard); + _itemList.push_back(&_bookingGreen); _itemList.push_back(&_flare); - _itemList.push_back(&_rap_sheet); - _itemList.push_back(&_cartridges); - _itemList.push_back(&_rifle); + _itemList.push_back(&_cobbRap); + _itemList.push_back(&_bullet22); + _itemList.push_back(&_autoRifle); _itemList.push_back(&_wig); - _itemList.push_back(&_frankies_id); - _itemList.push_back(&_tyrones_id); - _itemList.push_back(&_pistol22); - _itemList.push_back(&_unused); - _itemList.push_back(&_slip_frankie); - _itemList.push_back(&_slip_tyrone); - _itemList.push_back(&_atf_teletype); - _itemList.push_back(&_da_note); - _itemList.push_back(&_blueprints); - _itemList.push_back(&_planter_key); - _itemList.push_back(&_center_punch); - _itemList.push_back(&_tranquilizer); - _itemList.push_back(&_boat_hook); - _itemList.push_back(&_oily_rags); - _itemList.push_back(&_fuel_jar); + _itemList.push_back(&_frankieId); + _itemList.push_back(&_tyroneId); + _itemList.push_back(&_snub22); + _itemList.push_back(&_bug); + _itemList.push_back(&_bookingFrankie); + _itemList.push_back(&_bookingGang); + _itemList.push_back(&_fbiTeletype); + _itemList.push_back(&_daNote); + _itemList.push_back(&_printOut); + _itemList.push_back(&_warehouseKeys); + _itemList.push_back(&_centerPunch); + _itemList.push_back(&_tranqGun); + _itemList.push_back(&_hook); + _itemList.push_back(&_rags); + _itemList.push_back(&_jar); _itemList.push_back(&_screwdriver); - _itemList.push_back(&_floppy_disk1); - _itemList.push_back(&_floppy_disk2); - _itemList.push_back(&_driftwood); - _itemList.push_back(&_crate_piece1); - _itemList.push_back(&_crate_piece2); + _itemList.push_back(&_dFloppy); + _itemList.push_back(&_blankDisk); + _itemList.push_back(&_stick); + _itemList.push_back(&_crate1); + _itemList.push_back(&_crate2); _itemList.push_back(&_shoebox); _itemList.push_back(&_badge); - _itemList.push_back(&_unused2); - _itemList.push_back(&_rental_coupons); + _itemList.push_back(&_bug2); + _itemList.push_back(&_rentalCoupon); _itemList.push_back(&_nickel); - _itemList.push_back(&_calendar); - _itemList.push_back(&_dixon_note); - _itemList.push_back(&_cobb_mugshot); - _itemList.push_back(&_murder_article); - _itemList.push_back(&_microfiche); - _itemList.push_back(&_future_wave_keys); - _itemList.push_back(&_rental_boat_keys); + _itemList.push_back(&_lyleCard); + _itemList.push_back(&_carterNote); + _itemList.push_back(&_mugshot); + _itemList.push_back(&_clipping); + _itemList.push_back(&_microfilm); + _itemList.push_back(&_waveKeys); + _itemList.push_back(&_rentalKeys); _itemList.push_back(&_napkin); - _itemList.push_back(&_cobb_printout); - _itemList.push_back(&_fishing_net); + _itemList.push_back(&_dmvPrintout); + _itemList.push_back(&_fishingNet); _itemList.push_back(&_id); - _itemList.push_back(&_rounds_9mm); - _itemList.push_back(&_dates_note); - _itemList.push_back(&_hand_grenade); - _itemList.push_back(&_cord_110); - _itemList.push_back(&_cord_110_plug); - _itemList.push_back(&_cord_220); - _itemList.push_back(&_unused3); - _itemList.push_back(&_cord_220_plug); - _itemList.push_back(&_official_document); - _itemList.push_back(&_red_sweater); - _itemList.push_back(&_jackknife); - _itemList.push_back(&_whistle); - _itemList.push_back(&_gun); - _itemList.push_back(&_alley_cat_key); + _itemList.push_back(&_bullets9mm); + _itemList.push_back(&_schedule); + _itemList.push_back(&_grenades); + _itemList.push_back(&_yellowCord); + _itemList.push_back(&_halfYellowCord); + _itemList.push_back(&_blackCord); + _itemList.push_back(&_bug3); + _itemList.push_back(&_halfBlackCord); + _itemList.push_back(&_warrant); + _itemList.push_back(&_jacket); + _itemList.push_back(&_greensKnife); + _itemList.push_back(&_dogWhistle); + _itemList.push_back(&_ammoBelt); + _itemList.push_back(&_alleyCatKey); +} + +void BlueForceInvObjectList::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(INV_COLT45, 1); + setObjectScene(INV_HANDCUFFS, 1); + setObjectScene(INV_AMMO_BELT, 1); + setObjectScene(INV_ID, 1); + + // Set default room for other objects + setObjectScene(INV_TICKET_BOOK, 60); + setObjectScene(INV_MIRANDA_CARD, 60); + setObjectScene(INV_FOREST_RAP, 320); + setObjectScene(INV_GREEN_ID, 370); + setObjectScene(INV_BASEBALL_CARD, 840); + setObjectScene(INV_BOOKING_GREEN, 390); + setObjectScene(INV_FLARE, 355); + setObjectScene(INV_COBB_RAP, 810); + setObjectScene(INV_22_BULLET, 415); + setObjectScene(INV_AUTO_RIFLE, 415); + setObjectScene(INV_WIG, 415); + setObjectScene(INV_FRANKIE_ID, 410); + setObjectScene(INV_TYRONE_ID, 410); + setObjectScene(INV_22_SNUB, 410); + setObjectScene(INV_FBI_TELETYPE, 320); + setObjectScene(INV_DA_NOTE, 320); + setObjectScene(INV_PRINT_OUT, 570); + setObjectScene(INV_WAREHOUSE_KEYS, 360); + setObjectScene(INV_CENTER_PUNCH, 0); + setObjectScene(INV_TRANQ_GUN, 830); + setObjectScene(INV_HOOK, 350); + setObjectScene(INV_RAGS, 870); + setObjectScene(INV_JAR, 870); + setObjectScene(INV_SCREWDRIVER, 355); + setObjectScene(INV_D_FLOPPY, 570); + setObjectScene(INV_BLANK_DISK, 560); + setObjectScene(INV_STICK, 710); + setObjectScene(INV_CRATE1, 710); + setObjectScene(INV_CRATE2, 870); + setObjectScene(INV_SHOEBOX, 270); + setObjectScene(INV_BADGE, 560); + setObjectScene(INV_RENTAL_COUPON, 0); + setObjectScene(INV_NICKEL, 560); + setObjectScene(INV_LYLE_CARD, 270); + setObjectScene(INV_CARTER_NOTE, 830); + setObjectScene(INV_MUG_SHOT, 810); + setObjectScene(INV_CLIPPING, 810); + setObjectScene(INV_MICROFILM, 810); + setObjectScene(INV_WAVE_KEYS, 840); + setObjectScene(INV_RENTAL_KEYS, 840); + setObjectScene(INV_NAPKIN, 115); + setObjectScene(INV_DMV_PRINTOUT, 810); + setObjectScene(INV_FISHING_NET, 830); + setObjectScene(INV_9MM_BULLETS, 930); + setObjectScene(INV_SCHEDULE, 930); + setObjectScene(INV_GRENADES, 355); + setObjectScene(INV_GREENS_KNIFE, 370); + setObjectScene(INV_JACKET, 880); + setObjectScene(INV_DOG_WHISTLE, 880); + setObjectScene(INV_YELLOW_CORD, 910); + setObjectScene(INV_BLACK_CORD, 910); +} + +void BlueForceInvObjectList::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 (BF_GLOBALS._events.getCursor() == objectNum) + BF_GLOBALS._events.setCursor(CURSOR_USE); + + // Update the user interface if necessary + BF_GLOBALS._uiElements.updateInventory(); } +void BlueForceInvObjectList::alterInventory(int mode) { + // Check for existing specific items in player's inventory + bool hasPrintout = getObjectScene(INV_PRINT_OUT) == 1; + bool hasRags = getObjectScene(INV_RAGS) == 1; + bool hasJar = getObjectScene(INV_JAR) == 1; + bool hasNickel = getObjectScene(INV_NICKEL) == 1; + bool hasCrate1 = getObjectScene(INV_CRATE1) == 1; //di + bool hasForestRap = getObjectScene(INV_FOREST_RAP) == 1; + bool hasRentalCoupon = getObjectScene(INV_RENTAL_COUPON) == 1; //si + bool hasWarehouseKeys = getObjectScene(INV_WAREHOUSE_KEYS) == 1; + bool hasCobbRap = getObjectScene(INV_COBB_RAP) == 1; + bool hasHook = getObjectScene(INV_HOOK) == 1; + bool hasMugShot = getObjectScene(INV_MUG_SHOT) == 1; + + // Remove any items currently in player's inventory + SynchronizedList<InvObject *>::iterator i; + for (i = _itemList.begin(); i != _itemList.end(); ++i) { + if ((*i)->_sceneNumber == 1) + (*i)->_sceneNumber = 0; + } + + // Give basic set of items back into inventory + setObjectScene(INV_COLT45, 1); + setObjectScene(INV_HANDCUFFS, 1); + setObjectScene(INV_AMMO_BELT, 1); + setObjectScene(INV_ID, 1); + + // Reset ticket book and miranda card back to motorcycle + setObjectScene(INV_TICKET_BOOK, 60); + setObjectScene(INV_MIRANDA_CARD, 60); + + BF_GLOBALS._v4CEC4 = 0; + + switch (mode) { + case 2: + if (hasPrintout) + setObjectScene(INV_PRINT_OUT, 1); + if (hasNickel) + setObjectScene(INV_NICKEL, 1); + if (hasForestRap) + setObjectScene(INV_FOREST_RAP, 1); + if (hasCrate1) + setObjectScene(INV_CRATE1, 1); + if (hasRentalCoupon) + setObjectScene(INV_RENTAL_COUPON, 1); + if (hasHook) + setObjectScene(INV_HOOK, 1); + break; + case 3: + if (hasPrintout) + setObjectScene(INV_PRINT_OUT, 1); + if (hasNickel) + setObjectScene(INV_NICKEL, 1); + if (hasForestRap) + setObjectScene(INV_FOREST_RAP, 1); + if (hasCrate1) + setObjectScene(INV_CRATE1, 1); + if (hasRentalCoupon) + setObjectScene(INV_RENTAL_COUPON, 1); + if (hasCobbRap) + setObjectScene(INV_COBB_RAP, 1); + if (hasHook) + setObjectScene(INV_HOOK, 1); + if (hasMugShot) + setObjectScene(INV_MUG_SHOT, 1); + break; + case 4: + if (hasNickel) + setObjectScene(INV_NICKEL, 1); + if (hasRentalCoupon) + setObjectScene(INV_RENTAL_COUPON, 1); + if (hasHook) + setObjectScene(INV_HOOK, 1); + break; + case 5: + if (hasRags) + setObjectScene(INV_RAGS, 1); + if (hasJar) + setObjectScene(INV_JAR, 1); + if (hasRentalCoupon) + setObjectScene(INV_RENTAL_COUPON, 1); + if (hasWarehouseKeys) + setObjectScene(INV_WAREHOUSE_KEYS, 1); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h index d756d85cb3..dcaea52444 100644 --- a/engines/tsage/blue_force/blueforce_logic.h +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -35,12 +35,14 @@ namespace BlueForce { using namespace TsAGE; -#define BLUE_INVENTORY (*((::TsAGE::BlueForce::BlueForceInvObjectList *)_globals->_inventory)) +#define BF_INVENTORY (*((::TsAGE::BlueForce::BlueForceInvObjectList *)g_globals->_inventory)) class BlueForceGame: public Game { public: virtual void start(); virtual Scene *createScene(int sceneNumber); + virtual void rightClick(); + virtual void processEvent(Event &event); }; #define OBJ_ARRAY_SIZE 10 @@ -65,11 +67,11 @@ public: class Timer: public EventHandler { public: Action *_tickAction; - Action *_endAction; + EventHandler *_endHandler; uint32 _endFrame; public: Timer(); - void set(uint32 delay, Action *endAction); + void set(uint32 delay, EventHandler *endHandler); virtual Common::String getClassName() { return "Timer"; } virtual void synchronize(Serializer &s); @@ -81,16 +83,28 @@ public: class TimerExt: public Timer { public: Action *_newAction; -public: +public: TimerExt(); - void set(uint32 delay, Action *endAction, Action *action); + void set(uint32 delay, EventHandler *endHandler, Action *action); virtual Common::String getClassName() { return "TimerExt"; } virtual void synchronize(Serializer &s); virtual void remove(); virtual void signal(); - virtual void dispatch(); -}; +}; + + +class SceneHotspotExt: public SceneHotspot { +public: + int _state; + + SceneHotspotExt() { _state = 0; } + virtual Common::String getClassName() { return "SceneHotspotExt"; } + virtual void synchronize(Serializer &s) { + SceneHotspot::synchronize(s); + s.syncAsSint16LE(_state); + } +}; class SceneItemType2: public SceneHotspot { public: @@ -105,8 +119,35 @@ public: virtual Common::String getClassName() { return "NamedObject"; } virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual bool startAction(CursorType action, Event &event); - void setup(int resNum, int lookLineNum, int talkLineNum, int useLineNum, int mode, SceneItem *item); + 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 NamedObjectExt: public NamedObject { +public: + int _flag; + + NamedObjectExt() { _flag = 0; } + virtual Common::String getClassName() { return "NamedObjectExt"; } + virtual void synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_flag); + } +}; + +class NamedObject2: public NamedObject { +public: + int _v1, _v2; + + NamedObject2() { _v1 = _v2 = 0; } + virtual Common::String getClassName() { return "NamedObject2"; } + virtual void synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_v1); + s.syncAsSint16LE(_v2); + } }; class CountdownObject: public NamedObject { @@ -125,7 +166,7 @@ public: SceneObject *_object; FollowerObject(); - virtual Common::String getClassName() { return "SceneObjectExt4"; } + virtual Common::String getClassName() { return "FollowerObject"; } virtual void synchronize(Serializer &s); virtual void remove(); virtual void dispatch(); @@ -134,12 +175,35 @@ public: void setup(SceneObject *object, int visage, int frameNum, int yDiff); }; +class FocusObject: public NamedObject { +public: + int _v90, _v92; + GfxSurface _img; + + FocusObject(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void process(Event &event); +}; + +enum ExitFrame { EXITFRAME_N = 1, EXITFRAME_NE = 2, EXITFRAME_E = 3, EXITFRAME_SE = 4, + EXITFRAME_S = 5, EXITFRAME_SW = 6, EXITFRAME_W = 7, EXITFRAME_NW = 8 }; + class SceneExt: public Scene { +private: + static void startStrip(); + static void endStrip(); public: AObjectArray _timerList, _objArray2; int _field372; + bool _savedPlayerEnabled; + bool _savedUiEnabled; + bool _savedCanWalk; int _field37A; - EventHandler *_eventHandler; + + FocusObject *_focusObject; + Visage _cursorVisage; Rect _v51C34; public: @@ -150,139 +214,115 @@ public: virtual void process(Event &event); virtual void dispatch(); virtual void loadScene(int sceneNum); - virtual void proc13() { warning("TODO: SceneExt::proc13"); } + virtual void checkGun(); void addTimer(Timer *timer) { _timerList.add(timer); } void removeTimer(Timer *timer) { _timerList.remove(timer); } + bool display(CursorType action); + void fadeOut(); + void gunDisplay(); + void clearScreen(); }; -class GameScene: public SceneExt { +class PalettedScene: public SceneExt { public: - int _field412; + ScenePalette _palette; int _field794; public: - GameScene(); + PalettedScene(); + virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL); 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); }; class SceneHandlerExt: public SceneHandler { public: virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void process(Event &event); -}; - -class VisualSpeaker: public Speaker { -public: - NamedObject _object1; - CountdownObject _object2; - bool _removeObject1, _removeObject2; - int _field20C, _field20E; - int _numFrames; - Common::Point _offsetPos; -public: - VisualSpeaker(); - - virtual Common::String getClassName() { return "VisualSpeaker"; } - virtual void synchronize(Serializer &s); - virtual void remove(); - virtual void proc12(Action *action); - virtual void setText(const Common::String &msg); -}; - -class SpeakerSutter: public VisualSpeaker { -public: - SpeakerSutter(); - - virtual Common::String getClassName() { return "SpeakerSutter"; } - virtual void setText(const Common::String &msg); -}; - -class SpeakerDoug: public VisualSpeaker { -public: - SpeakerDoug(); - - virtual Common::String getClassName() { return "SpeakerDoug"; } -}; - -class SpeakerJakeNoHead: public VisualSpeaker { -public: - SpeakerJakeNoHead(); - virtual Common::String getClassName() { return "SpeakerJakeNoHead"; } + virtual void playerAction(Event &event); + virtual void processEnd(Event &event); }; class BlueForceInvObjectList : public InvObjectList { public: - InvObject _business_card; - InvObject _lauras_sweater; + InvObject _none; + InvObject _colt45; + InvObject _ammoClip; + InvObject _spareClip; InvObject _handcuffs; - InvObject _magnum; - InvObject _ticket_book; - InvObject _miranda_card; - InvObject _forest_follet; - InvObject _bradford_id; - InvObject _baseball_card; - InvObject _slip_bradford; + InvObject _greensGun; + InvObject _ticketBook; + InvObject _mirandaCard; + InvObject _forestRap; + InvObject _greenId; + InvObject _baseballCard; + InvObject _bookingGreen; InvObject _flare; - InvObject _rap_sheet; - InvObject _cartridges; - InvObject _rifle; + InvObject _cobbRap; + InvObject _bullet22; + InvObject _autoRifle; InvObject _wig; - InvObject _frankies_id; - InvObject _tyrones_id; - InvObject _pistol22; - InvObject _unused; - InvObject _slip_frankie; - InvObject _slip_tyrone; - InvObject _atf_teletype; - InvObject _da_note; - InvObject _blueprints; - InvObject _planter_key; - InvObject _center_punch; - InvObject _tranquilizer; - InvObject _boat_hook; - InvObject _oily_rags; - InvObject _fuel_jar; + InvObject _frankieId; + InvObject _tyroneId; + InvObject _snub22; + InvObject _bug; + InvObject _bookingFrankie; + InvObject _bookingGang; + InvObject _fbiTeletype; + InvObject _daNote; + InvObject _printOut; + InvObject _warehouseKeys; + InvObject _centerPunch; + InvObject _tranqGun; + InvObject _hook; + InvObject _rags; + InvObject _jar; InvObject _screwdriver; - InvObject _floppy_disk1; - InvObject _floppy_disk2; - InvObject _driftwood; - InvObject _crate_piece1; - InvObject _crate_piece2; + InvObject _dFloppy; + InvObject _blankDisk; + InvObject _stick; + InvObject _crate1; + InvObject _crate2; InvObject _shoebox; InvObject _badge; - InvObject _unused2; - InvObject _rental_coupons; + InvObject _bug2; + InvObject _rentalCoupon; InvObject _nickel; - InvObject _calendar; - InvObject _dixon_note; - InvObject _cobb_mugshot; - InvObject _murder_article; - InvObject _microfiche; - InvObject _future_wave_keys; - InvObject _rental_boat_keys; + InvObject _lyleCard; + InvObject _carterNote; + InvObject _mugshot; + InvObject _clipping; + InvObject _microfilm; + InvObject _waveKeys; + InvObject _rentalKeys; InvObject _napkin; - InvObject _cobb_printout; - InvObject _fishing_net; + InvObject _dmvPrintout; + InvObject _fishingNet; InvObject _id; - InvObject _rounds_9mm; - InvObject _dates_note; - InvObject _hand_grenade; - InvObject _cord_110; - InvObject _cord_110_plug; - InvObject _cord_220; - InvObject _unused3; - InvObject _cord_220_plug; - InvObject _official_document; - InvObject _red_sweater; - InvObject _jackknife; - InvObject _whistle; - InvObject _gun; - InvObject _alley_cat_key; + InvObject _bullets9mm; + InvObject _schedule; + InvObject _grenades; + InvObject _yellowCord; + InvObject _halfYellowCord; + InvObject _blackCord; + InvObject _bug3; + InvObject _halfBlackCord; + InvObject _warrant; + InvObject _jacket; + InvObject _greensKnife; + InvObject _dogWhistle; + InvObject _ammoBelt; + InvObject _alleyCatKey; BlueForceInvObjectList(); + void reset(); + void setObjectScene(int objectNum, int sceneNumber); + void alterInventory(int mode); virtual Common::String getClassName() { return "BlueForceInvObjectList"; } }; diff --git a/engines/tsage/blue_force/blueforce_scenes0.cpp b/engines/tsage/blue_force/blueforce_scenes0.cpp index f1b714ec6c..1e8c535f5f 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.cpp +++ b/engines/tsage/blue_force/blueforce_scenes0.cpp @@ -21,6 +21,7 @@ */ #include "tsage/blue_force/blueforce_scenes0.h" +#include "tsage/blue_force/blueforce_dialogs.h" #include "tsage/scenes.h" #include "tsage/tsage.h" #include "tsage/staticres.h" @@ -191,6 +192,7 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _object8.changeZoom(100); setAction(&_action1); + BF_GLOBALS._dialogCenter.y = 165; } /*-------------------------------------------------------------------------- @@ -263,34 +265,36 @@ void Scene50::Tooltip::highlight(bool btnDown) { update(); if (btnDown) { - if ((BF_GLOBALS._bikiniHutState == 14) && BF_GLOBALS.getFlag(98)) + if ((BF_GLOBALS._bookmark == bCalledToDrunkStop) && BF_GLOBALS.getFlag(beenToJRDay2)) scene->_sceneNumber = 600; - else if (BF_GLOBALS._bikiniHutState == 5) + else if (BF_GLOBALS._bookmark == bBookedGreen) scene->_sceneNumber = 410; else { - BF_GLOBALS._v4CEF4 = _newSceneNumber; + BF_GLOBALS._driveToScene = _newSceneNumber; - switch (BF_GLOBALS._v4CEF2) { + switch (BF_GLOBALS._driveFromScene) { case 330: case 340: case 342: BF_GLOBALS._player.disableControl(); - if (_locationId != BF_GLOBALS._mapLocationId) { + BF_GLOBALS._mapLocationId = _locationId; + + if (BF_GLOBALS._driveToScene != 330) { scene->_sceneNumber = 330; } else { - scene->_sceneNumber = (BF_GLOBALS._v4CEA2 != 1) || (BF_GLOBALS._bikiniHutState < 1) || - (BF_GLOBALS._bikiniHutState >= 2) ? 342 : 340; + scene->_sceneNumber = (BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340; } break; case 410: case 551: - if (BF_GLOBALS.getFlag((BF_GLOBALS._v4CEF2 == 410) ? 41 : 40)) { + if (BF_GLOBALS.getFlag((BF_GLOBALS._driveFromScene == 410) ? fSearchedTruck : didDrunk)) { BF_GLOBALS._mapLocationId = _locationId; BF_GLOBALS._player.disableControl(); scene->_sceneNumber = _newSceneNumber; } else { - BF_GLOBALS._v4CEA8 = 4; + BF_GLOBALS._deathReason = 4; BF_GLOBALS._sceneManager.changeScene(666); return; } @@ -298,7 +302,7 @@ void Scene50::Tooltip::highlight(bool btnDown) { case 300: if (_locationId == 1) { - BF_GLOBALS._v4CEF4 = 300; + BF_GLOBALS._driveToScene = 300; _newSceneNumber = 300; } // Deliberate fall through to default @@ -308,11 +312,11 @@ void Scene50::Tooltip::highlight(bool btnDown) { scene->_sceneNumber = _newSceneNumber; break; } - - // Signal the scene to change to the new scene - scene->_sceneMode = 1; - scene->signal(); } + + // Signal the scene to change to the new scene + scene->_sceneMode = 1; + scene->signal(); } } @@ -327,13 +331,13 @@ void Scene50::postInit(SceneObjectList *OwnerList) { SceneExt::postInit(); BF_GLOBALS._interfaceY = 200; + BF_GLOBALS._uiElements._active = false; BF_GLOBALS._player.postInit(); BF_GLOBALS._player.setVisage(830); BF_GLOBALS._player.setStrip(3); BF_GLOBALS._player.setPosition(Common::Point(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)); BF_GLOBALS._player.hide(); - BF_GLOBALS._player.enableControl(); - BF_GLOBALS._player._uiEnabled = false; + BF_GLOBALS._player.disableControl(); BF_GLOBALS._scrollFollower = NULL; _text._color1 = 19; @@ -353,8 +357,8 @@ void Scene50::postInit(SceneObjectList *OwnerList) { _location6.set(Rect(242, 131, 264, 144), 440, ALLEY_CAT, 64); _location5.set(Rect(383, 57, 402, 70), 380, CITY_HALL_JAIL, 32); _location7.set(Rect(128, 32, 143, 42), 800, JAMISON_RYAN, 128); - _location9.set(Rect(349, 125, 359, 132), - (BF_GLOBALS._bikiniHutState == 13) || (BF_GLOBALS._bikiniHutState == 14) ? 551 : 550, + _location9.set(Rect(349, 125, 359, 132), + (BF_GLOBALS._bookmark == bInspectionDone) || (BF_GLOBALS._bookmark == bCalledToDrunkStop) ? 551 : 550, BIKINI_HUT, 16); _item.setBounds(Rect(0, 0, SCREEN_WIDTH * 2, SCREEN_HEIGHT)); @@ -415,43 +419,43 @@ void Scene50::postInit(SceneObjectList *OwnerList) { void Scene50::remove() { // Blank out the screen - BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); + clearScreen(); SceneExt::remove(); - BF_GLOBALS._v4E238 = 1; + BF_GLOBALS._uiElements._active = true; } void Scene50::signal() { if (_sceneMode == 1) { // Destination selected - if ((BF_GLOBALS._v4CEF2 == 551) && (_sceneNumber != BF_GLOBALS._v4CEF2)) { - BF_GLOBALS.setFlag(109); - BF_GLOBALS.setFlag(115); - BF_GLOBALS.setFlag(121); - BF_GLOBALS.setFlag(127); - BF_GLOBALS.setFlag(133); + if ((BF_GLOBALS._driveFromScene == 551) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { + BF_GLOBALS.clearFlag(f1015Drunk); + BF_GLOBALS.clearFlag(f1027Drunk); + BF_GLOBALS.clearFlag(f1035Drunk); + BF_GLOBALS.clearFlag(f1097Drunk); + BF_GLOBALS.clearFlag(f1098Drunk); } - if ((BF_GLOBALS._v4CEF2 == 410) && (_sceneNumber != BF_GLOBALS._v4CEF2)) { + if ((BF_GLOBALS._driveFromScene == 410) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { BF_GLOBALS.setFlag(125); } - if ((BF_GLOBALS._v4CEF2 == 340) && (_sceneNumber != BF_GLOBALS._v4CEF2)) { + if ((BF_GLOBALS._driveFromScene == 340) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { BF_GLOBALS.setFlag(123); } - if ((BF_GLOBALS._v4CEF2 == 380) && (_sceneNumber != BF_GLOBALS._v4CEF2)) { - if (BF_GLOBALS._bikiniHutState >= 4) - BF_GLOBALS.setFlag(129); - if (BF_GLOBALS._bikiniHutState >= 6) - BF_GLOBALS.setFlag(131); - if (BF_GLOBALS._bikiniHutState == 3) { - BF_GLOBALS._v4CEA8 = 19; + if ((BF_GLOBALS._driveFromScene == 380) && (_sceneNumber != BF_GLOBALS._driveFromScene)) { + if (BF_GLOBALS._bookmark >= bLauraToParamedics) + BF_GLOBALS.setFlag(f1098Marina); + if (BF_GLOBALS._bookmark >= bStoppedFrankie) + BF_GLOBALS.setFlag(f1098Frankie); + if (BF_GLOBALS._bookmark == bArrestedGreen) { + BF_GLOBALS._deathReason = 19; _sceneNumber = 666; } } - if ((_sceneNumber == 551) && BF_GLOBALS.getFlag(147)) + if ((_sceneNumber == 551) && BF_GLOBALS.getFlag(fHasDrivenFromDrunk)) _sceneNumber = 550; BF_GLOBALS._sound1.fadeOut2(NULL); @@ -461,6 +465,7 @@ void Scene50::signal() { // Initial delay complete, time to switch to interactive mode _text.remove(); BF_GLOBALS._player.enableControl(); + BF_GLOBALS._events.setCursor(CURSOR_WALK); _sceneMode = 0; _field380 = 0; } @@ -496,6 +501,634 @@ void Scene50::process(Event &event) { } } +/*-------------------------------------------------------------------------- + * Scene 60 - Motorcycle + * + *--------------------------------------------------------------------------*/ + +bool Scene60::Ignition::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(60, 15); + break; + default: + switch (BF_GLOBALS._dayNumber) { + case 1: + if (BF_GLOBALS.getFlag(onDuty) && check1()) + return true; + break; + case 2: + if (BF_GLOBALS.getFlag(onDuty) && check2()) + return true; + } + + BF_GLOBALS._sound1.play(BF_GLOBALS.getFlag(fWithLyle) ? 80 : 31); + BF_GLOBALS._sound1.holdAt(1); + scene->fadeOut(); + BF_GLOBALS._sceneManager.changeScene(50); + break; + } + + return true; +} + +bool Scene60::Ignition::check1() { + if (BF_GLOBALS._bookmark >= bStoppedFrankie) { + BF_GLOBALS._v5098C |= 1; + return false; + } else { + if ((BF_GLOBALS._bookmark == bBookedGreen) && BF_GLOBALS.getFlag(fArrivedAtGangStop)) { + BF_GLOBALS.set2Flags(f1035Frankie); + BF_GLOBALS._sceneManager.changeScene(410); + } + + if (BF_GLOBALS._bookmark >= bLauraToParamedics) { + if (BF_GLOBALS.getFlag(fLeftTraceIn910)) { + if (BF_GLOBALS._bookmark < bBookedGreen) { + BF_GLOBALS._bookmark = bBookedGreen; + BF_GLOBALS.clearFlag(fCalledBackup); + BF_GLOBALS.set2Flags(f1035Frankie); + return false; + } else if (BF_GLOBALS._bookmark == bBookedGreen) { + if (!BF_GLOBALS.getFlag(fCalledBackup)) + BF_GLOBALS.setFlag(f1035Frankie); + + BF_GLOBALS._sceneManager.changeScene(410); + return true; + } + } + + } else if (BF_GLOBALS._bookmark < bStartOfGame) { + // Should never reach here + } else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) { + if ((BF_GLOBALS._v5098C >> 1) & 1) + BF_GLOBALS.setFlag(fLateToMarina); + else + BF_GLOBALS._v5098C |= 2; + } else { + int v = (((BF_GLOBALS._v5098C >> 2) & 15) + 1) & 15; + BF_GLOBALS._v5098C = (BF_GLOBALS._v5098C & 0xC3) | (v << 2); + + if ((v != 1) && (v != 2)) { + BF_GLOBALS._deathReason = 19; + BF_GLOBALS._sceneManager.changeScene(666); + return true; + } + } + } + + BF_GLOBALS._v5098C |= 1; + return false; +} + +bool Scene60::Ignition::check2() { + switch (BF_GLOBALS._bookmark) { + case bInspectionDone: + if (BF_GLOBALS._v5098D & 1) { + BF_GLOBALS.setFlag(fLateToDrunkStop); + } else { + BF_GLOBALS._v5098D |= 1; + } + break; + case bCalledToDrunkStop: + BF_GLOBALS.setFlag(fHasDrivenFromDrunk); + break; + default: + break; + } + + BF_GLOBALS._v5098C |= 0x80; + return false; +} + +/*--------------------------------------------------------------------------*/ + +bool Scene60::Item3::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + scene->fadeOut(); + BF_GLOBALS._sceneManager.changeScene(scene->_newScene); + return true; +} + +bool Scene60::Radio::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch(action) { + case CURSOR_LOOK: + SceneItem::display2(60, 0); + break; + case CURSOR_USE: + case CURSOR_TALK: + scene->_sound.play(32); + scene->setAction(&scene->_action1); + break; + default: + SceneItem::display2(60, 1); + break; + } + return true; +} + +bool Scene60::Compartment::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch(action) { + case CURSOR_LOOK: + SceneItem::display2(60, 8); + break; + case CURSOR_USE: + if ((BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 1) && + (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 1)) { + SceneItem::display2(60, 9); + } + break; + case CURSOR_TALK: + SceneItem::display2(60, 10); + break; + case INV_TICKET_BOOK: + SceneItem::display2(60, 11); + scene->_ticketBook.show(); + BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60); + BF_GLOBALS._events.setCursor(CURSOR_USE); + BF_GLOBALS._sceneItems.addBefore(&scene->_radio, &scene->_ticketBook); + break; + case INV_MIRANDA_CARD: + SceneItem::display2(60, 12); + scene->_mirandaCard.show(); + BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60); + BF_GLOBALS._events.setCursor(CURSOR_USE); + BF_GLOBALS._sceneItems.addAfter(&scene->_compartmentDoor, &scene->_mirandaCard); + break; + default: + return NamedHotspot::startAction(action, event); + } + + return true; +} + +/*--------------------------------------------------------------------------*/ + +bool Scene60::MirandaCard::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(60, 5); + return true; + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 60) { + SceneItem::display2(60, 6); + BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 1); + if (!BF_GLOBALS.getFlag(fGotPointsForTktBook)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fGotPointsForTktBook); + } + + scene->_mirandaCard.hide(); + BF_GLOBALS._sceneItems.remove(&scene->_mirandaCard); + } + return true; + case CURSOR_TALK: + SceneItem::display2(60, 7); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene60::TicketBook::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(60, 2); + return true; + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 60) { + scene->_ticketBook.hide(); + BF_GLOBALS._sceneItems.remove(&scene->_ticketBook); + SceneItem::display2(60, 3); + BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 1); + if (!BF_GLOBALS.getFlag(fShotNicoIn910)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fShotNicoIn910); + } + } + return true; + case CURSOR_TALK: + SceneItem::display2(60, 4); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene60::CompartmentDoor::startAction(CursorType action, Event &event) { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(60, 13); + return true; + case CURSOR_USE: + if (_flag) { + _flag = false; + BF_GLOBALS._player.disableControl(); + Common::Point pt(308, 165); + NpcMover *mover = new NpcMover(); + addMover(mover, &pt, scene); + } else { + _flag = true; + BF_GLOBALS._player.disableControl(); + Common::Point pt(288, 165); + NpcMover *mover = new NpcMover(); + addMover(mover, &pt, scene); + } + return true; + case CURSOR_TALK: + SceneItem::display2(60, 14); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene60::Action1::signal() { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(2); + break; + case 1: + scene->_stripManager.start(634, this); + break; + case 2: + _state = useRadio(); + setDelay(4); + break; + case 3: + switch (_state) { + case 1: + if (BF_GLOBALS.removeFlag(fCan1004Marina)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 606; + } else if (BF_GLOBALS.removeFlag(fCan1004Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 606; + } else { + _state = 611; + } + break; + case 2: + _state = 612; + break; + case 3: + if (BF_GLOBALS.removeFlag(f1015Marina)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 613; + } else if (BF_GLOBALS.removeFlag(f1015Frankie)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 614; + } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 615; + } else { + _state = 616; + } + break; + case 4: + if (BF_GLOBALS.removeFlag(f1027Marina)) { + BF_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 617; + } else if (BF_GLOBALS.removeFlag(f1027Frankie)) { + BF_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 618; + } else if (BF_GLOBALS.removeFlag(f1015Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 619; + } else { + _state = 620; + } + break; + case 5: + if (BF_GLOBALS.removeFlag(f1035Marina)) { + BF_GLOBALS.setFlag(fCalledBackup); + BF_GLOBALS._uiElements.addScore(50); + _state = 621; + } else if (BF_GLOBALS.removeFlag(f1035Frankie)) { + BF_GLOBALS.setFlag(fCalledBackup); + BF_GLOBALS._uiElements.addScore(50); + _actionIndex = 5; + _state = 622; + } else if (BF_GLOBALS.removeFlag(f1035Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 623; + } else { + _state = 624; + } + break; + case 6: + if (BF_GLOBALS.removeFlag(f1097Marina)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 625; + } else if (BF_GLOBALS.removeFlag(f1097Frankie)) { + BF_GLOBALS._uiElements.addScore(10); + _actionIndex = 5; + _state = 626; + } else if (BF_GLOBALS.removeFlag(f1097Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 627; + } else { + _state = 628; + } + break; + case 7: + if (BF_GLOBALS.removeFlag(f1098Marina)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 629; + } else if (BF_GLOBALS.removeFlag(f1098Frankie)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 630; + } else if (BF_GLOBALS.removeFlag(f1098Drunk)) { + BF_GLOBALS._uiElements.addScore(10); + _state = 631; + } else { + _state = 632; + } + break; + case 0: + default: + _state = 610; + break; + } + + scene->_stripManager.start(_state, this); + break; + case 4: + remove(); + case 5: + setDelay(120); + break; + case 6: + _actionIndex = 4; + scene->_stripManager.start(633, this); + break; + } +} + +int Scene60::Action1::useRadio() { + return RadioConvDialog::show(); +} + +void Scene60::Action2::signal() { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + scene->_sound.play(32); + setDelay(2); + break; + case 1: + BF_GLOBALS._bookmark = bStartOfGame; + BF_GLOBALS.set2Flags(f1035Marina); + scene->_stripManager.start(60, this); + break; + case 2: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene60::Action3::signal() { + Scene60 *scene = (Scene60 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + scene->_sound.play(32); + setDelay(2); + break; + case 1: + BF_GLOBALS._bookmark = bInspectionDone; + BF_GLOBALS.set2Flags(f1035Drunk); + BF_GLOBALS.setFlag(fCan1004Drunk); + scene->_stripManager.start(71, this); + break; + case 2: + scene->_field1222 = true; + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene60::Scene60(): SceneExt() { + _newScene = 0; + _sceneNumber = 0; + _visage = 0; + _cursorId = CURSOR_NONE; + _field1222 = false; +} + +void Scene60::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_newScene); + s.syncAsSint16LE(_sceneNumber); + s.syncAsSint16LE(_visage); + s.syncAsSint16LE(_cursorId); + s.syncAsSint16LE(_field1222); +} + +void Scene60::postInit(SceneObjectList *OwnerList) { + _newScene = BF_GLOBALS._driveFromScene = BF_GLOBALS._sceneManager._previousScene; + + // Set up which scene background to use + switch (_newScene) { + case 300: + _sceneNumber = 1301; + break; + case 380: + _sceneNumber = 1380; + break; + case 410: + _sceneNumber = 1410; + break; + case 551: + _sceneNumber = 1550; + break; + case 550: + _sceneNumber = 1555; + break; + case 580: + _sceneNumber = 1580; + break; + case 800: + _sceneNumber = 1810; + break; + default: + _sceneNumber = 60; + break; + } + + if (_sceneNumber == 1550) { + if (BF_GLOBALS.getFlag(fHasDrivenFromDrunk)) + _sceneNumber = 1555; + else { + _object1.postInit(); + _object1.setVisage(1550); + _object1.animate(ANIM_MODE_2); + _object1.setPosition(Common::Point(158, 18)); + } + } + + loadScene(_sceneNumber); + + if ((_sceneNumber == 1810) && (BF_GLOBALS._dayNumber > 1) && + (BF_GLOBALS._dayNumber < 5) && !BF_GLOBALS.getFlag(fWithLyle) && + ((BF_GLOBALS._dayNumber != 4) && (BF_GLOBALS._bookmark >= bEndDayThree))) { + _car.setup(1810, 1, 1, 164, 131, 1); + } + + if ((_sceneNumber == 1410) && (BF_GLOBALS._bookmark == bBookedGreen) && + !BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + _object1.postInit(); + _object1.setVisage(410); + _object1.setStrip(6); + _object1.setPosition(Common::Point(135, 47)); + } + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _visage = 62; + _ignition._sceneRegionId = 22; + } else if (BF_GLOBALS.getFlag(onDuty)) { + _visage = 63; + _ignition._sceneRegionId = 20; + } else { + _visage = 61; + _ignition._sceneRegionId = 28; + } + _dashboard.setup(_visage, 1, 1, 160, 168, 100); + _cursorId = CURSOR_USE; + + if (_visage == 63) { + _compartmentDoor.postInit(); + _compartmentDoor.setVisage(60); + _compartmentDoor.setStrip(1); + _compartmentDoor.setFrame(1); + _compartmentDoor.setPosition(Common::Point(288, 165)); + _compartmentDoor.setPriority(250); + _compartmentDoor._flag = true; + BF_GLOBALS._sceneItems.push_back(&_compartmentDoor); + + _mirandaCard.postInit(); + _mirandaCard.setVisage(60); + _mirandaCard.setStrip(2); + _mirandaCard.setFrame(2); + _mirandaCard.setPosition(Common::Point(280, 160)); + + if (BF_INVENTORY.getObjectScene(INV_MIRANDA_CARD) == 60) { + _mirandaCard.show(); + BF_GLOBALS._sceneItems.push_back(&_mirandaCard); + } else { + _mirandaCard.hide(); + } + + _ticketBook.postInit(); + _ticketBook.setVisage(60); + _ticketBook.setStrip(2); + _ticketBook.setFrame(1); + _ticketBook.setPosition(Common::Point(289, 161)); + + if (BF_INVENTORY.getObjectScene(INV_TICKET_BOOK) == 60) { + _ticketBook.show(); + BF_GLOBALS._sceneItems.push_back(&_ticketBook); + } else { + _ticketBook.hide(); + } + } + + _item3._sceneRegionId = 7; + _radio._sceneRegionId = 12; + _compartment._sceneRegionId = 14; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeRadioSpeaker); + + if (BF_GLOBALS.getFlag(onDuty) && !BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._sceneItems.push_back(&_radio); + BF_GLOBALS._sceneItems.push_back(&_compartment); + } + + BF_GLOBALS._sceneItems.push_back(&_ignition); + BF_GLOBALS._sceneItems.push_back(&_item3); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._events.setCursor(CURSOR_USE); + + switch (BF_GLOBALS._dayNumber) { + case 1: + if (BF_GLOBALS.getFlag(onDuty) && (BF_GLOBALS._v5098C & 1) && + (BF_GLOBALS._bookmark < bStartOfGame) && (BF_GLOBALS._sceneManager._previousScene != 342)) { + setAction(&_action2); + if (BF_GLOBALS._sceneManager._previousScene == 342) + _newScene = 340; + } + break; + case 2: + if (BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._v5098C >> 7) & 1) && + (BF_GLOBALS._sceneManager._previousScene != 550) && + (BF_GLOBALS._bookmark < bInspectionDone)) { + setAction(&_action3); + } + } +} + +void Scene60::remove() { + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._events.setCursor(_cursorId); + + if (_cursorId == CURSOR_EXIT) + BF_GLOBALS._events.setCursor(CURSOR_USE); +} + +void Scene60::signal() { + ++_sceneMode; + BF_GLOBALS._player.enableControl(); +} + +void Scene60::dispatch() { + SceneExt::dispatch(); + + int idx = BF_GLOBALS._sceneRegions.indexOf(Common::Point( + BF_GLOBALS._sceneManager._scene->_sceneBounds.left + BF_GLOBALS._events._mousePos.x, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + BF_GLOBALS._events._mousePos.y)); + + if (idx == _item3._sceneRegionId) { + if (BF_GLOBALS._events.getCursor() != CURSOR_EXIT) { + _cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(CURSOR_EXIT); + } + } else { + if (BF_GLOBALS._events.getCursor() == CURSOR_EXIT) { + BF_GLOBALS._events.setCursor(_cursorId); + } + } +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes0.h b/engines/tsage/blue_force/blueforce_scenes0.h index 5c98184ed8..103e5f0a4c 100644 --- a/engines/tsage/blue_force/blueforce_scenes0.h +++ b/engines/tsage/blue_force/blueforce_scenes0.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" @@ -90,12 +91,98 @@ public: public: Scene50(); virtual Common::String getClassName() { return "Scene50"; } - virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void remove(); virtual void signal(); virtual void process(Event &event); }; +class Scene60 : public SceneExt { + /* Items */ + class Ignition: public NamedHotspot { + private: + bool check1(); + bool check2(); + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Radio: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Compartment: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class MirandaCard: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class TicketBook: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CompartmentDoor: public NamedObject { + public: + bool _flag; + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public ActionExt { + private: + int useRadio(); + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; + class Action3: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + Action3 _action3; + NamedObject _object1; + MirandaCard _mirandaCard; + TicketBook _ticketBook; + CompartmentDoor _compartmentDoor; + SceneObject _dashboard; + BackgroundSceneObject _car; + NamedHotspot _item1; + Ignition _ignition; + Item3 _item3; + Radio _radio; + Compartment _compartment; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeRadio _jakeRadioSpeaker; + ASound _sound; + int _newScene; + int _sceneNumber; + int _visage; + CursorType _cursorId; + bool _field1222; + + Scene60(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void dispatch(); +}; + + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes1.cpp b/engines/tsage/blue_force/blueforce_scenes1.cpp index 650b63c24b..c953584665 100644 --- a/engines/tsage/blue_force/blueforce_scenes1.cpp +++ b/engines/tsage/blue_force/blueforce_scenes1.cpp @@ -42,7 +42,7 @@ void Scene100::Text::dispatch() { // Keep the second text string below the first one Scene100 *scene = (Scene100 *)BF_GLOBALS._sceneManager._scene; Common::Point &pt = scene->_action1._sceneText1._position; - scene->_action1._sceneText2.setPosition(Common::Point(pt.x, + scene->_action1._sceneText2.setPosition(Common::Point(pt.x, pt.y + scene->_action1._textHeight)); } @@ -56,14 +56,14 @@ void Scene100::Action1::signal() { setDelay(6); break; case 1: { - Common::String msg1 = _resourceManager->getMessage(100, _state++); + Common::String msg1 = g_resourceManager->getMessage(100, _state++); if (msg1.compareTo("LASTCREDIT")) { - Common::String msg2 = _resourceManager->getMessage(100, _state++); + Common::String msg2 = g_resourceManager->getMessage(100, _state++); setTextStrings(msg1, msg2, this); --_actionIndex; } else { setTextStrings(BF_NAME, BF_ALL_RIGHTS_RESERVED, this); - + Common::Point pt(_sceneText1._position.x, 80); NpcMover *mover = new NpcMover(); _sceneText1.addMover(mover, &pt, this); @@ -111,17 +111,17 @@ void Scene100::Action1::setTextStrings(const Common::String &msg1, const Common: _sceneText2.setPosition(Common::Point((SCREEN_WIDTH - textSurface.getBounds().width()) / 2, 202)); _sceneText2._moveRate = 30; _sceneText2._moveDiff.y = 1; - + _textHeight = textSurface.getBounds().height(); int yp = -(_textHeight * 2); - Common::Point pt(_sceneText1._position.x, yp); + Common::Point pt(_sceneText1._position.x, yp); NpcMover *mover = new NpcMover(); - _sceneText1.addMover(mover, &pt, action); + _sceneText1.addMover(mover, &pt, action); } void Scene100::Action2::signal() { - Scene100 *scene = (Scene100 *)_globals->_sceneManager._scene; + Scene100 *scene = (Scene100 *)g_globals->_sceneManager._scene; static byte black[3] = {0, 0, 0}; switch (_actionIndex++) { @@ -139,7 +139,7 @@ void Scene100::Action2::signal() { ConfMan.flushToDisk(); } else { // Prompt user for whether to start play or watch introduction - _globals->_player.enableControl(); + g_globals->_player.enableControl(); if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { // Signal to start the game @@ -150,7 +150,7 @@ void Scene100::Action2::signal() { } // At this point the introduction needs to start - _globals->_scenePalette.addFader(black, 1, 2, this); + g_globals->_scenePalette.addFader(black, 1, 2, this); break; } case 3: @@ -166,24 +166,29 @@ Scene100::Scene100(): SceneExt() { } void Scene100::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + if (BF_GLOBALS._dayNumber < 6) { + // Title + loadScene(100); + } else { + // Credits + loadScene(101); + } BF_GLOBALS._scenePalette.loadPalette(2); BF_GLOBALS._v51C44 = 1; - Scene::postInit(); BF_GLOBALS._interfaceY = SCREEN_HEIGHT; - _globals->_player.enableControl(); - _globals->_player.hide(); - _globals->_player.disableControl(); + g_globals->_player.postInit(); + g_globals->_player.hide(); + g_globals->_player.disableControl(); _index = 109; - if (BF_GLOBALS._v4CEA2 < 6) { + if (BF_GLOBALS._dayNumber < 6) { // Title - loadScene(100); BF_GLOBALS._sound1.play(2); setAction(&_action2, this); } else { // Credits - loadScene(101); BF_GLOBALS._sound1.play(118); setAction(&_action1, this); } @@ -191,7 +196,7 @@ void Scene100::postInit(SceneObjectList *OwnerList) { void Scene100::signal() { ++_sceneMode; - if (BF_GLOBALS._v4CEA2 < 6) { + if (BF_GLOBALS._dayNumber < 6) { BF_GLOBALS._scenePalette.clearListeners(); BF_GLOBALS._scenePalette.loadPalette(100); BF_GLOBALS._sceneManager.changeScene(_index); @@ -346,11 +351,11 @@ void Scene109::Text::dispatch() { /*--------------------------------------------------------------------------*/ -Scene109::Scene109(): GameScene() { +Scene109::Scene109(): PalettedScene() { } void Scene109::postInit(SceneObjectList *OwnerList) { - GameScene::postInit(OwnerList); + PalettedScene::postInit(OwnerList); loadScene(999); _protaginist2.postInit(); @@ -427,6 +432,281 @@ void Scene109::signal() { } } +/*-------------------------------------------------------------------------- + * Scene 190 - Front of Police Station + * + *--------------------------------------------------------------------------*/ + +bool Scene190::Object4::startAction(CursorType action, Event &event) { + Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 13; + Common::Point pt(62, 96); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; + } + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene190::Item1::startAction(CursorType action, Event &event) { + Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + scene->setAction(&scene->_action1); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene190::Item2::startAction(CursorType action, Event &event) { + Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + scene->_stripManager.start(1900, scene); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene190::Exit::startAction(CursorType action, Event &event) { + Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; + + Common::Point pt(316, 91); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene190::Action1::signal() { + Scene190 *scene = (Scene190 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(2); + break; + case 1: { + ADD_MOVER(BF_GLOBALS._player, 165, 91); + break; + } + case 2: + scene->_sound.play(82); + scene->_object2.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); + break; + case 5: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(315); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene190::Scene190(): SceneExt() { + _fieldB52 = true; + _cursorVisage.setVisage(1, 8); +} + +void Scene190::postInit(SceneObjectList *OwnerList) { + BF_GLOBALS._dialogCenter.y = 100; + if ((BF_GLOBALS._sceneManager._previousScene == 100) || + (BF_GLOBALS._sceneManager._previousScene == 20)) { +// clearScreen(); + } + if (BF_GLOBALS._dayNumber == 0) + // If at start of game, change to first day + BF_GLOBALS._dayNumber = 1; + + // Load the scene data + loadScene(190); + BF_GLOBALS._scenePalette.loadPalette(2); + + _stripManager.addSpeaker(&_speaker); + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + + // Initialise objects + _object2.postInit(); + _object2.setVisage(190); + _object2.setStrip(1); + _object2.setPosition(Common::Point(179, 88)); + + _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); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + 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); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 300: { + _sceneMode = 12; + BF_GLOBALS._player.setPosition(Common::Point(316, 91)); + ADD_MOVER(BF_GLOBALS._player, 305, 91); + break; + } + case 315: + _sceneMode = 1901; + setAction(&_sequenceManager, this, 1901, &BF_GLOBALS._player, &_object2, NULL); + break; + case 50: + case 60: + default: + _fieldB52 = false; + BF_GLOBALS._player.setPosition(Common::Point(62, 96)); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.enableControl(); + break; + } + } else { + BF_GLOBALS._player.setVisage(BF_GLOBALS._player._visage); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 300: { + if (!BF_GLOBALS.getFlag(onBike)) { + BF_GLOBALS._player._moveDiff = Common::Point(3, 1); + _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 11 : 12; + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1304 : 303); + BF_GLOBALS._player.setPosition(Common::Point(316, 91)); + ADD_MOVER(BF_GLOBALS._player, 305, 91); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 193 : 191; + setAction(&_sequenceManager, this, 193, &BF_GLOBALS._player, NULL); + } + break; + } + 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); + break; + case 50: + case 60: + default: + BF_GLOBALS.setFlag(onBike); + BF_GLOBALS._player.disableControl(); + _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 192 : 190; + setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL); + break; + } + } + + if (BF_GLOBALS.getFlag(onBike)) { + BF_GLOBALS._sound1.play(BF_GLOBALS.getFlag(onDuty) ? 37 : 29); + } else if (BF_GLOBALS._sceneManager._previousScene != 300) { + BF_GLOBALS._sound1.play(33); + } + + _exit.setDetails(Rect(310, 50, 320, 125), 190, -1, -1, -1, 1, NULL); + _item2.setDetails(Rect(108, 1, 111, 94), 190, 7, 11, 18, 1, NULL); + _item4.setDetails(2, 190, 5, 10, 16, 1); + _item3.setDetails(1, 190, 4, 10, 15, 1); + _item8.setDetails(6, 190, 20, 21, 22, 1); + _item1.setDetails(7, 190, 1, 10, -1, 1); + _item7.setDetails(5, 190, 0, 10, 12, 1); + _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); +} + +void Scene190::signal() { + switch (_sceneMode) { + case 10: + if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne)) + BF_GLOBALS._sound1.changeSound(49); + BF_GLOBALS._sceneManager.changeScene(300); + break; + case 11: + case 12: + case 1900: + case 1901: + BF_GLOBALS._player.enableControl(); + _fieldB52 = false; + break; + case 13: + case 191: + case 193: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 190: + case 192: + BF_GLOBALS._sceneManager.changeScene(300); + break; + case 0: + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene190::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(3); + 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 Scene190::dispatch() { + SceneExt::dispatch(); + + if (!_action && !_fieldB52 && (BF_GLOBALS._player._position.x >= 310) + && !BF_GLOBALS.getFlag(onBike)) { + // Handle walking off to the right side of the screen + BF_GLOBALS._player.disableControl(); + _fieldB52 = true; + _sceneMode = 10; + + ADD_MOVER(BF_GLOBALS._player, 330, BF_GLOBALS._player._position.y); + } +} + } // 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 2b07e2b48f..3fd38e35ca 100644 --- a/engines/tsage/blue_force/blueforce_scenes1.h +++ b/engines/tsage/blue_force/blueforce_scenes1.h @@ -79,7 +79,7 @@ public: virtual void signal(); }; -class Scene109: public GameScene { +class Scene109: public PalettedScene { /* Actions */ class Action1: public Action { public: @@ -124,6 +124,58 @@ public: virtual void signal(); }; +class Scene190: public SceneExt { + /* Objects */ + class Object4: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + 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 Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + FollowerObject _object1; + NamedObject _object2, _object3; + Object4 _object4; + Item1 _item1; + Item2 _item2; + NamedHotspot _item3, _item4, _item5, _item6; + NamedHotspot _item7, _item8, _item9, _item10; + Exit _exit; + Action1 _action1; + ASoundExt _sound; + SpeakerGameText _speaker; + bool _fieldB52; + + Scene190(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + virtual void 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_scenes2.cpp b/engines/tsage/blue_force/blueforce_scenes2.cpp new file mode 100644 index 0000000000..7d66c7a52b --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes2.cpp @@ -0,0 +1,1720 @@ +/* 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/blue_force/blueforce_scenes2.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 200 - Credits - Motorcycle Training + * + *--------------------------------------------------------------------------*/ + +void Scene200::Action1::signal() { + Scene200 *scene = (Scene200 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + assert(owner); + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + _state = 0; + setDelay(30); + break; + case 2: + assert(_owner); + owner->animate(ANIM_MODE_5, this); + break; + case 3: + if (++_state < 2) { + scene->_action2.signal(); + owner->setFrame(1); + _actionIndex = 2; + } + setDelay(2); + break; + case 4: { + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1); + rot->setDelay(10); + + scene->setAction(&scene->_sequenceManager, this, 201, &scene->_object1, &scene->_object2, + &scene->_object3, &scene->_object4, &scene->_object5, &scene->_object6, NULL); + break; + } + case 5: + BF_GLOBALS._sceneManager.changeScene(210); + break; + default: + break; + } +} + +void Scene200::Action2::signal() { + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + assert(owner); + + switch (_actionIndex++) { + case 1: + owner->setPosition(owner->_position); + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setPosition(owner->_position); + owner->setFrame(1); + break; + default: + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +void Scene200::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(200); + setZoomPercents(0, 100, 200, 100); + BF_GLOBALS._sound1.play(3); + + _object10.postInit(); + _object10.setVisage(200); + _object10.setPosition(Common::Point(114, 102)); + _object10.setStrip(2); + _object10.setFrame(1); + _object10.changeZoom(100); + + _object1.postInit(); + _object1.hide(); + _object2.postInit(); + _object2.hide(); + _object3.postInit(); + _object3.hide(); + _object4.postInit(); + _object4.hide(); + _object5.postInit(); + _object5.hide(); + _object6.postInit(); + _object6.hide(); + + _object11.postInit(); + _object11.setVisage(200); + _object11.setPosition(Common::Point(96, 112), 1000); + _object11.setStrip(3); + _object11.setFrame(1); + _object11.changeZoom(100); + + _object10.setAction(&_action1); + _object11.setAction(&_action2); +} + +void Scene200::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 210 - Credits - Car Training + * + *--------------------------------------------------------------------------*/ + +void Scene210::Action1::signal() { + Scene210 *scene = (Scene210 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(_owner); + assert(owner); + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: { + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1); + rot->setDelay(10); + + scene->setAction(&scene->_sequenceManager, this, 210, &scene->_object10, &scene->_object11, + &scene->_object12, &scene->_object13, &scene->_object14, &scene->_object15, NULL); + break; + } + case 3: + BF_GLOBALS._sceneManager.changeScene(220); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene210::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(210); + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + + _object9.postInit(); + _object9.setVisage(210); + _object9.setPosition(Common::Point(146, 151)); + _object9.setStrip(1); + _object9.setFrame(1); + _object9.changeZoom(100); + _object9.setAction(&_action1); + + _object10.postInit(); + _object10.hide(); + _object11.postInit(); + _object11.hide(); + _object12.postInit(); + _object12.hide(); + _object13.postInit(); + _object13.hide(); + _object14.postInit(); + _object14.hide(); + _object15.postInit(); + _object15.hide(); +} + +void Scene210::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 220 - Credits - Martial Arts + * + *--------------------------------------------------------------------------*/ + +void Scene220::Action1::signal() { + Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + setDelay(30); + break; + case 2: + BF_GLOBALS._scenePalette.clearListeners(); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_object2.setVisage(221); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(178, 122)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 4: + BF_GLOBALS._scenePalette.loadPalette(2); + BF_GLOBALS._scenePalette.refresh(); + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + setDelay(5); + break; + case 5: + scene->_object1.remove(); + + scene->_object2.setVisage(222); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(164, 138)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 6: + scene->_object2.setVisage(223); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(164, 139)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 7: + scene->_object2.setVisage(230); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(168, 136)); + scene->_object2.animate(ANIM_MODE_4, 13, 1, this); + break; + case 8: + scene->_object2.animate(ANIM_MODE_5, this); + + scene->_object3.postInit(); + scene->_object3.setVisage(231); + scene->_object3.setPosition(Common::Point(65, 179)); + scene->_object3.setStrip(1); + scene->_object3.setFrame(1); + scene->_object3.changeZoom(100); + scene->_object3.setAction(&scene->_action2, this); + break; + case 9: + break; + case 10: + scene->_object2.setVisage(224); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(148, 143)); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 11: { + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1); + rot->setDelay(10); + + scene->setAction(&scene->_sequenceManager, this, 220, &scene->_object4, &scene->_object5, + &scene->_object6, &scene->_object7, &scene->_object8, &scene->_object9, NULL); + break; + } + case 12: + scene->_object2.setVisage(232); + scene->_object2.setFrame(1); + scene->_object2.setPosition(Common::Point(146, 143)); + scene->_object2._numFrames = 5; + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 13: + scene->_object2.setVisage(228); + scene->_object2.setFrame(1); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 14: + scene->_object2.setVisage(229); + scene->_object2.setFrame(1); + scene->_object2.animate(ANIM_MODE_5, this); + break; + case 15: + BF_GLOBALS._sceneManager.changeScene(225); + break; + default: + break; + } +} + +void Scene220::Action2::signal() { + Scene220 *scene = (Scene220 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_object3.setPosition(scene->_object3._position); + scene->_object3.animate(ANIM_MODE_5, this); + break; + case 1: + setDelay(50); + break; + case 2: + scene->_object3.remove(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene220::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(220); + + _object2.postInit(); + _object2.setVisage(220); + _object2.setPosition(Common::Point(182, 122)); + _object2.setStrip(1); + _object2.setFrame(1); + _object2.changeZoom(100); + + _object1.postInit(); + _object1.setVisage(220); + _object1.setPosition(Common::Point(164, 138)); + _object1.setStrip(2); + _object1.setFrame(1); + _object1.changeZoom(100); + + _object4.postInit(); + _object4.hide(); + _object5.postInit(); + _object5.hide(); + _object6.postInit(); + _object6.hide(); + _object7.postInit(); + _object7.hide(); + _object8.postInit(); + _object8.hide(); + _object9.postInit(); + _object9.hide(); + + _object2.setAction(&_action1); +} + +void Scene220::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 225 - Credits - Gun Training + * + *--------------------------------------------------------------------------*/ + +void Scene225::Action1::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + setDelay(30); + break; + case 1: + BF_GLOBALS._scenePalette.loadPalette(235); + BF_GLOBALS._scenePalette.refresh(); + setDelay(5); + break; + case 2: + owner->animate(ANIM_MODE_4, 7, 1, this); + break; + case 3: + scene->_object8.animate(ANIM_MODE_5, this); + owner->animate(ANIM_MODE_5, this); + break; + case 4: + scene->_object8.remove(); + break; + case 5: + scene->_action3.signal(); + break; + case 6: + owner->setPosition(Common::Point(owner->_position.x, owner->_position.y - 4)); + owner->setStrip(2); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 7: + scene->_action2.signal(); + break; + case 8: + owner->animate(ANIM_MODE_6, this); + break; + case 9: + owner->setPosition(Common::Point(owner->_position.x - 2, owner->_position.y - 1)); + owner->setStrip(3); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 10: { + owner->setPosition(Common::Point(owner->_position.x + 10, owner->_position.y + 4)); + owner->setStrip(4); + owner->setFrame(1); + owner->fixPriority(116); + owner->animate(ANIM_MODE_1, NULL); + + Common::Point destPos(138, 117); + NpcMover *mover = new NpcMover(); + owner->addMover(mover, &destPos, this); + break; + } + case 11: { + owner->setPosition(Common::Point(owner->_position.x - 12, owner->_position.y - 1)); + owner->setStrip(5); + owner->setFrame(1); + owner->_moveDiff.x = 8; + + Common::Point destPos(402, 116); + NpcMover *mover2 = new NpcMover(); + owner->addMover(mover2, &destPos, this); + + BF_GLOBALS._player.setPosition(Common::Point(owner->_position.x, 0)); + ADD_MOVER_NULL(BF_GLOBALS._player, 500, 0); + break; + } + case 12: + owner->setVisage(1227); + owner->setStrip(1); + owner->setFrame(1); + owner->animate(ANIM_MODE_5, this); + break; + case 13: + owner->setStrip(2); + owner->setFrame(4); + scene->_action4.signal(); + break; + case 14: + owner->animate(ANIM_MODE_6, this); + break; + case 15: + scene->_action6.signal(); + break; + case 16: + owner->animate(ANIM_MODE_4, 4, 1, this); + break; + case 17: + owner->setFrame(6); + owner->animate(ANIM_MODE_5, this); + break; + case 18: + scene->_action5.signal(); + break; + case 19: + owner->animate(ANIM_MODE_4, 4, -1, this); + break; + case 20: + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(64, 79, 1); + rot->setDelay(10); + rot = BF_GLOBALS._scenePalette.addRotation(96, 111, 1); + rot->setDelay(10); + + scene->setAction(&scene->_sequenceManager, this, 225, &scene->_object15, &scene->_object16, + &scene->_object17, &scene->_object18, &scene->_object19, &scene->_object20, NULL); + break; + case 21: + scene->_object21.hide(); + BF_GLOBALS._player._moveDiff.x = 5; + BF_GLOBALS._sceneManager.changeScene(265); + break; + default: + break; + } +} + +void Scene225::Action2::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setStrip(3); + owner->setFrame(2); + scene->_action1.signal(); + break; + default: + break; + } +} + +void Scene225::Action3::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setStrip(3); + owner->setFrame(1); + scene->_action1.signal(); + break; + default: + break; + } +} + +void Scene225::Action4::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setStrip(5); + owner->setFrame(4); + scene->_action1.signal(); + break; + default: + break; + } +} + +void Scene225::Action5::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setStrip(3); + owner->setFrame(6); + scene->_action1.signal(); + break; + default: + break; + } +} + +void Scene225::Action6::signal() { + Scene225 *scene = (Scene225 *)BF_GLOBALS._sceneManager._scene; + SceneObject *owner = static_cast<SceneObject *>(this->_owner); + + switch (_actionIndex++) { + case 0: + break; + case 1: + owner->animate(ANIM_MODE_5, this); + break; + case 2: + owner->setStrip(3); + owner->setFrame(3); + scene->_action1.signal(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene225::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(1225); + loadBackground(-320, 0); + + _object8.postInit(); + _object8.setVisage(1225); + _object8.setPosition(Common::Point(114, 119)); + _object8._frame = 1; + _object8.setStrip(2); + _object8.changeZoom(100); + + _object9.postInit(); + _object9.setVisage(1226); + _object9.setPosition(Common::Point(83, 128)); + _object9.setStrip(1); + _object9.changeZoom(100); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(83, 0)); + BF_GLOBALS._player.hide(); + + _object10.postInit(); + _object10.setVisage(1225); + _object10.setPosition(Common::Point(237, 29)); + _object10.setStrip(1); + _object10._frame = 1; + _object10.changeZoom(100); + _object10._numFrames = 2; + + _object11.postInit(); + _object11.setVisage(1225); + _object11.setPosition(Common::Point(290, 47)); + _object11.setStrip(1); + _object11._frame = 1; + _object11.changeZoom(100); + _object11._numFrames = 2; + + _object12.postInit(); + _object12.setVisage(1225); + _object12.setPosition(Common::Point(368, 35)); + _object12.setStrip(4); + _object12._frame = 1; + _object12.changeZoom(100); + _object12._numFrames = 2; + + _object13.postInit(); + _object13.setVisage(1225); + _object13.setPosition(Common::Point(416, 33)); + _object13.setStrip(1); + _object13._frame = 1; + _object13.changeZoom(100); + _object13._numFrames = 2; + + _object14.postInit(); + _object14.setVisage(1225); + _object14.setPosition(Common::Point(476, 30)); + _object14.setStrip(1); + _object14._frame = 1; + _object14.changeZoom(100); + _object14._numFrames = 2; + + _object21.postInit(); + _object21.setVisage(235); + _object21.setStrip(1); + _object21._frame = 1; + _object21.setPosition(Common::Point(498, 41)); + _object21.changeZoom(100); + _object21.hide(); + + _object15.postInit(); + _object15.hide(); + _object16.postInit(); + _object16.hide(); + _object17.postInit(); + _object17.hide(); + _object18.postInit(); + _object18.hide(); + _object19.postInit(); + _object19.hide(); + _object20.postInit(); + _object20.hide(); + + _object9.setAction(&_action1); + _object10.setAction(&_action2); + _object11.setAction(&_action3); + _object12.setAction(&_action4); + _object13.setAction(&_action5); + _object14.setAction(&_action6); +} + +void Scene225::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 265 - Graduation Article + * + *--------------------------------------------------------------------------*/ + +void Scene265::Action1::signal() { + switch (_actionIndex++) { + case 0: + BF_GLOBALS._scenePalette.loadPalette(2); + setDelay(30); + break; + case 1: + BF_GLOBALS._scenePalette.refresh(); + setDelay(240); + break; + case 2: + ADD_MOVER(BF_GLOBALS._player, 160, 280); + break; + case 3: + // Wait until sound finishes playing + if (BF_GLOBALS._sound1.isPlaying()) + _actionIndex = 3; + setDelay(1); + break; + case 4: + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._sceneManager.changeScene(190); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene265::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(265); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player.hide(); + setAction(&_action1); +} + +void Scene265::remove() { + clearScreen(); + remove(); +} + +/*-------------------------------------------------------------------------- + * Scene 270 - Living Room & Kitchen + * + *--------------------------------------------------------------------------*/ + +void Scene270::Action1::signal() { + Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene; + + scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene270::Lyle::startAction(CursorType action, Event &event) { + Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + scene->_field21A0 = 1; + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2706; + + if (scene->_field380 == 1) { + scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL); + } else { + scene->signal(); + } + return true; + case INV_CRATE1: + scene->_field21A0 = 2; + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2706; + + if (scene->_field380 == 1) { + scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, NULL); + } else { + scene->signal(); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene270::Grandma::startAction(CursorType action, Event &event) { + Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + switch (BF_GLOBALS._dayNumber) { + case 1: + // Day 1 + if (scene->_field380 == 1) { + scene->_stripManager.start((scene->_grandma._position.x == 157) ? 2712 : 2723, &BF_GLOBALS._stripProxy); + } else if (BF_GLOBALS._bookmark == bBookedFrankieEvidence) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2710; + scene->setAction(&scene->_sequenceManager1, scene, 2710, &BF_GLOBALS._player, &scene->_grandma, NULL); + } else if (BF_GLOBALS.getFlag(onDuty) || (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 2) || + (scene->_field386 != 0)) { + scene->_stripManager.start(2723, &BF_GLOBALS._stripProxy); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2715; + scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, &scene->_grandma, NULL); + } + return true; + case 3: + // Day 3 + if (scene->_field380 == 1) { + scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy); + } else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) { + scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2713; + scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_grandma, NULL); + } + return true; + default: + break; + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene270::Item::startAction(CursorType action, Event &event) { + Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && (scene->_field380 == 0)) { + BF_GLOBALS._player.disableControl(); + scene->_object2.postInit(); + scene->_object2.hide(); + scene->_sceneMode = 2705; + scene->setAction(&scene->_sequenceManager1, this, 2705, &BF_GLOBALS._player, &scene->_object2, NULL); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene270::Exit::startAction(CursorType action, Event &event) { + Scene270 *scene = (Scene270 *)BF_GLOBALS._sceneManager._scene; + + if (!_action && !scene->_field384 && !scene->_field386) { + if (scene->_field380 == 1) { + scene->_tempPos = Common::Point(320, 140); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 2706; + scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object2, NULL); + } else { + ADD_PLAYER_MOVER(320, 140); + } + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene270::Scene270(): SceneExt() { + _field380 = _field382 =_field384 = _field386 = 0; + _field219A = _tempPos.x = _tempPos.y = _field21A0 = 0; + _sceneMode = 0; +} + +void Scene270::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field380); + s.syncAsSint16LE(_field382); + s.syncAsSint16LE(_field384); + s.syncAsSint16LE(_field386); + s.syncAsSint16LE(_field219A); + s.syncAsSint16LE(_tempPos.x); + s.syncAsSint16LE(_tempPos.y); + s.syncAsSint16LE(_field21A0); +} + +void Scene270::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(270); + setZoomPercents(120, 90, 130, 100); + + if (BF_GLOBALS._sceneManager._previousScene != 560) + BF_GLOBALS._sound1.fadeSound(26); + + _exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2); + BF_INVENTORY.setObjectScene(INV_CRATE1, 1); + BF_GLOBALS._sceneManager._previousScene = 710; + } + + if (((BF_GLOBALS._bookmark >= bLauraToParamedics) && (BF_GLOBALS._dayNumber == 1) && + (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); + + _grandma.postInit(); + _grandma.setVisage(274); + _grandma.setPosition(Common::Point(157, 132)); + _grandma._numFrames = 5; + _grandma.animate(ANIM_MODE_2, NULL); + _grandma.fixPriority(129); + } + + if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) { + _grandma.postInit(); + } + + if (BF_GLOBALS._sceneManager._previousScene == 710) { + _skip.postInit(); + _laura.postInit(); + _lyle.postInit(); + _grandma.postInit(); + } + + _stripManager.addSpeaker(&_grandmaSpeaker); + _stripManager.addSpeaker(&_lyleSpeaker); + _stripManager.addSpeaker(&_jakeSpeaker); + _stripManager.addSpeaker(&_skipSpeaker); + _stripManager.addSpeaker(&_lauraSpeaker); + _stripManager.addSpeaker(&_gameTextSpeaker); + + _tv.postInit(); + _tv.setVisage(270); + _tv.setPosition(Common::Point(264, 74)); + _tv.setStrip(5); + _tv.fixPriority(132); + _tv._numFrames = 3; + _tv.setAction(&_action1); + + _fireplace.postInit(); + _fireplace.setVisage(270); + _fireplace.setStrip(2); + _fireplace.setPosition(Common::Point(302, 121)); + _fireplace.fixPriority(132); + _fireplace.animate(ANIM_MODE_2, NULL); + + _fridge.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL); + _object3.setDetails(270, 12, 13, 14, 1, NULL); + _laura.setDetails(270, 15, -1, -1, 1, NULL); + _skip.setDetails(270, 14, -1, -1, 1, NULL); + _lyle.setDetails(270, 34, 35, 36, 1, NULL); + _tv.setDetails(270, 3, 4, 5, 1, NULL); + _fireplace.setDetails(270, 6, 7, 8, 1, NULL); + + if ((BF_GLOBALS._sceneManager._previousScene == 710) && (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard)) { + _grandma.setDetails(270, 15, 16, 17, 1, NULL); + } else { + _grandma.setDetails(270, 40, 16, 17, 1, NULL); + } + + _afgan.setDetails(4, 270, 27, 28, 29, 1); + _couch.setDetails(1, 270, 18, 19, 20, 1); + _photos.setDetails(Rect(278, 50, 318, 72), 270, 21, 22, 23, 1, NULL); + _appliances.setDetails(3, 270, 24, 25, 26, 1); + _ivy.setDetails(2, 270, 30, 31, 32, 1); + _background.setDetails(Rect(0, 0, 320, 168), 270, 0, 1, 2, 1, NULL); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player._moveDiff.x = 8; + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 560: + if (BF_GLOBALS._bookmark == bTalkedToGrannyAboutSkipsCard) { + _field219A = 1; + BF_GLOBALS._player._moveDiff.x = 5; + _field386 = 0; + + _grandma.animate(ANIM_MODE_1, NULL); + setAction(&_sequenceManager1, NULL, 2720, &BF_GLOBALS._player, &_grandma, NULL); + BF_GLOBALS._bookmark = bLyleStoppedBy; + } else { + _sceneMode = 2700; + setAction(&_sequenceManager1, this, 2700, &BF_GLOBALS._player, NULL); + } + break; + case 690: + BF_GLOBALS._player.setPosition(Common::Point(-13, 162)); + _sceneMode = 2702; + setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL); + break; + case 710: + BF_GLOBALS._player._moveDiff.x = 6; + _sceneMode = 2717; + setAction(&_sequenceManager1, this, 2717, &BF_GLOBALS._player, &_laura, &_skip, &_lyle, &_grandma, NULL); + break; + default: + _sceneMode = 2701; + setAction(&_sequenceManager1, this, 2701, &BF_GLOBALS._player, NULL); + break; + } +} + +void Scene270::signal() { + switch (_sceneMode) { + case 10: + _sceneMode = 2702; + setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL); + break; + case 11: + BF_GLOBALS._player._strip = 8; + BF_GLOBALS._player._frame = 1; + + if (_field382) { + _sceneMode = 2719; + _stripManager.start(2720, this); + } else { + _field382 = 1; + _sceneMode = 13; + _stripManager.start(2718, this); + } + break; + case 12: + BF_GLOBALS._player._strip = 8; + BF_GLOBALS._player._frame = 1; + _sceneMode = 13; + _stripManager.start(2719, this); + break; + case 13: + case 2713: + case 2715: + BF_GLOBALS._player.enableControl(); + break; + case 2700: + _field219A = 1; + BF_GLOBALS._player._strip = 6; + BF_GLOBALS._player.enableControl(); + break; + case 2701: + BF_GLOBALS._player._strip = 2; + BF_GLOBALS._player.enableControl(); + _field219A = 1; + break; + case 2702: + BF_GLOBALS._player._strip = 1; + BF_GLOBALS._player.enableControl(); + _field219A = 1; + break; + case 2705: + _field380 = 1; + BF_GLOBALS._player.enableControl(); + break; + case 2706: + BF_GLOBALS._player.changeZoom(-1); + _object2.remove(); + _field380 = 0; + + switch (_field21A0) { + case 1: + _sceneMode = 11; + ADD_PLAYER_MOVER(192, 135); + break; + case 2: + if (BF_GLOBALS.getFlag(shownLyleCrate1Day1)) { + SceneItem::display2(270, 37); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(shownLyleCrate1Day1); + _sceneMode = 12; + ADD_PLAYER_MOVER(192, 135); + } + break; + default: + BF_GLOBALS._player.enableControl(); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, _tempPos.x, _tempPos.y); + break; + } + + _field21A0 = 0; + break; + case 2710: + BF_GLOBALS._bookmark = bEndOfWorkDayOne; + BF_GLOBALS._player.enableControl(); + break; + case 2711: + BF_GLOBALS._player.setPosition(Common::Point(150, 300)); + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(180); + BF_GLOBALS._bookmark = bLyleStoppedBy; + break; + case 2712: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(180); + break; + case 2714: + BF_GLOBALS._sceneManager.changeScene(560); + break; + case 2717: + _sceneMode = 2718; + _lyle.setFrame2(-1); + setAction(&_sequenceManager1, this, 2718, &BF_GLOBALS._player, &_laura, &_skip, + &_lyle, &_grandma, NULL); + break; + case 2718: + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.proc1(19); + + _field219A = 1; + BF_GLOBALS._bookmark = bTalkedToGrannyAboutSkipsCard; + + _grandma.setStrip(8); + _grandma._frame = 5; + _field384 = 1; + _field384 = 1; + + BF_GLOBALS._player._moveDiff.x = 8; + BF_GLOBALS._player.enableControl(); + break; + case 2719: + _sceneMode = 13; + _field384 = 0; + BF_GLOBALS._player._moveDiff.x = 6; + + _lyle.setFrame2(-1); + setAction(&_sequenceManager1, this, 2719, &BF_GLOBALS._player, &_lyle, &_grandma, NULL); + break; + default: + break; + } +} + +void Scene270::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (_field380 == 1) && !_action) { + _tempPos = event.mousePos; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2706; + setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object2, NULL); + event.handled = true; + } + + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1)) && + !_field384 && !_field386) { + // 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 Scene270::dispatch() { + if (_field384) { + _lyle.updateAngle(BF_GLOBALS._player._position); + + if (_lyle._angle < 110) + _lyle.setFrame2(4); + else if (_lyle._angle < 180) + _lyle.setFrame2(3); + else if (_lyle._angle < 250) + _lyle.setFrame2(2); + else + _lyle.setFrame2(1); + } + + if (_field386) { + if (BF_GLOBALS._player._position.x > 290) { + _grandma.setFrame(6); + } else if (BF_GLOBALS._player._position.x > 274) { + _grandma.setFrame(5); + } else if (BF_GLOBALS._player._position.x > 258) { + _grandma.setFrame(4); + } else if (BF_GLOBALS._player._position.x > 242) { + _grandma.setFrame(3); + } else if (BF_GLOBALS._player._position.x > 226) { + _grandma.setFrame(2); + } else if (BF_GLOBALS._player._position.x > 210) { + if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame > 1)) + _grandma.animate(ANIM_MODE_6, NULL); + } else { + if ((_grandma._animateMode == ANIM_MODE_NONE) && (_grandma._frame < 3)) + _grandma.animate(ANIM_MODE_4, 3, 1, NULL); + } + } + + if (!_action && _field219A) { + if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 125)) { + _field219A = 0; + BF_GLOBALS._player.disableControl(); + if (!_field384) { + BF_GLOBALS._sceneManager.changeScene(560); + } else { + BF_GLOBALS._player.addMover(NULL); + SceneItem::display2(270, 38); + _sceneMode = 2700; + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y + 15); + } + } + + if (BF_GLOBALS._player._position.x <= 20) { + _field219A = 0; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player._frame = 1; + + if (BF_GLOBALS._sceneObjects->contains(&_grandma)) { + _sceneMode = 10; + _stripManager.start(2711, this); + } else { + SceneItem::display2(270, 33); + _sceneMode = 2702; + setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL); + } + } + + if (BF_GLOBALS._player._position.x > 310) { + _field219A = 0; + BF_GLOBALS._player.disableControl(); + if (!_field384 && !_field386) { + _sceneMode = 2712; + setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player._strip = 2; + BF_GLOBALS._player._frame = 1; + SceneItem::display2(270, !_field384 ? 39 : 38); + _sceneMode = 2701; + + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y); + } + } + } + + SceneExt::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 271 - Living Room & Kitchen #2 + * + *--------------------------------------------------------------------------*/ + +void Scene271::Action1::signal() { + Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene; + + scene->setAction(&scene->_sequenceManager2, this, 2703, &scene->_tv, NULL); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene271::Object12::startAction(CursorType action, Event &event) { + Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (BF_GLOBALS._dayNumber == 1) { + if (!BF_GLOBALS.getFlag(onDuty) && (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) != 2)) { + scene->_sceneMode = 2715; + scene->setAction(&scene->_sequenceManager1, scene, 2715, &BF_GLOBALS._player, NULL); + return true; + } + } else if (BF_GLOBALS._dayNumber == 3) { + if (scene->_field796 == 1) { + scene->_stripManager.start(2712, &BF_GLOBALS._stripProxy); + return true; + } else if (BF_GLOBALS.getFlag(fGotGreen355fTalkedToGrannyDay3)) { + scene->_stripManager.start(2714, &BF_GLOBALS._stripProxy); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2713; + scene->setAction(&scene->_sequenceManager1, scene, 2713, &BF_GLOBALS._player, &scene->_object12, NULL); + BF_GLOBALS.setFlag(fGotGreen355fTalkedToGrannyDay3); + return true; + } + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene271::Item::startAction(CursorType action, Event &event) { + Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && !scene->_field796) { + BF_GLOBALS._player.disableControl(); + scene->_object1.postInit(); + scene->_object1.hide(); + + scene->_sceneMode = 2705; + scene->setAction(&scene->_sequenceManager1, scene, 2705, &BF_GLOBALS._player, &scene->_object1, NULL); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene271::Exit::startAction(CursorType action, Event &event) { + Scene271 *scene = (Scene271 *)BF_GLOBALS._sceneManager._scene; + + if (!scene->_action) { + if (scene->_field796 == 1) { + scene->_tempPos = Common::Point(320, 140); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2706; + scene->setAction(&scene->_sequenceManager1, scene, 2706, &BF_GLOBALS._player, &scene->_object1, NULL); + } else { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 320, 140); + } + } + + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene271::Scene271() { + _field796 = _field2E16 = 0; + _tempPos.x = _tempPos.y = 0; + _rect1 = Rect(236, 120, 266, 130); +} + +void Scene271::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_field796); + s.syncAsSint16LE(_field2E16); + s.syncAsSint16LE(_tempPos.x); + s.syncAsSint16LE(_tempPos.y); + _rect1.synchronize(s); +} + +void Scene271::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(270); + setZoomPercents(120, 80, 140, 100); + BF_GLOBALS._sound1.fadeSound(26); + + _stripManager.addSpeaker(&_grandmaSpeaker); + _stripManager.addSpeaker(&_lyleSpeaker); + _stripManager.addSpeaker(&_jakeSpeaker); + _stripManager.addSpeaker(&_skipSpeaker); + _stripManager.addSpeaker(&_lauraSpeaker); + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_granTextSpeaker); + _stripManager.addSpeaker(&_lyleTextSpeaker); + + _exit.setDetails(Rect(310, 115, 320, 167), 270, -1, -1, -1, 1, NULL); + + _tv.postInit(); + _tv.setVisage(270); + _tv.setPosition(Common::Point(264, 74)); + _tv.setStrip(5); + _tv.fixPriority(132); + _tv._numFrames = 3; + _tv.setAction(&_action1); + + if ((BF_GLOBALS._sceneManager._previousScene != 280) && (BF_GLOBALS._sceneManager._previousScene != 620)) { + _object10.postInit(); + _object10.setVisage(270); + _object10.setStrip(2); + _object10.setPosition(Common::Point(302, 121)); + _object10.fixPriority(132); + _object10.animate(ANIM_MODE_2, NULL); + } + + _object5.postInit(); + _object5.hide(); + + _item5.setDetails(Rect(0, 56, 56, 130), 270, 9, 10, 11, 1, NULL); + _object6.setDetails(270, 12, 13, 14, 1, NULL); + _object7.setDetails(270, 15, -1, -1, 1, NULL); + _object8.setDetails(270, 14, -1, -1, 1, NULL); + _object11.setDetails(270, -1, -1, -1, 1, NULL); + _tv.setDetails(270, 3, 4, 5, 1, NULL); + _object10.setDetails(270, 6, 7, 8, 1, NULL); + _object12.setDetails(270, 15, 16, 17, 1, NULL); + _item3.setDetails(4, 270, 27, 28, 29, 1); + _item1.setDetails(1, 270, 18, 19, 20, 1); + _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); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player._moveDiff.x = 8; + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + _field796 = 0; + _sceneMode = 0; + _field2E16 = 0; + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._sceneManager.changeScene(180); + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 180: + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.proc1(19); + + BF_GLOBALS._player.setVisage(151); + BF_GLOBALS._player.setPosition(Common::Point(348, 151)); + + _object12.postInit(); + _object12.setVisage(274); + _object12.setPosition(Common::Point(157, 132)); + _object12._numFrames = 5; + _object12.animate(ANIM_MODE_2, NULL); + break; + case 280: + BF_GLOBALS._player.setVisage(271); + BF_GLOBALS._player.setStrip(5); + BF_GLOBALS._player._frame = 6; + BF_GLOBALS._player.setPosition(Common::Point(228, 138)); + + _object1.postInit(); + _object1.setPosition(Common::Point(340, 100)); + + _object11.postInit(); + _object11.setVisage(272); + _object11.setStrip(1); + _object11._frame = 2; + _object11.setPosition(Common::Point(35, 136)); + + _object6.postInit(); + _object6.hide(); + + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.proc1(19); + + _object12.postInit(); + _object12.setVisage(274); + _object12.setPosition(Common::Point(157, 132)); + _object12.animate(ANIM_MODE_2, NULL); + _object12._numFrames = 5; + _object12.fixPriority(120); + _field796 = 1; + break; + case 590: + BF_GLOBALS._player.setVisage(275); + BF_GLOBALS._player.setStrip(5); + BF_GLOBALS._player.setPosition(Common::Point(58, 133)); + BF_GLOBALS._player.changeZoom(-1); + + _object8.postInit(); + _object8.setVisage(279); + _object8.setPosition(Common::Point(87, 127)); + _object8.fixPriority(146); + + _object7.postInit(); + _object7.setVisage(277); + _object7.setStrip(7); + _object7.setPosition(Common::Point(48, 149)); + + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.proc1(14); + BF_GLOBALS._walkRegions.proc1(19); + + _object12.postInit(); + _object12.setVisage(276); + _object12.setPosition(Common::Point(129, 130)); + + _object2.postInit(); + _object2.setVisage(270); + _object2.setStrip(3); + _object2.setFrame(2); + _object2.setPosition(Common::Point(62, 101)); + _object2.fixPriority(145); + + _object3.postInit(); + _object3.setVisage(270); + _object3.setStrip(3); + _object3.setFrame(3); + _object3.setPosition(Common::Point(90, 104)); + _object3.fixPriority(132); + + _object4.postInit(); + _object4.setVisage(270); + _object4.setStrip(3); + _object4.setFrame(4); + _object4.setPosition(Common::Point(132, 87)); + _object4.fixPriority(1); + break; + default: + BF_GLOBALS._player.setVisage(271); + 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); + + _object12.postInit(); + _object12.setVisage(274); + _object12.setPosition(Common::Point(157, 132)); + _object12.animate(ANIM_MODE_2, NULL); + _object12._numFrames = 5; + + _object1.postInit(); + _object1.setVisage(271); + _object1.setStrip(4); + _object1.setPosition(Common::Point(220, 117)); + _object1.fixPriority(145); + break; + } + + _sceneMode = 11; + + static uint32 black = 0; + add2Faders((const byte *)&black, 2, 270, this); +} + +void Scene271::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 10: + _sceneMode = 2702; + setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL); + break; + case 11: + switch (BF_GLOBALS._sceneManager._previousScene) { + case 180: + _sceneMode = 2716; + setAction(&_sequenceManager1, this, 2716, &BF_GLOBALS._player, &_object12, NULL); + break; + case 280: + BF_GLOBALS._dayNumber = 3; + BF_INVENTORY.alterInventory(3); + + _sceneMode = 2707; + setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object1, &_object11, &_object5, &_object6, NULL); + break; + case 590: + _sceneMode = 2704; + setAction(&_sequenceManager1, this, 2707, &BF_GLOBALS._player, &_object12, &_object7, &_object8, NULL); + default: + _object11.postInit(); + _object11.setPosition(Common::Point(340, 100)); + BF_GLOBALS._sound1.play(36); + + _sceneMode = 2709; + setAction(&_sequenceManager1, this, 2709, &BF_GLOBALS._player, &_object1, &_object12, &_object11, NULL); + break; + } + break; + case 12: + BF_GLOBALS._v51C44 = 0; + BF_GLOBALS._sound1.changeSound(67); + BF_GLOBALS._sceneManager.changeScene(280); + break; + case 13: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 2702: + BF_GLOBALS._player._strip = 1; + BF_GLOBALS._player.enableControl(); + _field2E16 = 1; + break; + case 2704: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(690); + break; + case 2705: + _field796 = 1; + BF_GLOBALS._player.enableControl(); + break; + case 2706: + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.enableControl(); + + _object1.remove(); + _field796 = 0; + ADD_PLAYER_MOVER(_tempPos.x, _tempPos.y); + break; + case 2707: + BF_GLOBALS._player.enableControl(); + _field796 = 1; + _field2E16 = 1; + + _object1.remove(); + _object11.remove(); + + BF_INVENTORY.setObjectScene(INV_LYLE_CARD, 1); + break; + case 2709: + BF_GLOBALS._sound1.play(68); + _sceneMode = 12; + addFader((const byte *)&black, 2, this); + break; + case 2712: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(180); + break; + case 2713: + BF_GLOBALS._player.enableControl(); + break; + case 2714: + BF_GLOBALS._v51C44 = 1; + BF_GLOBALS._sceneManager.changeScene(560); + break; + case 2715: + break; + case 2716: + BF_GLOBALS._deathReason = 24; + _sceneMode = 13; + addFader((const byte *)&black, 2, this); + break; + } +} + +void Scene271::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (_field796 == 1) && (!_action)) { + _tempPos = event.mousePos; + BF_GLOBALS._player.disableControl(); + + _sceneMode = 2706; + setAction(&_sequenceManager1, this, 2706, &BF_GLOBALS._player, &_object1, NULL); + event.handled = true; + } + + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < BF_INTERFACE_Y)) { + if (_exit.contains(event.mousePos)) { + GfxSurface cursor = _cursorVisage.getFrame(EXITFRAME_E); + BF_GLOBALS._events.setCursor(cursor); + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +void Scene271::dispatch() { + if (!_action && (_field2E16 == 1)) { + if ((BF_GLOBALS._player._position.x > 236) && (BF_GLOBALS._player._position.y < 120)) { + _field2E16 = 0; + BF_GLOBALS._sceneManager.changeScene(560); + } + + if (BF_GLOBALS._player._position.x <= 20) { + _field2E16 = 0; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player._mover->remove(); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player._frame = 1; + + if (BF_GLOBALS._sceneObjects->contains(&_object12)) { + _sceneMode = 10; + _stripManager.start(2711, this); + } else { + SceneItem::display2(270, 33); + _sceneMode = 2702; + setAction(&_sequenceManager1, this, 2702, &BF_GLOBALS._player, NULL); + } + } + + if (BF_GLOBALS._player._position.x >= 300) { + _field2E16 = 0; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2712; + setAction(&_sequenceManager1, this, 2712, &BF_GLOBALS._player, NULL); + } + } + + SceneExt::dispatch(); +} + +} // 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 new file mode 100644 index 0000000000..2ec939be19 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes2.h @@ -0,0 +1,284 @@ +/* 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_BLUEFORCE_SCENES2_H +#define TSAGE_BLUEFORCE_SCENES2_H + +#include "common/scummsys.h" +#include "tsage/blue_force/blueforce_logic.h" +#include "tsage/blue_force/blueforce_speakers.h" +#include "tsage/events.h" +#include "tsage/core.h" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class IntroObject: public NamedObject { +}; + +class Scene200: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + NamedObject _object1, _object2, _object3, _object4, _object5, _object6; + IntroObject _object7, _object8, _object9; + NamedObject _object10, _object11; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); +}; + +class Scene210: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + IntroObject _object1, _object2, _object3, _object4; + IntroObject _object5, _object6, _object7, _object8; + NamedObject _object9, _object10, _object11, _object12; + NamedObject _object13, _object14, _object15; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); +}; + +class Scene220: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; + class Action2: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + NamedObject _object1, _object2, _object3, _object4, _object5; + NamedObject _object6, _object7, _object8, _object9; + IntroObject _object10, _object11, _object12, _object13; + IntroObject _object14, _object15, _object16; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); +}; + +class Scene225: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + 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(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + IntroObject _object1, _object2, _object3, _object4; + IntroObject _object5, _object6, _object7; + NamedObject _object8, _object9, _object10, _object11, _object12; + NamedObject _object13, _object14, _object15, _object16; + NamedObject _object17, _object18, _object19; + NamedObject _object20, _object21; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); +}; + +class Scene265: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; +public: + Action1 _action1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); +}; + +class Scene270: public SceneExt { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; + + /* Objects */ + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Grandma: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SpeakerGrandma _grandmaSpeaker; + SpeakerLyle _lyleSpeaker; + SpeakerJake _jakeSpeaker; + SpeakerLaura _lauraSpeaker; + SpeakerSkip _skipSpeaker; + SpeakerGameText _gameTextSpeaker; + Action1 _action1; + NamedObject _object1, _object2, _object3, _laura; + NamedObject _skip, _tv, _fireplace; + Lyle _lyle; + Grandma _grandma; + Item _couch, _afgan; + NamedHotspot _appliances; + NamedHotspot _ivy, _fridge, _photos, _item8, _item9; + NamedHotspot _item10, _item11, _background; + Exit _exit; + int _field380, _field382, _field384, _field386; + int _field219A, _field21A0; + Common::Point _tempPos; + + Scene270(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene271: public PalettedScene { + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; + + /* Objects */ + class Object12: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + SpeakerGrandma _grandmaSpeaker; + SpeakerLyle _lyleSpeaker; + SpeakerJake _jakeSpeaker; + SpeakerLaura _lauraSpeaker; + SpeakerSkip _skipSpeaker; + SpeakerGameText _gameTextSpeaker; + SpeakerGranText _granTextSpeaker; + SpeakerLyleText _lyleTextSpeaker; + + NamedObject _object1, _object2, _object3, _object4, _object5; + NamedObject _object6, _object7, _object8, _tv, _object10; + NamedObject _object11; + Object12 _object12; + Item _item1, _item3; + NamedHotspot _item2, _item4, _item5, _item6, _item7; + NamedHotspot _item8, _item9, _item10, _item11; + Exit _exit; + Action1 _action1; + Rect _rect1; + int _field796, _field2E16; + Common::Point _tempPos; + + Scene271(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp index e49037abf9..6edd6d1aaa 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.cpp +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -36,53 +36,60 @@ namespace BlueForce { * *--------------------------------------------------------------------------*/ -void Scene300::Object::startMover(CursorType action) { +bool Scene300::Object::startAction(CursorType action, Event &event) { if (action == CURSOR_TALK) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; scene->_stripManager.start(_stripNumber, scene); + return true; } else { - NamedObject::startMover(action); + return NamedObject::startAction(action, event); } } -void Scene300::Object17::startMover(CursorType action) { - if ((action != CURSOR_USE) || !BF_GLOBALS.getFlag(3)) { - NamedObject::startMover(action); - } else if ((BF_GLOBALS._v4CEA2 != 2) || (BF_GLOBALS._bikiniHutState >= 12)) { +bool Scene300::Object19::startAction(CursorType action, Event &event) { + if ((action != CURSOR_USE) || !BF_GLOBALS.getFlag(onDuty)) { + return NamedObject::startAction(action, event); + } else if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark >= bEndDayOne)) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; setAction(&scene->_action4); } else { SceneItem::display2(300, 33); } + + return true; } -void Scene300::Item1::startMover(CursorType action) { - if (action == CURSOR_TALK) { +bool Scene300::Item1::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; BF_GLOBALS._player.disableControl(); scene->_sceneMode = 305; scene->setAction(&scene->_sequenceManager1, scene, 305, &BF_GLOBALS._player, &scene->_object8, NULL); + return true; } else { - NamedHotspot::startMover(action); + return NamedHotspot::startAction(action, event); } } -void Scene300::Item2::startMover(CursorType action) { +bool Scene300::Item2::startAction(CursorType action, Event &event) { if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { Scene300 *scene = (Scene300 *)BF_GLOBALS._sceneManager._scene; scene->setAction(&scene->_sequenceManager1, scene, 304, &scene->_object11, NULL); + return true; } else { - NamedHotspot::startMover(action); + return NamedHotspot::startAction(action, event); } } -void Scene300::Item14::startMover(CursorType action) { +bool Scene300::Item14::startAction(CursorType action, Event &event) { ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 151, 54); + return true; } -void Scene300::Item15::startMover(CursorType action) { +bool Scene300::Item15::startAction(CursorType action, Event &event) { ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 316, 90); + return true; } /*--------------------------------------------------------------------------*/ @@ -94,14 +101,14 @@ void Scene300::Action1::signal() { setDelay(1); break; case 1: - if (BF_GLOBALS.getFlag(7)) - SceneItem::display2(300, 0); - else + if (BF_GLOBALS.getFlag(fWithLyle)) SceneItem::display2(666, 27); + else + SceneItem::display2(300, 0); setDelay(1); break; case 2: { - ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8, + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 8, BF_GLOBALS._player._position.y); break; } @@ -132,7 +139,7 @@ void Scene300::Action2::signal() { case 3: BF_GLOBALS._player.enableControl(); remove(); - break; + break; default: break; } @@ -157,7 +164,7 @@ void Scene300::Action3::signal() { case 3: BF_GLOBALS._player.enableControl(); remove(); - break; + break; default: break; } @@ -175,7 +182,7 @@ void Scene300::Action4::signal() { setAction(&scene->_sequenceManager1, this, 316, &BF_GLOBALS._player, &scene->_object19, NULL); break; case 2: - BF_GLOBALS._sceneManager.changeScene(15); + BF_GLOBALS._sceneManager.changeScene(60); break; case 3: setAction(&scene->_sequenceManager1, this, 319, &scene->_object19, NULL); @@ -183,7 +190,7 @@ void Scene300::Action4::signal() { case 4: BF_GLOBALS.setFlag(2); BF_GLOBALS._sceneManager.changeScene(190); - break; + break; default: break; } @@ -203,7 +210,6 @@ void Scene300::Action5::signal() { break; case 2: scene->_stripManager.start(3004, this); - BF_GLOBALS._sceneManager.changeScene(15); break; case 3: { ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 186, 140); @@ -211,7 +217,7 @@ void Scene300::Action5::signal() { } case 4: remove(); - break; + break; default: break; } @@ -235,8 +241,8 @@ void Scene300::postInit(SceneObjectList *OwnerList) { _stripManager.addSpeaker(&_jakeSpeaker); _field2762 = 0; - _item14.setup(Rect(144, 27, 160, 60), 300, -1, -1, -1, 1, NULL); - _item15.setup(Rect(310, 76, SCREEN_WIDTH, 105), 300, -1, -1, -1, 1, NULL); + _item14.setDetails(Rect(144, 27, 160, 60), 300, -1, -1, -1, 1, NULL); + _item15.setDetails(Rect(310, 76, SCREEN_WIDTH, 105), 300, -1, -1, -1, 1, NULL); // Setup the player int playerVisage = BF_GLOBALS._player._visage; @@ -249,28 +255,30 @@ void Scene300::postInit(SceneObjectList *OwnerList) { BF_GLOBALS._player._moveDiff = Common::Point(3, 1); BF_GLOBALS._player.disableControl(); + _object8.postInit(); + _object8.setVisage(301); _object8.setStrip(2); _object8.setPosition(Common::Point(300, 77)); - if ((BF_GLOBALS._v4CEA2 != 2) || (BF_GLOBALS._bikiniHutState < 12)) { + if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark < bEndDayOne)) { _object17.postInit(); _object17.setVisage(301); _object17.setStrip(1); _object17.setPosition(Common::Point(87, 88)); - _object17.setup(300, 11, 13, 2, 1, NULL); - + _object17.setDetails(300, 11, 13, 2, 1, NULL); + _object18.postInit(); _object18.setVisage(301); _object18.setStrip(1); _object18.setPosition(Common::Point(137, 92)); - _object18.setup(300, 11, 13, 3, 1, NULL); + _object18.setDetails(300, 11, 13, 3, 1, NULL); } _object19.postInit(); _object19.setVisage(301); _object19.setStrip(1); _object19.setPosition(Common::Point(175, 99)); - _object19.setup(300, 11, 13, 34, 1, NULL); + _object19.setDetails(300, 11, 13, 34, 1, NULL); _object11.postInit(); _object11.setVisage(301); @@ -278,16 +286,11 @@ void Scene300::postInit(SceneObjectList *OwnerList) { _object11.setPosition(Common::Point(265, 91)); _object11.hide(); - //***DEBUG*** -BF_GLOBALS.setFlag(2); -BF_GLOBALS._sceneManager._previousScene = 190; -BF_GLOBALS._player.setVisage(190); - switch (BF_GLOBALS._sceneManager._previousScene) { case 50: case 60: - BF_GLOBALS.clearFlag(2); - if (BF_GLOBALS.getFlag(3)) { + BF_GLOBALS.clearFlag(onBike); + if (BF_GLOBALS.getFlag(onDuty)) { BF_GLOBALS._player.disableControl(); _sceneMode = 318; setAction(&_sequenceManager1, this, 318, &BF_GLOBALS._player, &_object19, NULL); @@ -304,7 +307,7 @@ BF_GLOBALS._player.setVisage(190); BF_GLOBALS._player.setPosition(Common::Point(175, 50)); ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 123, 71); - if ((BF_GLOBALS._v4CEA2 == 2) && (BF_GLOBALS._bikiniHutState < 12)) + if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._bookmark < bEndDayOne)) setup(); } else if (!BF_GLOBALS.getFlag(3)) { BF_GLOBALS._player.disableControl(); @@ -318,8 +321,8 @@ BF_GLOBALS._player.setVisage(190); break; case 315: BF_GLOBALS._player.setPosition(Common::Point(305, 66)); - if ((BF_GLOBALS._v4CEA2 != 2) || (BF_GLOBALS._bikiniHutState >= 12)) { - BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(3) ? 1304 : 303); + if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._bookmark >= bEndDayOne)) { + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1304 : 303); BF_GLOBALS._player.disableControl(); _sceneMode = 0; setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL); @@ -338,16 +341,30 @@ BF_GLOBALS._player.setVisage(190); setAction(&_sequenceManager1, this, 306, &BF_GLOBALS._player, &_object8, NULL); break; } + + _item10.setDetails(4, 300, 7, 13, 16, 1); + _item11.setDetails(2, 300, 9, 13, 18, 1); + _item12.setDetails(5, 300, 10, 13, 19, 1); + _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); + _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); } void Scene300::signal() { switch (_sceneMode) { case 300: BF_GLOBALS._sound1.fadeSound(33); - BF_GLOBALS.clearFlag(2); + BF_GLOBALS.clearFlag(onBike); _sceneMode = 0; - if ((BF_GLOBALS._v4CEA2 != 1) || (BF_GLOBALS._bikiniHutState != 0)) { + if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark != bNone)) { signal(); } else { _stripManager.start(3005, this); @@ -373,7 +390,7 @@ void Scene300::signal() { setAction(&_sequenceManager1, this, 303, &_object13, &_object1, NULL); break; case 305: - if ((BF_GLOBALS._v4CEA2 == 4) || (BF_GLOBALS._v4CEA2 == 5)) { + if ((BF_GLOBALS._dayNumber == 4) || (BF_GLOBALS._dayNumber == 5)) { _sceneMode = 0; setAction(&_action3); } else { @@ -407,7 +424,7 @@ void Scene300::signal() { BF_GLOBALS._sceneManager.changeScene(60); break; case 318: - BF_GLOBALS.clearFlag(2); + BF_GLOBALS.clearFlag(onBike); _sceneMode = 0; signal(); break; @@ -442,7 +459,7 @@ void Scene300::signal() { _object13.setAction(&_sequenceManager2, NULL, 313, &_object13, &_object17, NULL); _object14.setAction(&_sequenceManager3, this, 314, &_object14, &_object18, NULL); - BF_GLOBALS._bikiniHutState = 12; + BF_GLOBALS._bookmark = bEndDayOne; BF_GLOBALS._sound1.changeSound(33); break; case 2307: @@ -456,7 +473,7 @@ void Scene300::signal() { _object9.hide(); _object10.postInit(); _object10.hide(); - + if (BF_GLOBALS.getFlag(1)) { BF_GLOBALS._player.disableControl(); _sceneMode = 4308; @@ -504,19 +521,19 @@ void Scene300::signal() { } void Scene300::process(Event &event) { - if ((BF_GLOBALS._player._field8E != 0) && !_eventHandler && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { - Visage visage; + SceneExt::process(event); + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit if (_item14.contains(event.mousePos)) { - visage.setVisage(1, 8); - GfxSurface surface = visage.getFrame(2); + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_NE); BF_GLOBALS._events.setCursor(surface); } else if (_item15.contains(event.mousePos)) { - visage.setVisage(1, 8); - GfxSurface surface = visage.getFrame(3); + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_E); BF_GLOBALS._events.setCursor(surface); } else { - CursorType cursorId = BF_GLOBALS._events.hideCursor(); + // In case an exit cursor was being shown, restore the previously selected cursor + CursorType cursorId = BF_GLOBALS._events.getCursor(); BF_GLOBALS._events.setCursor(cursorId); } } @@ -525,7 +542,7 @@ void Scene300::process(Event &event) { void Scene300::dispatch() { SceneExt::dispatch(); - if (_action) { + if (!_action) { int regionIndex = BF_GLOBALS._player.getRegionIndex(); if ((regionIndex == 1) && (_field2762 == 1)) { BF_GLOBALS._player.disableControl(); @@ -538,9 +555,22 @@ void Scene300::dispatch() { BF_GLOBALS._v4CEA4 = 3; _sceneMode = 6308; BF_GLOBALS._player.disableControl(); - ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20, + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 20, BF_GLOBALS._player._position.y - 5); } + + if (BF_GLOBALS._player._position.x <= 5) + setAction(&_action2); + + if (BF_GLOBALS._player._position.x >= 315) { + if (BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark == bNone) || !BF_GLOBALS.getFlag(fWithLyle)) { + setAction(&_action1); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 317; + setAction(&_sequenceManager1, this, 1301, &BF_GLOBALS._player, NULL); + } + } } } @@ -597,6 +627,5291 @@ void Scene300::setup() { _field2762 = 1; } +/*-------------------------------------------------------------------------- + * Scene 315 - Inside Police Station + * + *--------------------------------------------------------------------------*/ + +bool Scene315::Barry::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + scene->_currentCursor = action; + + switch (action) { + case CURSOR_USE: + if (scene->_field1B60 || scene->_field1B64) + SceneItem::display2(320, 51); + else + NamedHotspot::startAction(action, event); + break; + case CURSOR_TALK: + if ((BF_GLOBALS._dayNumber == 2) && (BF_GLOBALS._sceneManager._previousScene == 325)) + NamedHotspot::startAction(action, event); + else { + if (!BF_GLOBALS.getFlag(onDuty)) + scene->_stripNumber = 3172; + else if (BF_GLOBALS.getFlag(fTalkedToBarry)) + scene->_stripNumber = 3166; + else if (BF_GLOBALS.getFlag(fTalkedToLarry)) + scene->_stripNumber = 3164; + else + scene->_stripNumber = 3165; + + scene->setAction(&scene->_action1); + BF_GLOBALS.setFlag(fTalkedToBarry); + } + break; + case INV_GREENS_GUN: + case INV_GREENS_KNIFE: + BF_GLOBALS._player.disableControl(); + if (BF_INVENTORY._bookingGreen._sceneNumber == 390) { + scene->_stripNumber = 3174; + scene->setAction(&scene->_action1); + } else { + ++scene->_field1B62; + scene->_stripNumber = (action == INV_GREENS_GUN) ? 3168 : 0; + scene->_sceneMode = 3153; + scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL); + } + break; + case INV_FOREST_RAP: + BF_GLOBALS._player.disableControl(); + scene->_stripNumber = BF_GLOBALS.getFlag(onDuty) ? 3178 : 3173; + scene->setAction(&scene->_action1); + break; + case INV_GREEN_ID: + case INV_FRANKIE_ID: + case INV_TYRONE_ID: + BF_GLOBALS._player.disableControl(); + scene->_stripNumber = 3175; + scene->setAction(&scene->_action1); + break; + case INV_BOOKING_GREEN: + case INV_BOOKING_FRANKIE: + case INV_BOOKING_GANG: + BF_GLOBALS._player.disableControl(); + scene->_stripNumber = 3167; + scene->setAction(&scene->_action1); + break; + case INV_COBB_RAP: + if (BF_INVENTORY._mugshot._sceneNumber == 1) + NamedHotspot::startAction(action, event); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3169; + if (BF_GLOBALS._dayNumber > 2) + scene->_stripNumber = 3176; + else if (BF_GLOBALS.getFlag(onDuty)) + scene->_stripNumber = 3177; + else + scene->_stripNumber = 3170; + scene->setAction(&scene->_action1); + } + break; + case INV_22_BULLET: + case INV_AUTO_RIFLE: + case INV_WIG: + case INV_22_SNUB: + BF_GLOBALS._player.disableControl(); + if ((BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingFrankie._sceneNumber == 0)) || + (!BF_GLOBALS.getFlag(fCuffedFrankie) && (BF_INVENTORY._bookingGang._sceneNumber == 0))) { + scene->_stripNumber = 3174; + scene->setAction(&scene->_action1); + } else { + if (!scene->_field1B6C & (scene->_field1B66 == 1)) { + scene->_field1B6C = 1; + scene->_stripNumber = 3169; + } else { + scene->_stripNumber = 0; + } + + scene->_sceneMode = 3153; + scene->setAction(&scene->_sequenceManager, scene, 3153, &BF_GLOBALS._player, NULL); + } + break; + default: + return NamedHotspot::startAction(action, event); + } + + return true; +} + +bool Scene315::SutterSlot::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case INV_GREENS_GUN: + case INV_22_BULLET: + case INV_AUTO_RIFLE: + case INV_WIG: + case INV_22_SNUB: + SceneItem::display2(315, 30); + break; + case INV_GREEN_ID: + case INV_FRANKIE_ID: + case INV_TYRONE_ID: + BF_GLOBALS._player.disableControl(); + scene->_stripNumber = 3175; + scene->setAction(&scene->_action1); + break; + case INV_BOOKING_GREEN: + case INV_BOOKING_FRANKIE: + case INV_BOOKING_GANG: + if (action == INV_BOOKING_GREEN) + ++scene->_field1B62; + else + ++scene->_field1B66; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 12; + scene->setAction(&scene->_sequenceManager, scene, 3154, &BF_GLOBALS._player, NULL); + break; + default: + return NamedHotspot::startAction(action, event); + } + + return true; +} + +bool Scene315::Sign::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_LOOK) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.addMover(NULL); + scene->_object9.postInit(); + scene->_object9.hide(); + scene->_sceneMode = 3167; + scene->setAction(&scene->_sequenceManager, scene, 3167, &scene->_object9, this, NULL); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene315::BulletinBoard::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_LOOK) { + BF_GLOBALS._player.addMover(NULL); + scene->_stripManager.start(3154, &BF_GLOBALS._stripProxy); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene315::CleaningKit::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + if ((action == INV_COLT45) && BF_GLOBALS.getFlag(onDuty)) { + if (!BF_GLOBALS.getFlag(onDuty)) + SceneItem::display2(315, 27); + else if (BF_GLOBALS.getHasBullets()) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3162; + scene->setAction(&scene->_sequenceManager, scene, 3162, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS.getFlag(fGunLoaded)) + SceneItem::display2(315, 46); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3159; + scene->setAction(&scene->_sequenceManager, scene, 3159, &BF_GLOBALS._player, NULL); + } + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene315::BriefingMaterial::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + if (action != CURSOR_USE) + return NamedHotspot::startAction(action, event); + else if (BF_INVENTORY._forestRap._sceneNumber == 1) { + SceneItem::display2(315, 37); + return true; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3158; + scene->setAction(&scene->_sequenceManager, scene, 3158, &BF_GLOBALS._player, NULL); + return true; + } +} + +bool Scene315::WestExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 190, 75); + return true; +} + +bool Scene315::SouthWestExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, event.mousePos.x, event.mousePos.y); + return true; +} + +/*--------------------------------------------------------------------------*/ + +bool Scene315::BulletinMemo::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + scene->_stripManager.start(3157, &BF_GLOBALS._stripProxy); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fGotPointsForCleaningGun)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fGotPointsForCleaningGun); + } + BF_GLOBALS._player.addMover(NULL); + scene->_stripManager.start(3159, &BF_GLOBALS._stripProxy); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene315::Object2::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + BF_GLOBALS._player.disableControl(); + scene->_object9.postInit(); + scene->_object9.hide(); + scene->_sceneMode = 3157; + scene->setAction(&scene->_sequenceManager, scene, 3157, &BF_GLOBALS._player, &scene->_object9, NULL); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3156; + scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(onDuty) ? 3156 : 3168, + &BF_GLOBALS._player, this, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene315::ATFMemo::startAction(CursorType action, Event &event) { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + BF_GLOBALS._player.addMover(NULL); + scene->_stripManager.start(3156, &BF_GLOBALS._stripProxy); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fGotPointsForMemo)) { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForMemo); + } + + BF_GLOBALS._player.addMover(NULL); + scene->_stripManager.start(3158, &BF_GLOBALS._stripProxy); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene315::Action1::signal() { + Scene315 *scene = (Scene315 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 128, 128); + break; + case 1: + BF_GLOBALS._player.changeAngle(315); + setDelay(2); + break; + case 2: + scene->_stripManager.start(scene->_stripNumber, this); + break; + case 3: + if (scene->_sceneMode == 3169) { + BF_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_MUG_SHOT, 1); + } + + remove(); + BF_GLOBALS._player.enableControl(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene315::Scene315() { + BF_GLOBALS._v51C44 = 1; + _field1B6C = _field139C = 0; + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + BF_GLOBALS.clearFlag(fCanDrawGun); + _field1B68 = true; + _field1B6A = false; + _field1B60 = _field1B62 = 0; + _field1B64 = _field1B66 = 0; +} + +void Scene315::synchronize(Serializer &s) { + SceneExt::synchronize(s); + + s.syncAsSint16LE(_field1390); + s.syncAsSint16LE(_stripNumber); + s.syncAsSint16LE(_field1398); + s.syncAsSint16LE(_field1B60); + s.syncAsSint16LE(_field1B62); + s.syncAsSint16LE(_field1B64); + s.syncAsSint16LE(_field1B66); + s.syncAsSint16LE(_field1B6C); + s.syncAsSint16LE(_field139C); + s.syncAsByte(_field1B68); + s.syncAsByte(_field1B6A); + s.syncAsSint16LE(_currentCursor); +} + +void Scene315::postInit(SceneObjectList *OwnerList) { + loadScene(315); + + if (BF_GLOBALS._sceneManager._previousScene != 325) + BF_GLOBALS._sound1.fadeSound(11); + + setZoomPercents(67, 72, 124, 100); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_sutterSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_jailerSpeaker); + + _object8.postInit(); + _object8.setVisage(315); + _object8.setPosition(Common::Point(272, 69)); + + if (BF_GLOBALS._bookmark >= bLauraToParamedics) { + _atfMemo.postInit(); + _atfMemo.setVisage(315); + _atfMemo.setPosition(Common::Point(167, 53)); + _atfMemo.setStrip(4); + _atfMemo.setFrame(4); + _atfMemo.fixPriority(82); + _atfMemo.setDetails(315, -1, -1, -1, 1, NULL); + } + + if (BF_GLOBALS._dayNumber == 1) { + if (BF_GLOBALS._bookmark >= bLauraToParamedics) { + _bulletinMemo.postInit(); + _bulletinMemo.setVisage(315); + _bulletinMemo.setPosition(Common::Point(156, 51)); + _bulletinMemo.setStrip(4); + _bulletinMemo.setFrame(2); + _bulletinMemo.fixPriority(82); + _bulletinMemo.setDetails(315, -1, -1, -1, 1, NULL); + } + } else if ((BF_INVENTORY._daNote._sceneNumber != 1) && (BF_GLOBALS._dayNumber < 3)) { + _object2.postInit(); + _object2.setVisage(315); + _object2.setStrip(3); + _object2.setFrame(2); + _object2.setPosition(Common::Point(304, 31)); + _object2.fixPriority(70); + _object2.setDetails(315, 3, 4, -1, 1, NULL); + } + + _sutterSlot.setDetails(12, 315, 35, -1, 36, 1); + _bulletinBoard.setDetails(3, 315, -1, -1, -1, 1); + _barry.setDetails(4, 315, 10, 11, 12, 1); + _item3.setDetails(2, 315, 0, 1, 2, 1); + _sign.setDetails(Rect(190, 17, 208, 30), 315, -1, -1, -1, 1, NULL); + _westExit.setDetails(Rect(184, 31, 211, 80), 315, -1, -1, -1, 1, NULL); + _swExit.setDetails(Rect(0, 157, 190, 167), 315, -1, -1, -1, 1, NULL); + + if (!BF_GLOBALS.getFlag(onDuty) && ((BF_GLOBALS._bookmark == bNone) || (BF_GLOBALS._bookmark == bLyleStoppedBy))) { + _field1398 = 1; + BF_GLOBALS.setFlag(onDuty); + } else { + _field1398 = 0; + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + if ((BF_GLOBALS._dayNumber != 2) || (BF_GLOBALS._sceneManager._previousScene != 325)) { + _object4.postInit(); + _object4.setVisage(316); + _object4.setPosition(Common::Point(99, 82)); + _object4.fixPriority(95); + + _object5.postInit(); + _object5.setVisage(395); + _object5.setStrip(2); + _object5.setPosition(Common::Point(96, 86)); + } + + // Set up evidence objects in inventory + if (BF_INVENTORY._bookingGreen.inInventory()) + ++_field1B60; + if (BF_INVENTORY._greensGun.inInventory()) + ++_field1B60; + if (BF_INVENTORY._greensKnife.inInventory()) + ++_field1B60; + + if (BF_INVENTORY._bullet22.inInventory()) + ++_field1B64; + if (BF_INVENTORY._autoRifle.inInventory()) + ++_field1B64; + if (BF_INVENTORY._wig.inInventory()) + ++_field1B64; + if (BF_INVENTORY._bookingFrankie.inInventory()) + ++_field1B64; + if (BF_INVENTORY._bookingGang.inInventory()) + ++_field1B64; + if (BF_INVENTORY._snub22.inInventory()) + ++_field1B64; + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 190: + if (_field1398) + _field1B6A = true; + _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 3150 : 3165; + setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL); + break; + case 325: + BF_GLOBALS._uiElements._active = false; + _object6.postInit(); + _object7.postInit(); + _object8.setFrame(8); + _sceneMode = (BF_GLOBALS._dayNumber == 1) ? 3152 : 3155; + setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, &_object6, + &_object7, &_object8, NULL); + break; + case 300: + default: + if (_field1398) + _field1B6A = true; + if (!BF_GLOBALS.getFlag(onDuty)) + _sceneMode = 3166; + else if (!_field1398) + _sceneMode = 3164; + else + _sceneMode = 3163; + + setAction(&_sequenceManager, this, _sceneMode, &BF_GLOBALS._player, NULL); + break; + } + + if (_field1B6A) { + _object8.setFrame(8); + } else { + BF_GLOBALS._walkRegions.proc1(4); + } + + _briefingMaterial.setDetails(24, 315, 38, 39, 40, 1); + _cleaningKit.setDetails(14, 315, 24, 25, 26, 1); + _item7.setDetails(5, 315, 8, 9, -1, 1); + _item6.setDetails(6, 315, 5, 6, 7, 1); + _item10.setDetails(8, 315, 13, -1, -1, 1); + _item11.setDetails(9, 315, 14, -1, -1, 1); + _item8.setDetails(7, 315, 15, 16, 17, 1); + _item9.setDetails(10, 315, 18, 19, 20, 1); +} + +void Scene315::signal() { + int ctr = 0; + + switch (_sceneMode) { + case 0: + BF_GLOBALS._player.enableControl(); + break; + case 10: + if (_field1B62) { + if (_field1B62 >= _field1B60) + BF_GLOBALS.setFlag(fLeftTraceIn910); + else + ++ctr; + } + + if (_field1B66) { + if (_field1B66 < _field1B64) + ++ctr; + else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence) + BF_GLOBALS._bookmark = bBookedFrankieEvidence; + } + + if (ctr) { + BF_GLOBALS._deathReason = 20; + BF_GLOBALS._sceneManager.changeScene(666); + } else { + BF_GLOBALS._sceneManager.changeScene(300); + } + BF_GLOBALS._sound1.fadeOut2(NULL); + break; + case 11: + if (_field1B62) { + if (_field1B62 >= _field1B60) + BF_GLOBALS.setFlag(fLeftTraceIn910); + else + ++ctr; + } + + if (_field1B66) { + if (_field1B66 < _field1B64) + ++ctr; + else if (BF_GLOBALS._bookmark < bBookedFrankie) + BF_GLOBALS._bookmark = bBookedFrankie; + else if (BF_GLOBALS._bookmark < bBookedFrankieEvidence) + BF_GLOBALS._bookmark = bBookedFrankie; + } + + if (ctr == 1) { + BF_GLOBALS._deathReason = 20; + BF_GLOBALS._sound1.fadeOut2(NULL); + } else if ((BF_GLOBALS._bookmark != bBookedFrankie) || !BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(190); + } else { + BF_GLOBALS._bookmark = bBookedFrankieEvidence; + _field139C = 0; + BF_GLOBALS.clearFlag(onDuty); + BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60); + BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60); + _sceneMode = 3165; + setAction(&_sequenceManager, this, 3165, &BF_GLOBALS._player, NULL); + } + break; + case 12: + BF_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene((int)_currentCursor, 315); + + if (!_field1B64 || (_field1B66 != _field1B64)) + BF_GLOBALS._player.enableControl(); + else { + _field139C = 1; + _stripNumber = 3171; + setAction(&_action1); + } + break; + case 3150: + case 3164: + case 3165: + case 3166: + BF_GLOBALS._player.enableControl(); + _field1B68 = false; + break; + case 3151: + BF_GLOBALS._sceneManager.changeScene(325); + break; + case 3152: + BF_GLOBALS._walkRegions.proc1(4); + _object7.remove(); + _object6.remove(); + + BF_GLOBALS._player.enableControl(); + _field1B68 = false; + BF_GLOBALS._walkRegions.proc1(4); + BF_GLOBALS._uiElements._active = true; + BF_GLOBALS._uiElements.show(); + break; + case 3153: + BF_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene((int)_currentCursor, 315); + + if (_stripNumber != 0) + setAction(&_action1); + else if (!_field1B64 || (_field1B66 != _field1B64)) + BF_GLOBALS._player.enableControl(); + else { + _stripNumber = 3171; + setAction(&_action1); + _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); + BF_INVENTORY.setObjectScene(INV_DA_NOTE, 1); + _object2.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 3157: + BF_GLOBALS._player.enableControl(); + _object9.remove(); + break; + case 3158: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._uiElements.addScore(10); + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 1); + break; + case 3159: + if (!BF_GLOBALS.getFlag(fBookedGreenEvidence)) { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fBookedGreenEvidence); + } + BF_GLOBALS.setFlag(gunClean); + BF_GLOBALS._player.enableControl(); + break; + case 3161: + BF_GLOBALS._deathReason = 21; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3162: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3161; + setAction(&_sequenceManager, this, 3161, &BF_GLOBALS._player, NULL); + BF_GLOBALS.setFlag(fShotSuttersDesk); + break; + case 3163: + _sceneMode = 3150; + setAction(&_sequenceManager, this, 3150, &BF_GLOBALS._player, NULL); + break; + case 3167: + BF_GLOBALS._player.enableControl(); + _object9.remove(); + break; + case 3154: + default: + break; + } +} + +void Scene315::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_swExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else if ((BF_GLOBALS._bookmark != bBookedFrankie) && _westExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); + 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 Scene315::dispatch() { + SceneExt::dispatch(); + + if (_field1B68) + return; + + if (_field1B6A) { + if (BF_GLOBALS._player._position.y < 69) { + BF_GLOBALS._player.disableControl(); + _field1B68 = true; + _sceneMode = 3151; + setAction(&_sequenceManager, this, 3151, &BF_GLOBALS._player, NULL); + } else if (BF_GLOBALS._player.getRegionIndex() == 1) { + BF_GLOBALS._player.disableControl(); + _field1B68 = true; + SceneItem::display2(315, 28); + _sceneMode = 3150; + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30, + BF_GLOBALS._player._position.y + 15); + } else if (BF_GLOBALS._player._position.y > 156) { + BF_GLOBALS._player.disableControl(); + _field1B68 = true; + SceneItem::display2(315, 28); + _sceneMode = 3150; + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x + 30, + BF_GLOBALS._player._position.y - 24); + } + } else if (BF_GLOBALS._player.getRegionIndex() == 1) { + BF_GLOBALS._player.disableControl(); + _field1B68 = true; + _sceneMode = 11; + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 30, + BF_GLOBALS._player._position.y - 5); + } else if (BF_GLOBALS._player._position.y > 156) { + BF_GLOBALS._player.disableControl(); + _field1B68 = true; + + if (_field139C) { + SceneItem::display2(315, 45); + _sceneMode = 3150; + ADD_MOVER(BF_GLOBALS._player, 112, 152); + } else { + _sceneMode = 10; + ADD_MOVER(BF_GLOBALS._player, BF_GLOBALS._player._position.x - 150, + BF_GLOBALS._player._position.y + 120); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 325 - Police Station Conference Room + * + *--------------------------------------------------------------------------*/ + +bool Scene325::Item1::startAction(CursorType action, Event &event) { + if (action == CURSOR_EXIT) { + BF_GLOBALS._events.setCursor(CURSOR_WALK); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sceneManager.changeScene(315); + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene325::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(325); + BF_GLOBALS._interfaceY = 200; + BF_GLOBALS.clearFlag(fCanDrawGun); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + // Add the speakers + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_PSutterSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.hide(); + + if (BF_GLOBALS._dayNumber == 1) { + _object1.postInit(); + _object1.setVisage(325); + _object1.setStrip(8); + _object1.setPosition(Common::Point(128, 44)); + } else { + _object1.postInit(); + _object1.setVisage(325); + _object1.setStrip(8); + _object1.setFrame(2); + _object1.setPosition(Common::Point(132, 28)); + + _object2.postInit(); + _object2.setVisage(325); + _object2.setStrip(8); + _object2.setFrame(3); + _object2.setPosition(Common::Point(270, 24)); + } + + _object3.postInit(); + _object3.setVisage(335); + _object3.setStrip(4); + _object3.setPosition(Common::Point(202, 122)); + + _object4.postInit(); + _object4.setVisage(335); + _object4.setStrip(2); + _object4.setPosition(Common::Point(283, 102)); + + _object5.postInit(); + _object5.setVisage(335); + _object5.setStrip(1); + _object5.setPosition(Common::Point(135, 167)); + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 560, -1, -1, -1, 1, NULL); + BF_GLOBALS._player.disableControl(); + + _sceneMode = (BF_GLOBALS._dayNumber == 1) ? 3250 : 3251; + setAction(&_sequenceManager, this, _sceneMode, &_object3, &_object4, &_object5, NULL); +} + +void Scene325::signal() { + BF_GLOBALS._player._uiEnabled = 0; + BF_GLOBALS._player._canWalk = true; + BF_GLOBALS._player._enabled = true; + BF_GLOBALS._events.setCursor(CURSOR_EXIT); +} + +/*-------------------------------------------------------------------------- + * Scene 330 - Approaching Marina + * + *--------------------------------------------------------------------------*/ + +void Scene330::Timer1::signal() { + PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(240, 254, 1); + rotation->setDelay(25); + remove(); +} + +/*--------------------------------------------------------------------------*/ + +Scene330::Scene330() { + _seqNumber = 0; +} + +void Scene330::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_seqNumber); +} + +void Scene330::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + BF_GLOBALS._sound1.changeSound(35); + _sound1.fadeSound(35); + + loadScene(850); + _timer.set(2, NULL); + + if (BF_GLOBALS._dayNumber >= 4) { + _object2.postInit(); + _object2.setVisage(851); + _object2.setPosition(Common::Point(120, 112)); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 850 : 852); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.hide(); + if (BF_GLOBALS.getFlag(fWithLyle)) + BF_GLOBALS._player.setStrip(5); + + if ((BF_GLOBALS._dayNumber == 1) && BF_GLOBALS.getFlag(fBackupArrived340)) { + _object1.postInit(); + _object1.setVisage(850); + _object1.setStrip(6); + _object1.setFrame(1); + _object1.setPosition(Common::Point(47, 169)); + _object1.animate(ANIM_MODE_2); + } + + if (BF_GLOBALS._sceneManager._previousScene == 50) { + // Coming from map + if ((BF_GLOBALS._driveFromScene == 340) || (BF_GLOBALS._driveFromScene == 342) || + (BF_GLOBALS._driveFromScene == 330)) { + if (BF_GLOBALS.getFlag(fWithLyle)) { + _seqNumber = 3304; + } else { + _seqNumber = 3302; + _sound2.play(123); + BF_GLOBALS.setFlag(onBike); + } + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _seqNumber = 3303; + } else { + _sound2.play(123); + _seqNumber = 3301; + + if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark >= bStartOfGame) && + (BF_GLOBALS._bookmark < bCalledToDomesticViolence)) { + BF_GLOBALS._player.animate(ANIM_MODE_2); + } + } + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _seqNumber = 3303; + } else { + _seqNumber = 3301; + _sound2.play(123); + + if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark >= bStartOfGame) && + (BF_GLOBALS._bookmark < bCalledToDomesticViolence)) { + BF_GLOBALS._player.animate(ANIM_MODE_2); + } + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, _seqNumber, &BF_GLOBALS._player, NULL); +} + +void Scene330::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene330::signal() { + if ((BF_GLOBALS._driveFromScene == 330) || (BF_GLOBALS._driveFromScene == 340) || + (BF_GLOBALS._driveFromScene == 342)) { + // Leaving marina + if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark >= bCalledToDomesticViolence)) + // Leave scene normally + BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._driveToScene); + else { + // Player leaves with domestic violence unresolved + BF_GLOBALS._player.hide(); + BF_GLOBALS._deathReason = 4; + BF_GLOBALS._sceneManager.changeScene(666); + } + } else { + // Arriving at marina + BF_GLOBALS.clearFlag(onBike); + + if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark >= bCalledToDomesticViolence)) + BF_GLOBALS._sceneManager.changeScene(342); + else + BF_GLOBALS._sceneManager.changeScene(340); + } +} + +/*-------------------------------------------------------------------------- + * Scene 340 - Marina, Domestic Disturbance + * + *--------------------------------------------------------------------------*/ + +bool Scene340::Child::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(340, 5); + return true; + case CURSOR_USE: + SceneItem::display2(340, 14); + return true; + case CURSOR_TALK: + if (!BF_GLOBALS.getFlag(fBackupArrived340) || (BF_GLOBALS._marinaWomanCtr < 3) || !BF_GLOBALS.getFlag(fGotAllSkip340)) + scene->setAction(&scene->_action3); + else + scene->setAction(&scene->_action2); + return true; + case INV_COLT45: + scene->gunDisplay(); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene340::Woman::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(340, 4); + return true; + case CURSOR_USE: + SceneItem::display2(340, 13); + return true; + case CURSOR_TALK: + if (!BF_GLOBALS.getFlag(fBackupArrived340) || (BF_GLOBALS._marinaWomanCtr < 3) || !BF_GLOBALS.getFlag(fGotAllSkip340)) + scene->setAction(&scene->_action1); + else + scene->setAction(&scene->_action2); + return true; + case INV_COLT45: + scene->gunDisplay(); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene340::Harrison::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(340, 6); + return true; + case CURSOR_USE: + SceneItem::display2(340, 15); + return true; + case CURSOR_TALK: + scene->setAction(&scene->_action5); + return true; + case INV_COLT45: + scene->gunDisplay(); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + + +/*--------------------------------------------------------------------------*/ + +bool Scene340::Item1::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + if (action == INV_COLT45) { + scene->gunDisplay(); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +bool Scene340::WestExit::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS.getFlag(fBackupArrived340)) { + scene->setAction(&scene->_action6); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4; + setAction(&scene->_sequenceManager1, scene, 1348, &BF_GLOBALS._player, NULL); + } + return true; +} + +bool Scene340::SouthWestExit::startAction(CursorType action, Event &event) { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3; + setAction(&scene->_sequenceManager1, scene, 1340, &BF_GLOBALS._player, NULL); + return true; +} + +bool Scene340::NorthExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 254, 106); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene340::Action1::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER(64, 155); + break; + } + case 1: + BF_GLOBALS._player.changeAngle(45); + setDelay(3); + break; + case 2: + if (!BF_GLOBALS._marinaWomanCtr) { + setAction(&scene->_action8, this); + } else if (!_action) { + BF_GLOBALS._player.setAction(&scene->_sequenceManager1, this, + MIN(BF_GLOBALS._marinaWomanCtr, 3) + 2340, &scene->_woman, &scene->_child, + &scene->_object4, NULL); + } + break; + case 3: + if ((BF_GLOBALS._marinaWomanCtr != 1) || BF_GLOBALS.getFlag(fCalledBackup)) { + setDelay(3); + } else { + scene->_sound1.play(8); + scene->_stripManager.start(3413, this); + } + break; + case 4: + if (BF_GLOBALS._marinaWomanCtr == 1) + ++BF_GLOBALS._marinaWomanCtr; + + if (BF_GLOBALS.getFlag(fBackupArrived340)) { + scene->_field2654 = 1; + scene->_harrison.setPosition(Common::Point(46, 154)); + BF_GLOBALS._walkRegions.proc1(19); + } else if (BF_GLOBALS.getFlag(fCalledBackup)) { + scene->_timer1.set(40, &scene->_harrison, &scene->_action4); + } + + ++BF_GLOBALS._marinaWomanCtr; + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene340::Action2::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + ADD_PLAYER_MOVER(64, 155); + break; + } + case 1: + BF_GLOBALS._player.changeAngle(45); + setDelay(3); + break; + case 2: + BF_GLOBALS._player.setAction(&scene->_sequenceManager3, this, 1341, &scene->_woman, &scene->_child, NULL); + break; + case 3: + scene->_woman.remove(); + scene->_child.remove(); + BF_GLOBALS.setFlag(fToldToLeave340); + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene340::Action3::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + ADD_PLAYER_MOVER(64, 155); + break; + } + case 1: + BF_GLOBALS._player.changeAngle(45); + setDelay(3); + break; + case 2: + scene->_stripManager.start(scene->_field2652 + 3404, this); + break; + case 3: + if (++scene->_field2652 > 2) { + if (!BF_GLOBALS.getFlag(fGotAllSkip340)) + BF_GLOBALS.setFlag(fGotAllSkip340); + scene->_field2652 = 0; + } + + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene340::Action4::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (!_action) { + BF_GLOBALS._player.disableControl(); + setDelay(3); + } else { + scene->_timer1.set(30, &scene->_harrison, &scene->_action4); + remove(); + } + break; + case 1: + BF_GLOBALS.setFlag(fBackupArrived340); + scene->_field2654 = 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._player.enableControl(); + remove(); + break; + } +} + +void Scene340::Action5::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + if (scene->_field2654) { + ADD_PLAYER_MOVER(64, 155); + } else { + BF_GLOBALS._player.changeAngle(45); + setDelay(3); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_harrison._position); + setDelay(3); + break; + case 2: + setDelay(15); + break; + case 3: + if (BF_GLOBALS.getFlag(fBriefedBackup)) + scene->_stripManager.start(3416, this); + else { + BF_GLOBALS.setFlag(fBriefedBackup); + scene->_stripManager.start(3407, this); + } + break; + case 4: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene340::Action6::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER(10, 110); + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_harrison._position); + scene->_harrison.updateAngle(BF_GLOBALS._player._position); + scene->_stripManager.start(3415, this); + break; + case 2: { + ADD_MOVER(BF_GLOBALS._player, -8, 110); + break; + } + case 3: + scene->_sceneMode = 4; + scene->signal(); + remove(); + break; + } +} + +void Scene340::Action7::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER(254, 121); + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_harrison._position); + scene->_stripManager.start(BF_GLOBALS.getFlag(fBriefedBackup) ? 3414 : 3417, this); + break; + case 2: + BF_GLOBALS.setFlag(fBackupIn350); + BF_GLOBALS._sceneManager.changeScene(350); + break; + } +} + +void Scene340::Action8::signal() { + Scene340 *scene = (Scene340 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_stripManager.start(3400, this); + break; + case 1: + setDelay(2); + break; + case 2: + scene->_object4.setPriority(250); + scene->_object4.setPosition(Common::Point(138, 130)); + scene->_object4.setVisage(347); + scene->_object4.setStrip(6); + scene->_object4.setFrame(1); + scene->_object4._numFrames = 2; + scene->_object4.animate(ANIM_MODE_5, NULL); + scene->_object4.show(); + break; + case 3: + scene->_object4.hide(); + + scene->_woman.setPriority(123); + scene->_woman.setPosition(Common::Point(88, 143)); + scene->_woman.setVisage(344); + scene->_woman.setStrip(2); + scene->_woman.setFrame(1); + scene->_woman.changeZoom(100); + scene->_woman._numFrames = 10; + scene->_woman._moveRate = 10; + scene->_woman._moveDiff = Common::Point(3, 2); + scene->_woman.show(); + + scene->_child.setPriority(120); + scene->_child.setPosition(Common::Point(81, 143)); + scene->_child.setVisage(347); + scene->_child.setStrip(3); + scene->_child.setFrame(1); + scene->_child.changeZoom(100); + scene->_child._numFrames = 10; + scene->_child._moveRate = 10; + scene->_child.show(); + + setDelay(6); + break; + case 4: + remove(); + break; + } +} + +void Scene340::Action8::process(Event &event) { + if ((_actionIndex != 3) || (event.eventType == EVENT_NONE)) + Action::process(event); + else if (event.eventType == EVENT_BUTTON_DOWN) { + event.handled = true; + setDelay(2); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene340::Timer2::signal() { + PaletteRotation *item; + + item = BF_GLOBALS._scenePalette.addRotation(235, 239, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(247, 249, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(240, 246, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(252, 254, 1); + item->setDelay(30); + + remove(); +} + +/*--------------------------------------------------------------------------*/ + +Scene340::Scene340(): PalettedScene() { + _seqNumber1 = _field2652 = _field2654 = 0; +} + +void Scene340::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_seqNumber1); + s.syncAsSint16LE(_field2652); + s.syncAsSint16LE(_field2654); +} + +void Scene340::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(340); + setZoomPercents(126, 70, 162, 100); + + BF_GLOBALS._walkRegions.proc1(13); + BF_GLOBALS._walkRegions.proc1(15); + _timer2.set(2, NULL); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + + _field2652 = 0; + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + _westExit.setDetails(Rect(0, 76, 19, 115), 340, -1, -1, -1, 1, NULL); + _swExit.setDetails(15, 340, -1, -1, -1, 1); + _northExit.setDetails(16, 340, -1, -1, -1, 1); + + BF_GLOBALS._player._regionBitList = 0x10000; + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129); + BF_GLOBALS._player._moveDiff = Common::Point(5, 2); + + if (BF_GLOBALS._dayNumber < 5) { + _object5.postInit(); + _object5.setVisage(340); + _object5.setStrip(4); + _object5.setPosition(Common::Point(259, 61)); + } + + if (!BF_GLOBALS.getFlag(fToldToLeave340)) { + _woman.postInit(); + _woman.setVisage(344); + _woman.setStrip(3); + _woman.setFrame(1); + _woman.fixPriority(123); + _woman.setPosition(Common::Point(88, 143)); + + _object4.postInit(); + _object4.hide(); + + _child.postInit(); + _child.setVisage(347); + _child.setStrip(3); + _child.setFrame(1); + _child.fixPriority(120); + _child.setPosition(Common::Point(81, 143)); + + _woman.setAction(&_sequenceManager2, NULL, 348, &_woman, &_child, &_object4, NULL); + BF_GLOBALS._sceneItems.addItems(&_child, &_woman, NULL); + + _stripManager.addSpeaker(&_jordanSpeaker); + _stripManager.addSpeaker(&_skipBSpeaker); + + BF_GLOBALS.set2Flags(f1097Marina); + } + + if (BF_GLOBALS.getFlag(fCalledBackup)) { + _harrison.postInit(); + _harrison.setVisage(326); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setPosition(Common::Point(-60, 219)); + BF_GLOBALS._sceneItems.push_back(&_harrison); + + _stripManager.addSpeaker(&_harrisonSpeaker); + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _field2654 = 0; + _harrison.setVisage(1355); + _harrison.setPosition(Common::Point(289, 112)); + _harrison.changeAngle(225); + _harrison.setFrame(1); + _harrison.fixPriority(75); + + BF_GLOBALS._walkRegions.proc1(23); + } else if (BF_GLOBALS.getFlag(fBackupArrived340)) { + _field2654 = 1; + _harrison.setPosition(Common::Point(46, 154)); + BF_GLOBALS._walkRegions.proc1(19); + } else if (BF_GLOBALS.getFlag(fCalledBackup) && (BF_GLOBALS._marinaWomanCtr > 0)) { + _timer1.set(900, &_harrison, &_action4); + } + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 350: + _seqNumber1 = 1342; + break; + case 830: + BF_GLOBALS._player._regionBitList |= 0x800; + _seqNumber1 = 1343; + break; + case 60: + _seqNumber1 = 342; + break; + default: + _sound1.fadeSound(35); + BF_GLOBALS._sound1.fadeSound((BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark > bCalledToDomesticViolence) ? 10 : 19); + _seqNumber1 = 342; + break; + } + + _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); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, _seqNumber1, &BF_GLOBALS._player, NULL); +} + +void Scene340::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + PalettedScene::remove(); +} + +void Scene340::signal() { + switch (_sceneMode) { + case 1: + case 2: + BF_GLOBALS._sceneManager.changeScene(350); + break; + case 3: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 4: + BF_GLOBALS._sceneManager.changeScene(830); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene340::process(Event &event) { + // Check for gun being clicked on player + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + SceneItem::display2(350, 26); + + signal(); + event.handled = true; + } + + if (!event.handled) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_westExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); + BF_GLOBALS._events.setCursor(surface); + } else if (_swExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else if (_northExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + 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 Scene340::dispatch() { + SceneExt::dispatch(); + int idx = BF_GLOBALS._player.getRegionIndex(); + + if (idx == 20) { + BF_GLOBALS._player.updateZoom(); + BF_GLOBALS._player.fixPriority(75); + } + if (idx == 26) { + BF_GLOBALS._player.updateZoom(); + } + if (idx == 31) { + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.fixPriority(-1); + } + + if (BF_GLOBALS._player._regionIndex == 16) { + BF_GLOBALS._player._regionBitList &= ~0x10000; + + if (!BF_GLOBALS.getFlag(fBackupArrived340)) { + _sceneMode = 1; + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 254, 110); + } else if (!BF_GLOBALS.getFlag(fBackupIn350)) { + setAction(&_action7); + } else { + _sceneMode = 1; + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 254, 110); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 342 - Marina, Normal + * + *--------------------------------------------------------------------------*/ + +bool Scene342::Lyle::startAction(CursorType action, Event &event) { + Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(340, 16); + return true; + case CURSOR_USE: + SceneItem::display2(340, 15); + return true; + case CURSOR_TALK: + SceneItem::display2(340, 17); + return true; + case INV_COLT45: + scene->gunDisplay(); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene342::Item1::startAction(CursorType action, Event &event) { + Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case INV_COLT45: + scene->gunDisplay(); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene342::WestExit::startAction(CursorType action, Event &event) { + Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4; + setAction(&scene->_sequenceManager1, scene, 1348, &BF_GLOBALS._player, NULL); + return true; +} + +bool Scene342::SouthWestExit::startAction(CursorType action, Event &event) { + Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3; + setAction(&scene->_sequenceManager1, scene, 1340, &BF_GLOBALS._player, NULL); + return true; +} + +bool Scene342::NorthExit::startAction(CursorType action, Event &event) { + Scene342 *scene = (Scene342 *)BF_GLOBALS._sceneManager._scene; + + scene->_sceneMode = 1; + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 254, 106); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene342::Timer1::signal() { + PaletteRotation *item; + + item = BF_GLOBALS._scenePalette.addRotation(235, 239, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(247, 249, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(240, 246, 1); + item->setDelay(30); + item = BF_GLOBALS._scenePalette.addRotation(252, 254, 1); + item->setDelay(30); + + remove(); +} + +/*--------------------------------------------------------------------------*/ + +Scene342::Scene342(): PalettedScene() { + _field1A1A = 0; +} + +void Scene342::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_field1A1A); +} + +void Scene342::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(340); + setZoomPercents(126, 70, 162, 100); + + BF_GLOBALS._walkRegions.proc1(13); + BF_GLOBALS._walkRegions.proc1(15); + + _field1A1A = 0; + _timer1.set(2, NULL); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + _westExit.setDetails(Rect(0, 76, 19, 115), 340, -1, -1, -1, 1, NULL); + _swExit.setDetails(15, 340, -1, -1, -1, 1); + _northExit.setDetails(16, 340, -1, -1, -1, 1); + + if (BF_GLOBALS._dayNumber < 5) { + _object3.postInit(); + _object3.setVisage(340); + _object3.setStrip(4); + _object3.setPosition(Common::Point(259, 61)); + } + + if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.setVisage(1341); + BF_GLOBALS._player._moveDiff = Common::Point(5, 2); + } else { + BF_GLOBALS._player.setVisage(129); + BF_GLOBALS._player._moveDiff = Common::Point(5, 2); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setVisage(469); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.hide(); + } + } + + switch (BF_GLOBALS._randomSource.getRandomNumber(2)) { + case 0: + _object2.setPosition(Common::Point(46, 59)); + ADD_MOVER_NULL(_object2, 300, -10); + break; + case 1: + _object2.setPosition(Common::Point(311, 57)); + ADD_MOVER_NULL(_object2, 140, -10); + break; + case 2: + _object2.setPosition(Common::Point(-5, 53)); + ADD_MOVER_NULL(_object2, 170, -10); + break; + default: + break; + } + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 50: + case 60: + case 330: + if (BF_GLOBALS._sceneManager._previousScene != 60) { + _sound1.fadeSound(35); + BF_GLOBALS._sound1.fadeSound((BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark > bCalledToDomesticViolence) ? 10 : 19); + } + + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._walkRegions.proc1(19); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + + setAction(&_sequenceManager1, this, 346, &_lyle, NULL); + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 342, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 342, &BF_GLOBALS._player, NULL); + } + break; + case 350: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 1342, &BF_GLOBALS._player, NULL); + break; + default: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 1343, &BF_GLOBALS._player, NULL); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.setPosition(Common::Point(-21, 118)); + _lyle.setStrip(5); + _lyle.setFrame(1); + _lyle.setPriority(75); + _lyle.setZoom(75); + _lyle.setAction(&_sequenceManager2, NULL, 347, &_lyle, NULL); + BF_GLOBALS._sceneItems.push_back(&_lyle); + } + break; + } + + _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); +} + +void Scene342::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + PalettedScene::remove(); +} + +void Scene342::signal() { + switch (_sceneMode) { + case 1: + ADD_PLAYER_MOVER(254, 106); + BF_GLOBALS._sceneManager.changeScene(350); + break; + case 3: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 4: + BF_GLOBALS._sceneManager.changeScene(830); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene342::process(Event &event) { + // Check for gun being clicked on player + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + SceneItem::display2(350, 26); + + signal(); + event.handled = true; + } + + if (!event.handled) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_westExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_W); + BF_GLOBALS._events.setCursor(surface); + } else if (_swExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + BF_GLOBALS._events.setCursor(surface); + } else if (_northExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + 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 Scene342::dispatch() { + SceneExt::dispatch(); + int idx = BF_GLOBALS._player.getRegionIndex(); + + if (idx == 20) { + BF_GLOBALS._player.updateZoom(); + BF_GLOBALS._player.fixPriority(75); + } + if (idx == 26) { + BF_GLOBALS._player.updateZoom(); + } + if (idx == 31) { + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.fixPriority(-1); + } + + if (idx == 16) { + BF_GLOBALS._player.enableControl(); + ADD_PLAYER_MOVER(254, 110); + } +} + +/*-------------------------------------------------------------------------- + * Scene 350 - Marina, Outside Boat + * + *--------------------------------------------------------------------------*/ + +bool Scene350::Item5::startAction(CursorType action, Event &event) { + Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(350, 20); + return true; + case CURSOR_USE: { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3; + + Common::Point pt(76, 154); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; + } + default: + return NamedHotspot::startAction(action, event); + } +} + +void Scene350::Yacht::synchronize(Serializer &s) { + NamedHotspot::synchronize(s); + s.syncAsSint16LE(_flag); +} + +bool Scene350::Yacht::startAction(CursorType action, Event &event) { + Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_GLOBALS._dayNumber != 1) || !BF_GLOBALS.getFlag(onDuty) || (BF_GLOBALS._bookmark < bStartOfGame)) { + if ((BF_GLOBALS._dayNumber == 1) || (BF_GLOBALS._dayNumber == 4)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager1, scene, 3512, &BF_GLOBALS._player, &scene->_yachtDoor, NULL); + return true; + } + } else { + _flag = true; + scene->_sceneMode = 1; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(gunDrawn) ? 3504 : 3505, + &BF_GLOBALS._player, &scene->_yachtDoor, NULL); + return true; + } + break; + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +bool Scene350::SouthWestExit::startAction(CursorType action, Event &event) { + BF_GLOBALS._player.disableControl(); + + Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; + scene->_sceneMode = 2; + + if (BF_GLOBALS.getFlag(fBackupIn350)) + scene->setAction(&scene->_sequenceManager1, scene, 3507, &BF_GLOBALS._player, &scene->_harrison, NULL); + else + scene->setAction(&scene->_sequenceManager1, scene, 3510, &BF_GLOBALS._player, NULL); + return true; +} + +/*--------------------------------------------------------------------------*/ + +bool Scene350::Hook::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(350, 30); + return true; + case CURSOR_USE: + BF_INVENTORY.setObjectScene(INV_HOOK, 1); + if (!BF_GLOBALS.getFlag(hookPoints)) { + BF_GLOBALS.setFlag(hookPoints); + BF_GLOBALS._uiElements.addScore(30); + } + remove(); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene350::Object5::startAction(CursorType action, Event &event) { + Scene350 *scene = (Scene350 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(350, BF_INVENTORY.getObjectScene(INV_HOOK) ? 29 : 28); + return true; + case CURSOR_USE: + scene->_object5.remove(); + return true; + case INV_HOOK: + BF_INVENTORY.setObjectScene(INV_HOOK, 350); + + scene->_hook.postInit(); + scene->_hook.setVisage(350); + scene->_hook.setStrip(5); + scene->_hook.fixPriority(201); + scene->_hook.setPosition(Common::Point(106, 146)); + BF_GLOBALS._sceneItems.push_front(&scene->_hook); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene350::Timer1::signal() { + PaletteRotation *rot; + rot = BF_GLOBALS._scenePalette.addRotation(233, 235, 1); + rot->setDelay(40); + rot = BF_GLOBALS._scenePalette.addRotation(236, 238, 1); + rot->setDelay(20); + rot = BF_GLOBALS._scenePalette.addRotation(239, 241, 1); + rot->setDelay(20); + rot = BF_GLOBALS._scenePalette.addRotation(242, 244, 1); + rot->setDelay(12); + + remove(); +} + +/*--------------------------------------------------------------------------*/ + +Scene350::Scene350(): SceneExt() { + _field1D44 = _field1D46 = 0; +} + +void Scene350::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(350); + setZoomPercents(90, 80, 143, 100); + _sound1.fadeSound(35); + _timer1.set(2, NULL); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 352 : 1358); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.setPosition(Common::Point(99, 152)); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + 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); + + if ((BF_GLOBALS._dayNumber != 1) && (BF_GLOBALS._dayNumber != 4)) { + _yacht.setDetails(28, 350, 15, 16, 17, 1); + } else { + _yachtDoor.postInit(); + _yachtDoor.setVisage(350); + _yachtDoor.setStrip(3); + _yachtDoor.setFrame(1); + _yachtDoor.fixPriority(72); + _yachtDoor.setPosition(Common::Point(40, 74)); + + _yachtBody.setup(350, 1, 1, 129, 142, 255); + + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _harrison.postInit(); + _harrison.setVisage(1355); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.changeZoom(-1); + _harrison.setDetails(350, 12, 13, 14, 1, NULL); + _harrison._moveDiff = Common::Point(2, 1); + + _stripManager.addSpeaker(&_harrisonSpeaker); + } + + if (BF_GLOBALS._bookmark < bStartOfGame) { + // Setup scene in debug mode + _yacht.setDetails(28, 350, 6, 18, 19, 1); + } else { + _yacht.setDetails(28, 350, 6, BF_GLOBALS.getFlag(bStartOfGame) ? 7 : 18, 8, 1); + } + } + + _item5._sceneRegionId = 5; + BF_GLOBALS._sceneItems.push_back(&_item5); + _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); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 370: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._uiElements._active = true; + BF_GLOBALS._uiElements.show(); + // Deliberate fall-through + case 355: + if (BF_GLOBALS.getFlag(onDuty) && BF_GLOBALS.getFlag(gunDrawn)) + BF_GLOBALS._player.setVisage(351); + + BF_GLOBALS._player.setPosition(Common::Point(22, 91)); + BF_GLOBALS._player.changeAngle(225); + break; + default: + BF_GLOBALS.clearFlag(gunDrawn); + + if ((BF_GLOBALS._dayNumber == 1) && (BF_GLOBALS._bookmark < bCalledToDomesticViolence) && + BF_GLOBALS.getFlag(fBackupIn350)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 3509, &_harrison, NULL); + BF_GLOBALS._player.setAction(&_sequenceManager2, NULL, 3508, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 3508, &BF_GLOBALS._player, NULL); + } + break; + } +} + +void Scene350::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + SceneExt::remove(); +} + +void Scene350::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._sceneManager.changeScene(355); + break; + case 2: + BF_GLOBALS._sceneManager.changeScene((BF_GLOBALS._dayNumber != 1) || + (BF_GLOBALS._bookmark < bStartOfGame) || (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340); + break; + 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); + + if (BF_INVENTORY.getObjectScene(INV_HOOK) == 350) { + _hook.postInit(); + _hook.setVisage(350); + _hook.setStrip(5); + _hook.fixPriority(201); + _hook.setPosition(Common::Point(106, 146)); + BF_GLOBALS._sceneItems.push_front(&_hook); + } + + BF_GLOBALS._player.enableControl(); + _sound2.play(97); + break; + default: + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _harrison.updateAngle(BF_GLOBALS._player._position); + BF_GLOBALS._walkRegions.proc1(19); + } + + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene350::process(Event &event) { + // Check for gun being clicked on player + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + + if (!BF_GLOBALS.getFlag(onDuty)) { + // Player not on duty + SceneItem::display2(350, 26); + signal(); + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + // Holster the gun + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 3501, &BF_GLOBALS._player, NULL); + + if (BF_GLOBALS.getFlag(fBackupIn350)) + _harrison.setAction(&_sequenceManager3, NULL, 3503, &_harrison, NULL); + } else { + // Drawn the gun + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 3500, &BF_GLOBALS._player, NULL); + + if (BF_GLOBALS.getFlag(fBackupIn350)) + _harrison.setAction(&_sequenceManager3, NULL, 3502, &_harrison, NULL); + + BF_GLOBALS.setFlag(gunDrawn); + } + + event.handled = true; + } + + if (!event.handled) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_swExit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + 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 Scene350::checkGun() { + if ((BF_GLOBALS._dayNumber != 1) || (BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) || BF_GLOBALS.getFlag(fRandomShot350)) { + SceneItem::display2(350, 27); + } else { + BF_GLOBALS.setFlag(fRandomShot350); + if (BF_GLOBALS.getFlag(fBackupIn350)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 3511, &BF_GLOBALS._player, NULL); + } else { + _stripManager.start(3502, this); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 355 - Future Wave Exterior + * + *--------------------------------------------------------------------------*/ + +void Scene355::Doorway::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_v1); + s.syncAsSint16LE(_v2); + s.syncAsSint16LE(_v3); +} + +bool Scene355::Doorway::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 9); + return true; + case CURSOR_USE: + if (!scene->_modeFlag) { + scene->_sceneMode = 9984; + scene->signal(); + } else { + scene->setMode(true, 9984); + } + return true; + case CURSOR_TALK: + if (BF_GLOBALS._dayNumber >= 5) { + switch (_v2) { + case 0: + ++_v2; + BF_GLOBALS._sound1.play(109); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + + BF_GLOBALS.setFlag(fTookTrailerAmmo); + scene->_stripManager.start(3575, scene); + scene->_object7._flag = 1; + return true; + case 1: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(3573, scene); + return true; + default: + break; + } + } else if (!BF_GLOBALS.getFlag(greenTaken) && (BF_GLOBALS._dayNumber == 1)) { + scene->_sceneMode = 1357; + BF_GLOBALS._player.disableControl(); + scene->_stripManager.start(3550, scene); + return true; + } + break; + case INV_WAVE_KEYS: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3562; + scene->setAction(&scene->_sequenceManager, scene, 3562, &BF_GLOBALS._player, NULL); + _v3 = !_v3 ? 1 : 0; + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene355::Locker::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 51); + return true; + case CURSOR_USE: + if (BF_GLOBALS._dayNumber < 5) + SceneItem::display2(355, 46); + else if (BF_INVENTORY.getObjectScene(INV_FLARE) != 355) + SceneItem::display2(355, 45); + else if (scene->_modeFlag) + scene->setMode(true, 9996); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9996; + + if (scene->_nextSceneMode) { + scene->_nextSceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL); + } else { + scene->signal(); + } + } + return true; + case INV_SCREWDRIVER: + if (scene->_modeFlag) + scene->setMode(true, 9996); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9996; + if (!scene->_nextSceneMode) + scene->signal(); + else { + scene->_nextSceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL); + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene355::LockerDoor::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (_frame == 1) + SceneItem::display2(355, 46); + else + SceneItem::display2(355, BF_GLOBALS._sceneObjects->contains(&scene->_object5) ? 26 : 47); + return true; + case CURSOR_USE: + if (_frame == 1) { + SceneItem::display2(355, 23); + return true; + } + return true; + case INV_SCREWDRIVER: + scene->_sound2.play(104); + BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 999); + setFrame(2); + + scene->_object9.postInit(); + scene->_object9.setVisage(378); + scene->_object9.setPosition(Common::Point(83, 100)); + scene->_object9.fixPriority(100); + + scene->_object5.postInit(); + scene->_object5.setVisage(2356); + scene->_object5.setStrip(3); + scene->_object5.setPosition(Common::Point(67, 85)); + scene->_object5.fixPriority(255); + BF_GLOBALS._sceneItems.push_front(&scene->_object5); + + SceneItem::display2(355, 27); + scene->_locker.setFrame(2); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Object5::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 30); + return true; + case CURSOR_USE: + BF_INVENTORY.setObjectScene(INV_FLARE, 1); + BF_GLOBALS._uiElements.addScore(30); + + scene->_object9.remove(); + remove(); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Object6::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 34); + return true; + case CURSOR_USE: + if (scene->_modeFlag) + SceneItem::display2(355, 35); + else if (!_flag) + SceneItem::display2(355, 38); + else if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1) + SceneItem::display2(355, 49); + else { + BF_GLOBALS._player._regionBitList |= 0x10; + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9985; + scene->setAction(&scene->_sequenceManager, scene, 3357, &BF_GLOBALS._player, this, NULL); + } + return true; + case CURSOR_TALK: + scene->_sceneMode = 0; + if (BF_INVENTORY.getObjectScene(INV_GRENADES) != 355) { + scene->_stripManager.start(3584, scene); + } else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) { + return false; + } else { + switch (BF_GLOBALS._v4CEC2) { + case 0: + scene->_stripManager.start(3565, scene); + break; + case 1: + scene->_stripManager.start(3567, scene); + break; + case 2: + scene->_stripManager.start(3571, scene); + break; + } + } + return true; + + default: + if ((action < BF_LAST_INVENT) && scene->_modeFlag) { + SceneItem::display2(355, 35); + return true; + } + + switch (action) { + case INV_COLT45: + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) + SceneItem::display2(355, 39); + else if (!BF_GLOBALS.getFlag(fGunLoaded)) + SceneItem::display2(1, 1); + else if (!BF_GLOBALS.getFlag(gunDrawn)) + SceneItem::display2(1, 0); + else { + if (BF_GLOBALS._sceneObjects->contains(&scene->_object7)) + scene->_object7.setAction(NULL); + + BF_GLOBALS._player.disableControl(); + scene->_object6.setStrip(1); + scene->_object6.setFrame(1); + scene->_sceneMode = 9981; + scene->signal(); + } + return true; + case INV_HANDCUFFS: + if (BF_GLOBALS._v4CEC2 <= 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); + _flag = 1; + BF_GLOBALS._bookmark = bInvestigateBoat; + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Object7::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) { + scene->_stripManager.start((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 355) ? 3578 : 3577, scene); + } else { + switch (_flag) { + case 0: + scene->_stripManager.start(3574, scene); + break; + case 1: + scene->_stripManager.start(3576, scene); + break; + case 2: + scene->_stripManager.start(3563, scene); + break; + default: + break; + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene355::Object8::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 0); + return true; + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fBackupIn350)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9999; + scene->_stripManager.start(3559, scene); + return true; + } else if (BF_GLOBALS._dayNumber < 5) { + SceneItem::display2(355, 52); + return true; + } + break; + case INV_COLT45: + if (BF_GLOBALS.getFlag(fBackupIn350)) { + scene->_sceneMode = 9997; + scene->_stripManager.start(3561, scene); + } else { + SceneItem::display(1, 4); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene355::Item1::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 28); + return true; + case CURSOR_USE: + SceneItem::display2(355, 37); + return true; + case INV_RENTAL_KEYS: + if (scene->_modeFlag) { + scene->_sceneMode = 9980; + scene->signal(); + } else if (!scene->_nextSceneMode) + SceneItem::display2(355, 36); + else + scene->setMode(false, 9980); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene355::Item2::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS.getFlag(fBackupIn350)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9999; + scene->_stripManager.start(3559, scene); + } else { + if (scene->_action) { + scene->_sceneMode = 0; + scene->_action->remove(); + } + + BF_GLOBALS._sceneManager.changeScene(350); + } + return true; +} + +bool Scene355::Item3::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 33); + return true; + case CURSOR_USE: + if (BF_GLOBALS._dayNumber < 5) + SceneItem::display2(355, 21); + else if (scene->_modeFlag) + scene->setMode(true, 9987); + else { + scene->_sceneMode = 9987; + scene->signal(); + } + return true; + case INV_FLARE: + scene->_sound2.play(105); + _state = 3554; + break; + case INV_RAGS: + _state = 3559; + break; + case INV_JAR: + _state = 3558; + break; + default: + return SceneHotspotExt::startAction(action, event); + } + + // Handling for inventory objects + BF_INVENTORY.setObjectScene(action, 0); + if (scene->_modeFlag) + scene->setMode(true, 9986); + else { + scene->_sceneMode = 9986; + scene->signal(); + } + + scene->_nextSceneMode = 0; + return true; +} + +bool Scene355::Item4::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(355, 31); + return true; + case CURSOR_USE: + if ((BF_GLOBALS._dayNumber < 5) || (BF_INVENTORY.getObjectScene(INV_GRENADES) != 355)) + SceneItem::display2(355, 21); + else if (scene->_modeFlag) + scene->setMode(true, 9987); + else { + scene->_sceneMode = 9987; + scene->signal(); + } + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + + +bool Scene355::Item5::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 355) { + if (scene->_modeFlag) { + scene->_sceneMode = 9992; + scene->signal(); + } else if (!scene->_nextSceneMode) { + scene->setMode(false, 9992); + } else { + scene->_sceneMode = 9977; + scene->_nextSceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL); + } + } else { + SceneItem::display2(355, 45); + } + return true; + case INV_RENTAL_KEYS: + if (scene->_modeFlag) { + scene->_sceneMode = 9980; + scene->signal(); + } else if (!scene->_nextSceneMode) { + scene->setMode(false, 9980); + } else { + SceneItem::display2(355, 36); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene355::Item11::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return (BF_GLOBALS._bookmark == bStartOfGame) || (BF_GLOBALS._bookmark == bCalledToDomesticViolence) || + (BF_GLOBALS._bookmark == bArrestedGreen); + case CURSOR_LOOK: + SceneItem::display2(355, 7); + return true; + case CURSOR_USE: + SceneItem::display2(355, 8); + return true; + case CURSOR_TALK: + if (BF_GLOBALS._dayNumber == 5) { + switch (scene->_doorway._v2) { + case 0: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + BF_GLOBALS.setFlag(fTookTrailerAmmo); + scene->_stripManager.start(3575, scene); + scene->_object7._flag = 1; + scene->_doorway._v2 = 1; + break; + case 1: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(3573, scene); + break; + default: + return false; + } + } else { + if (!BF_GLOBALS.getFlag(onDuty)) + return false; + scene->_sceneMode = 1357; + BF_GLOBALS._player.disableControl(); + scene->_stripManager.start(3550, scene); + } + return true; + case INV_COLT45: + if (!BF_GLOBALS.getFlag(fBackupIn350) || !BF_GLOBALS.getFlag(gunDrawn) || !BF_GLOBALS.getFlag(fGunLoaded)) + SceneItem::display2(1, 4); + else { + scene->_sceneMode = 9997; + BF_GLOBALS._player.disableControl(); + scene->_stripManager.start(3561, scene); + } + return true; + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +bool Scene355::Item12::startAction(CursorType action, Event &event) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + if (!BF_GLOBALS.getFlag(gunDrawn)) { + if (scene->_modeFlag) + scene->setMode(true, 0); + else if (!scene->_nextSceneMode) + scene->setMode(false, 0); + else { + scene->_nextSceneMode = 0; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 3555, &BF_GLOBALS._player, NULL); + } + } + + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene355::Action1::signal() { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(3600 * (BF_GLOBALS._randomSource.getRandomNumber(1) + 1)); + break; + case 1: + _actionIndex = 0; + scene->_object7.animate(ANIM_MODE_8, 1, this); + break; + default: + break; + } +} + +void Scene355::Action2::signal() { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + scene->_stripManager.start((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) ? 3566 : 3568, this); + break; + case 2: + scene->_sceneMode = 9979; + scene->signal(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene355::Scene355(): PalettedScene() { + _nextSceneMode = 0; + _modeFlag = false; +} + +void Scene355::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_nextSceneMode); + s.syncAsSint16LE(_modeFlag); +} + +void Scene355::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 5; + + if (BF_GLOBALS._dayNumber == 5) { + loadScene(356); + BF_GLOBALS._player._regionBitList &= ~0x10; + } else { + loadScene(355); + } + + _sound1.fadeSound(35); + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + if (!BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.setVisage(356); + BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount()); + } else { + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setVisage(356); + BF_GLOBALS._player.setStrip(7); + } + + if (BF_GLOBALS.getFlag(greenTaken)) { + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setPosition(Common::Point(244, 140)); + } else { + BF_GLOBALS._player.setPosition(Common::Point(244, 132)); + } + + BF_GLOBALS._player._moveDiff = Common::Point(6, 4); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + + _item4._sceneRegionId = 17; + BF_GLOBALS._sceneItems.push_back(&_item4); + + _locker.postInit(); + _locker.setVisage(2356); + _locker.setPosition(Common::Point(88, 99)); + + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) { + _locker.setFrame(2); + + if (BF_INVENTORY.getObjectScene(INV_FLARE) == 355) { + _object9.postInit(); + _object9.setVisage(378); + _object9.setPosition(Common::Point(83, 100)); + _object9.fixPriority(100); + } + } + BF_GLOBALS._sceneItems.push_back(&_locker); + + _doorway.postInit(); + _doorway.setVisage(355); + _doorway.setPosition(Common::Point(193, 105)); + _doorway.fixPriority(18); + _doorway._v1 = 0; + _doorway._v3 = 0; + BF_GLOBALS._sceneItems.push_back(&_doorway); + + switch (BF_GLOBALS._dayNumber) { + case 1: + if (!BF_GLOBALS.getFlag(onDuty)) + _doorway._v3 = 1; + else if (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 320) + _doorway._v3 = 1; + break; + case 2: + case 3: + case 4: + _doorway._v3 = 1; + break; + default: + break; + } + + if (BF_GLOBALS._dayNumber == 5) + _doorway._v2 = BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 1 : 0; + + _object8.postInit(); + _object8.setVisage(355); + if (BF_GLOBALS._dayNumber == 5) { + _object8.setStrip(3); + _object8.setPosition(Common::Point(103, 148)); + _object8.hide(); + } else { + _object8.setStrip(2); + _object8.setPosition(Common::Point(142, 151)); + _object8.fixPriority(247); + } + + switch (BF_GLOBALS._dayNumber) { + case 2: + case 3: + case 4: + break; + case 5: + BF_GLOBALS._player.disableControl(); + _modeFlag = true; + BF_GLOBALS._player.setPosition(Common::Point(133, 173)); + BF_GLOBALS._player.fixPriority(249); + BF_GLOBALS._player.setStrip(7); + + if (BF_GLOBALS._bookmark == bDoneAtLyles) + BF_GLOBALS._bookmark = bEndDayFour; + + _item5.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); + } + + if ((BF_INVENTORY.getObjectScene(INV_RAGS) == 0) && (BF_INVENTORY.getObjectScene(INV_JAR) == 0) && + (BF_INVENTORY.getObjectScene(INV_FLARE) == 0)) { + BF_GLOBALS._sound1.changeSound(103); + + _object9.postInit(); + _object9.setVisage(2357); + _object9.setStrip(2); + _object9.setPosition(Common::Point(231, 19)); + _object9.animate(ANIM_MODE_2); + + _object11.postInit(); + _object11.setVisage(2357); + _object11.setStrip(6); + _object11.setPosition(Common::Point(183, 39)); + _object11.animate(ANIM_MODE_2); + + _doorway.setPosition(Common::Point(146, 107)); + _doorway._v3 = 0; + _doorway._v2 = 2; + _object7._flag = 2; + + _object6.postInit(); + BF_GLOBALS._sceneItems.push_back(&_object6); + + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) { + _object6.setVisage(376); + _object6.setStrip(1); + _object6.setPosition(Common::Point(193, 88)); + _object6._flag = 0; + } else { + _object6._flag = 1; + + if (BF_INVENTORY.getObjectScene(INV_GRENADES) == 1) { + _object6.setVisage(373); + _object6.setStrip(5); + _object6.setPosition(Common::Point(238, 142)); + } else { + _object6.setVisage(375); + _object6.setStrip(1); + _object6.setFrame(_object6.getFrameCount()); + _object6.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(); + + _sceneMode = 0; + _stripManager.start(3582, this); + } + break; + default: + if (!BF_GLOBALS.getFlag(greenTaken)) { + _harrison.postInit(); + _harrison.setPosition(Common::Point(152, 131)); + _harrison.animate(ANIM_MODE_1, NULL); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + + if (BF_GLOBALS.getFlag(gunDrawn)) { + _harrison.setVisage(357); + _harrison.setStrip(2); + } else { + _harrison.setVisage(1363); + _harrison.setStrip(3); + } + + _harrison.hide(); + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _harrison.show(); + BF_GLOBALS._sceneItems.push_back(&_harrison); + } + + _sceneMode = 1355; + setAction(&_sequenceManager, this, 1355, NULL); + } + break; + } + + _harrison.setDetails(355, 18, 20, 19, 1, NULL); + _item6.setDetails(10, 355, 2, -1, 14, 1); + _item7.setDetails(11, 355, 3, -1, 15, 1); + _item8.setDetails(12, 355, 4, -1, 8, 1); + _item9.setDetails(13, 355, 5, -1, -1, 1); + _item10.setDetails(15, 355, 10, -1, 11, 1); + _item1._sceneRegionId = 22; + 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); + } else { + _item2.setDetails(Rect(273, 53, 320, 101), 355, -1, -1, -1, 2, NULL); + } + + _item11.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + BF_GLOBALS._sceneItems.push_back(&_item11); +} + +void Scene355::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 12: + SceneItem::display2(355, 22); + BF_GLOBALS._player.enableControl(); + break; + case 1355: + BF_GLOBALS._player.disableControl(); + _sceneMode = 9999; + _stripManager.start(BF_GLOBALS.getFlag(fBackupIn350) ? 3559 : 3554, this); + break; + case 1356: + switch (_doorway._v1) { + case 0: + ++_doorway._v1; + _sceneMode = 9999; + _stripManager.start(3550, this); + break; + case 1: + _sceneMode = 9999; + _stripManager.start(3551, this); + ++_doorway._v1; + break; + default: + break; + } + break; + case 2357: + _harrison.animate(ANIM_MODE_1, NULL); + // Deliberate fall-through + case 1357: + BF_GLOBALS._player.enableControl(); + if (BF_GLOBALS.getFlag(gunDrawn)) + BF_GLOBALS._player._canWalk = false; + break; + case 1359: + BF_GLOBALS._sceneManager.changeScene(360); + break; + case 2358: + if (!BF_GLOBALS.getFlag(fBackupIn350)) + BF_GLOBALS._sceneManager.changeScene(360); + else { + _sceneMode = 1359; + setAction(&_sequenceManager, this, BF_GLOBALS.getFlag(gunDrawn) ? 1359 : 3550, &_harrison, NULL); + } + break; + case 3553: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + case 3554: + BF_GLOBALS._player.disableControl(); + _sceneMode = 9988; + setAction(&_sequenceManager, this, 3554, &BF_GLOBALS._player, NULL); + break; + case 3556: + if (BF_GLOBALS._player._angle == 45) { + _sceneMode = 4554; + signal(); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 4554; + setAction(&_sequenceManager, this, 3556, &BF_GLOBALS._player, NULL); + } + break; + case 3558: + BF_GLOBALS._player.disableControl(); + _sceneMode = 9988; + setAction(&_sequenceManager, this, 3558, &BF_GLOBALS._player, NULL); + break; + case 3559: + BF_GLOBALS._player.disableControl(); + _sceneMode = 9988; + setAction(&_sequenceManager, this, 3559, &BF_GLOBALS._player, NULL); + break; + case 3561: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1357; + setAction(&_sequenceManager, this, 3561, &BF_GLOBALS._player, NULL); + break; + case 3562: + if (!BF_GLOBALS.getFlag(unlockBoat)) { + BF_GLOBALS.setFlag(unlockBoat); + BF_GLOBALS._uiElements.addScore(10); + } + + SceneItem::display(355, !_doorway._v3 ? 24 : 25); + BF_GLOBALS._player.enableControl(); + break; + case 4550: + BF_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; + BF_GLOBALS._player.enableControl(); + break; + case 4552: + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 4554: + BF_GLOBALS._player.disableControl(); + switch (_nextSceneMode) { + case 9980: + _sceneMode = 9980; + break; + case 9992: + _sceneMode = 0; + break; + default: + _sceneMode = 9992; + break; + } + setAction(&_sequenceManager, this, 4554, &BF_GLOBALS._player, NULL); + _nextSceneMode = 0; + _modeFlag = true; + break; + case 9977: + setMode(false, 9992); + break; + case 9979: + _sceneMode = 0; + signal(); + break; + case 9980: + _sceneMode = 9982; + ADD_MOVER(BF_GLOBALS._player, 64, 173); + break; + case 9981: + _sceneMode = 9994; + _object6.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); + _stripManager.start(3581, this); + } else { + BF_GLOBALS._player.updateAngle(_object7._position); + _stripManager.start(3570, this); + } + } else { + if (BF_GLOBALS.getFlag(fLyleOnIsland)) { + if (BF_GLOBALS._sceneObjects->contains(&_object6)) { + BF_INVENTORY.setObjectScene(INV_GRENADES, 860); + _stripManager.start(3583, this); + } else { + signal(); + } + } else { + BF_GLOBALS._player.updateAngle(_object7._position); + _stripManager.start(BF_GLOBALS.getFlag(fTookTrailerAmmo) ? 3579 : 3580, this); + } + } + break; + case 9983: + BF_GLOBALS._sceneManager.changeScene(860); + break; + case 9984: + if (BF_GLOBALS._dayNumber == 5) { + _sceneMode = 0; + switch (_doorway._v2) { + case 0: + BF_GLOBALS._sound1.play(109); + BF_GLOBALS.setFlag(fTookTrailerAmmo); + _stripManager.start(3575, this); + _object7._flag = 1; + ++_doorway._v2; + break; + case 1: + _stripManager.start(3573, this); + break; + default: + SceneItem::display2(355, 21); + BF_GLOBALS._player.enableControl(); + break; + } + } else if (BF_GLOBALS.getFlag(greenTaken) || (BF_GLOBALS._dayNumber > 1)) { + if (_doorway._v3) { + SceneItem::display2(355, 23); + _sceneMode = 0; + signal(); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 2358; + setAction(&_sequenceManager, this, 3551, &BF_GLOBALS._player, &_doorway, NULL); + } + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 1356; + setAction(&_sequenceManager, this, 1358, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = 1356; + setAction(&_sequenceManager, this, 1356, &BF_GLOBALS._player, NULL); + } + break; + case 9985: + _sceneMode = 0; + _stripManager.start(3569, this); + BF_INVENTORY.setObjectScene(INV_GRENADES, 1); + BF_GLOBALS._uiElements.addScore(50); + BF_GLOBALS._player._regionBitList |= 0x10; + break; + case 9986: + if (_nextSceneMode) { + _sceneMode = _item3._state; + signal(); + } else { + BF_GLOBALS._player.disableControl(); + _sceneMode = _item3._state; + setAction(&_sequenceManager, this, 3553, &BF_GLOBALS._player, NULL); + } + break; + case 9987: + if (_nextSceneMode) { + _nextSceneMode = 0; + BF_GLOBALS._player.disableControl(); + _sceneMode = 3555; + setAction(&_sequenceManager, this, 3555, &BF_GLOBALS._player, NULL); + } else { + _nextSceneMode = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 3553; + setAction(&_sequenceManager, this, 3553, &BF_GLOBALS._player, NULL); + } + break; + case 9988: + BF_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; + + _object9.postInit(); + _object9.setPosition(Common::Point(-10, -10)); + _object10.postInit(); + _object10.setPosition(Common::Point(-10, -10)); + _object11.postInit(); + _object11.setPosition(Common::Point(-10, -10)); + + BF_GLOBALS._sceneItems.push_front(&_object6); + 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); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 9989: + _lockerDoor.postInit(); + _lockerDoor.setVisage(2356); + _lockerDoor.setStrip(2); + BF_GLOBALS._sceneItems.push_front(&_lockerDoor); + + if (BF_INVENTORY.getObjectScene(INV_SCREWDRIVER) == 999) { + _lockerDoor.setFrame(2); + if (BF_INVENTORY.getObjectScene(INV_FLARE) == 355) { + _object5.postInit(); + _object5.setVisage(2356); + _object5.setStrip(3); + _object5.setPosition(Common::Point(67, 85)); + _object5.fixPriority(255); + BF_GLOBALS._sceneItems.push_front(&_object5); + } + } else { + _lockerDoor.setFrame(1); + } + + _lockerDoor.setPosition(Common::Point(82, 115)); + _lockerDoor.fixPriority(254); + BF_GLOBALS._player.enableControl(); + break; + case 9990: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3556; + ADD_PLAYER_MOVER(145, 145); + break; + case 9991: + setMode(false, 0); + break; + case 9992: + _sceneMode = 9993; + ADD_PLAYER_MOVER(59, 174); + break; + case 9993: + BF_INVENTORY.setObjectScene(INV_SCREWDRIVER, 1); + SceneItem::display2(355, 29); + BF_GLOBALS._uiElements.addScore(30); + _sceneMode = 0; + signal(); + break; + case 9996: { + _sceneMode = 9989; + ADD_PLAYER_MOVER(116, 146); + break; + } + case 9997: + _sceneMode = 9999; + _doorway._v1 = 2; + _stripManager.start(3562, this); + break; + case 9998: + error("Talkdoor state"); + break; + case 9999: + if (_doorway._v1 != 2) { + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + } else if (BF_GLOBALS.getFlag(gunDrawn)) { + _sceneMode = 2358; + setAction(&_sequenceManager, this, 2359, &BF_GLOBALS._player, &_doorway, &_harrison, NULL); + } else { + _sceneMode = 2358; + setAction(&_sequenceManager, this, 2358, &BF_GLOBALS._player, &_doorway, &_harrison, NULL); + } + break; + case 0: + case 3555: + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +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))) { + // Check if the cursor is on an exit + if (_item12.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); + } + } + + // Special handling of actions + if (event.eventType == EVENT_BUTTON_DOWN) { + switch (BF_GLOBALS._events.getCursor()) { + case INV_COLT45: + if (BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.addMover(NULL); + + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS.clearFlag(gunDrawn); + BF_GLOBALS._player.disableControl(); + _sceneMode = 1357; + setAction(&_sequenceManager, this, 3560, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS.setFlag(gunDrawn); + if (_modeFlag) { + setMode(true, 3561); + } else { + _sceneMode = 3561; + signal(); + } + } + } + break; + case CURSOR_WALK: + if (BF_GLOBALS.getFlag(gunDrawn)) + event.handled = true; + break; + case CURSOR_LOOK: + case CURSOR_TALK: + break; + case CURSOR_USE: + if (BF_GLOBALS.getFlag(gunDrawn)) { + SceneItem::display2(355, 50); + event.handled = true; + } + break; + default: + if (BF_GLOBALS.getFlag(gunDrawn)) { + SceneItem::display2(355, 50); + event.handled = true; + } + 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); +} + +void Scene355::dispatch() { + PalettedScene::dispatch(); + if (BF_GLOBALS._sceneObjects->contains(&_object7)) { + _object7.updateAngle(BF_GLOBALS._player._position); + } + + if (!_action && (BF_GLOBALS._player.getRegionIndex() == 20)) { + ADD_MOVER(BF_GLOBALS._player, 238, 142); + } +} + +void Scene355::setMode(bool mode, int sceneMode) { + Scene355 *scene = (Scene355 *)BF_GLOBALS._sceneManager._scene; + + if (mode) { + BF_GLOBALS._player.disableControl(); + _sceneMode = sceneMode; + setAction(&scene->_sequenceManager, this, 4553, &BF_GLOBALS._player, NULL); + _modeFlag = false; + } else { + _sceneMode = 9990; + _nextSceneMode = sceneMode; + signal(); + } +} + +/*-------------------------------------------------------------------------- + * Scene 360 - Future Wave Interior + * + *--------------------------------------------------------------------------*/ + +bool Scene360::Item1::startAction(CursorType action, Event &event) { + Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 9); + return true; + case CURSOR_TALK: + scene->_sceneMode = 3607; + BF_GLOBALS._player.disableControl(); + scene->_stripManager.start(3550, this); + return true; + case INV_COLT45: + SceneItem::display2(1, 4); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene360::Item2::startAction(CursorType action, Event &event) { + Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 10); + return true; + case CURSOR_USE: + if (BF_GLOBALS._dayNumber != 4) + SceneItem::display2(360, 5); + else + scene->setAction(&scene->_action1); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene360::Item3::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 11); + return true; + case CURSOR_USE: + SceneItem::display2(360, 12); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +bool Scene360::Barometer::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 15); + return true; + case CURSOR_USE: + SceneItem::display2(360, 16); + return true; + default: + return SceneHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene360::SlidingDoor::startAction(CursorType action, Event &event) { + Scene360 *scene = (Scene360 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 0); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(greenTaken)) { + scene->_sceneMode = 3611; + setAction(&scene->_sequenceManager1, scene, 3611, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 3604; + setAction(&scene->_sequenceManager1, scene, 3604, &BF_GLOBALS._player, NULL); + } + return true; + case CURSOR_TALK: + scene->_sceneMode = 3607; + BF_GLOBALS._player.disableControl(); + scene->_stripManager.start(3550, scene); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene360::Window::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 13); + return true; + case CURSOR_USE: + SceneItem::display2(360, 14); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene360::Object4::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 3); + return true; + case CURSOR_USE: + SceneItem::display2(360, 2); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene360::BsseballCards::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + if (event.mousePos.x >= (_bounds.left + _bounds.width() / 2)) + SceneItem::display2(360, 4); + else + SceneItem::display2(360, 22); + return true; + case CURSOR_USE: + SceneItem::display2(360, 2); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene360::Object6::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 6); + return true; + case CURSOR_USE: + SceneItem::display2(360, 7); + return true; + case CURSOR_TALK: + SceneItem::display2(360, 8); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene360::Object7::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(360, 1); + return true; + case CURSOR_USE: + SceneItem::display2(360, 21); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene360::Action1::signal() { + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER(153, 115); + break; + case 1: + BF_GLOBALS._player.setStrip(7); + if (BF_INVENTORY.getObjectScene(INV_WAREHOUSE_KEYS) == 360) { + SceneItem::display2(360, 20); + BF_INVENTORY.setObjectScene(INV_WAREHOUSE_KEYS, 1); + BF_GLOBALS._uiElements.addScore(30); + } else { + SceneItem::display2(360, 5); + } + + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene360::Scene360() { + _field380 = 0; +} + +void Scene360::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field380); +} + +void Scene360::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(760); + setZoomPercents(108, 90, 135, 100); + _sound1.play(125); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + + _item2._sceneRegionId = 11; + BF_GLOBALS._sceneItems.push_back(&_item2); + + _slidingDoor.postInit(); + _slidingDoor.setVisage(760); + _slidingDoor.setPosition(Common::Point(42, 120)); + _slidingDoor.setStrip(2); + _slidingDoor.fixPriority(85); + BF_GLOBALS._sceneItems.push_back(&_slidingDoor); + + _window.postInit(); + _window.setVisage(760); + _window.setStrip(4); + _window.setPosition(Common::Point(176, 43)); + _window.fixPriority(10); + _window._numFrames = 2; + _window.animate(ANIM_MODE_8, 0, NULL); + BF_GLOBALS._sceneItems.push_back(&_window); + + _object4.postInit(); + _object4.setVisage(760); + _object4.setStrip(5); + _object4.setPosition(Common::Point(157, 75)); + _object4.fixPriority(50); + BF_GLOBALS._sceneItems.push_back(&_object4); + + if (BF_GLOBALS._dayNumber <= 1) { + _object7.postInit(); + _object7.setVisage(760); + _object7.setStrip(1); + _object7.setPosition(Common::Point(246, 105)); + _object7.fixPriority(50); + BF_GLOBALS._sceneItems.push_back(&_object7); + + _baseballCards.postInit(); + _baseballCards.setVisage(760); + _baseballCards.setStrip(6); + _baseballCards.setPosition(Common::Point(159, 115)); + _baseballCards.fixPriority(50); + BF_GLOBALS._sceneItems.push_back(&_baseballCards); + } + + BF_GLOBALS._player.postInit(); + if (BF_GLOBALS.getFlag(onDuty)) { + if (BF_GLOBALS.getFlag(gunDrawn)) { + BF_GLOBALS._player.setVisage(1351); + BF_GLOBALS._player._moveDiff.x = 5; + } else { + BF_GLOBALS._player.setVisage(361); + BF_GLOBALS._player._moveDiff.x = 6; + } + } else { + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player._moveDiff.x = 6; + } + + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player.setPosition(Common::Point(340, 160)); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + 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 { + 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); + } + + _sceneMode = 3607; + if (BF_GLOBALS.getFlag(greenTaken)) { + _slidingDoor.setPosition(Common::Point(42, 120)); + } else { + BF_GLOBALS._player.disableControl(); + + _object2.postInit(); + _object2.setPosition(Common::Point(-40, -40)); + + _slidingDoor.setPosition(Common::Point(6, 130)); + _slidingDoor.setAction(&_sequenceManager1, this, 3606, &_slidingDoor, &_object7, NULL); + } + } + + _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)); + BF_GLOBALS._sceneItems.push_back(&_item1); +} + +void Scene360::signal() { + switch (_sceneMode) { + case 3600: + case 3611: + BF_GLOBALS._sceneManager.changeScene(370); + break; + case 3602: + 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)); + _sceneMode = 3610; + setAction(&_sequenceManager1, this, 3610, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL); + break; + case 3603: + _sceneMode = 3605; + 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); + break; + case 3605: + if (BF_GLOBALS.getFlag(fBackupIn350)) { + _sceneMode = 3600; + setAction(&_sequenceManager1, this, 3600, NULL); + } else { + BF_GLOBALS._deathReason = BF_GLOBALS.getFlag(fBackupIn350) ? 2 : 1; + _sceneMode = 3610; + setAction(&_sequenceManager1, this, 3601, &BF_GLOBALS._player, NULL); + } + break; + case 3607: + case 3609: + _object6.setVisage(1363); + BF_GLOBALS._player.enableControl(); + break; + case 3608: + BF_GLOBALS._sceneManager.changeScene(355); + break; + case 3610: + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9998: + BF_GLOBALS._player.setVisage(1351); + BF_GLOBALS._player._moveDiff.x = 5; + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.enableControl(); + break; + case 9999: + BF_GLOBALS._player.setVisage(361); + BF_GLOBALS._player._moveDiff.x = 6; + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene360::process(Event &event) { + SceneExt::process(event); + + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(greenTaken)) { + // Player clicked gun on themselves + if (BF_GLOBALS.getFlag(gunDrawn)) { + // Handle holstering gun + if (BF_GLOBALS._player._position.x <= 160) + SceneItem::display2(360, 18); + else { + if (BF_GLOBALS.getFlag(fBackupIn350)) + SceneItem::display2(360, 19); + + BF_GLOBALS.clearFlag(gunDrawn); + _sceneMode = 9999; + BF_GLOBALS._player.setVisage(1361); + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount()); + BF_GLOBALS._player.animate(ANIM_MODE_6, this); + + _object6.setVisage(1363); + } + } else { + // Handle drawing gun + if (BF_GLOBALS.getFlag(fBackupIn350)) + SceneItem::display2(360, 19); + + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.addMover(NULL); + BF_GLOBALS._player.setVisage(1361); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + + BF_GLOBALS.setFlag(gunDrawn); + _sceneMode = 9998; + _object6.setVisage(363); + } + + event.handled = true; + } +} + +void Scene360::dispatch() { + SceneExt::dispatch(); + + if (!_action) { + if (BF_GLOBALS._player.getRegionIndex() == 8) { + // Leaving the boat + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(fBackupIn350)) { + BF_GLOBALS._player.addMover(NULL); + _sceneMode = 3609; + setAction(&_sequenceManager1, this, 3609, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._sceneManager.changeScene(355); + } + } + + if ((BF_GLOBALS._player._position.x <= 168) && !BF_GLOBALS.getFlag(greenTaken) && + !BF_GLOBALS.getFlag(gunDrawn)) { + // Moving to doorway without drawn gun before Green is captured + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.addMover(NULL); + _sceneMode = 3602; + setAction(&_sequenceManager1, this, 3602, &_slidingDoor, &_object2, &BF_GLOBALS._player, NULL); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 370 - Future Wave Bedroom + * + *--------------------------------------------------------------------------*/ + +bool Scene370::GreensGun::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, 4); + return true; + case CURSOR_USE: + if ((BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) || BF_GLOBALS.getFlag(greenTaken)) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(3); + scene->_sceneMode = 3711; + scene->setAction(&scene->_sequenceManager, scene, 3711, &BF_GLOBALS._player, this, NULL); + } else { + SceneItem::display2(370, 5); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene370::Green::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, (_v2 < 3) ? 10 : 0); + return true; + case CURSOR_USE: + if (_v2 != 3) + SceneItem::display2(370, 1); + else if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) + SceneItem::display2(370, 26); + else if (BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 1) { + scene->_sceneMode = 2; + scene->_stripManager.start(3717, scene); + } else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(3); + scene->_sceneMode = 3715; + scene->setAction(&scene->_sequenceManager, scene, 3715, &BF_GLOBALS._player, this, NULL); + } + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + switch (_v2) { + case 0: + ++_v2; + scene->_sceneMode = 3706; + scene->setAction(&scene->_sequenceManager, scene, 3706, NULL); + break; + case 1: + ++_v2; + scene->_sceneMode = 3707; + + scene->_object5.postInit(); + scene->_object5.setVisage(362); + scene->_object5.setStrip(3); + scene->_object5.setPosition(scene->_harrison._position); + scene->_object5.hide(); + + scene->setAction(&scene->_sequenceManager, scene, 3707, &scene->_harrison, &scene->_object5, NULL); + break; + case 2: + ++_v2; + scene->_sceneMode = 3708; + scene->setAction(&scene->_sequenceManager, scene, 3708, this, &scene->_laura, &scene->_harrison, + &scene->_object5, &scene->_greensGun, NULL); + break; + case 3: + scene->_sceneMode = BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1 ? 3713 : 2; + scene->_stripManager.start(3717, scene); + break; + default: + break; + } + return true; + case INV_COLT45: + if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 370) || (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 1)) + SceneItem::display2(370, 28); + else if (!BF_GLOBALS.getHasBullets()) + SceneItem::display2(1, 1); + else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._deathReason = 9; + scene->_sceneMode = 3702; + scene->setAction(&scene->_sequenceManager, scene, 3702, &BF_GLOBALS._player, this, &scene->_harrison, NULL); + } + return true; + case INV_HANDCUFFS: + if (_v2 != 3) + SceneItem::display2(370, 2); + else { + BF_GLOBALS._uiElements.addScore(50); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3704; + scene->setAction(&scene->_sequenceManager, scene, 3704, &BF_GLOBALS._player, this, &scene->_harrison, NULL); + } + return true; + case INV_MIRANDA_CARD: + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) == 1) + SceneItem::display2(370, 5); + else if (BF_GLOBALS.getFlag(readGreenRights)) + SceneItem::display2(390, 15); + else { + BF_GLOBALS.setFlag(readGreenRights); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.updateAngle(this->_position); + scene->_sceneMode = 3717; + scene->setAction(&scene->_sequenceManager, scene, 3717, &BF_GLOBALS._player, NULL); + } + return true; + default: + break; + } + + return NamedObject2::startAction(action, event); +} + +bool Scene370::Harrison::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, 8); + return true; + case CURSOR_TALK: + if (scene->_green._v2 != 3) { + scene->_sceneMode = 3; + scene->_stripManager.start(3714, scene); + } else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 1) || + ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 1) && BF_GLOBALS._sceneObjects->contains(&scene->_laura))) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3716; + scene->setAction(&scene->_sequenceManager, scene, 3716, &BF_GLOBALS._player, &scene->_green, this, NULL); + } else { + BF_GLOBALS._player.updateAngle(this->_position); + scene->_stripManager.start(3715, scene); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene370::Laura::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, 11); + return true; + case CURSOR_USE: + SceneItem::display2(370, BF_GLOBALS._sceneObjects->contains(&scene->_green) ? 12 : 13); + return true; + case CURSOR_TALK: + if (BF_INVENTORY.getObjectScene(INV_HANDCUFFS) != 1) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3705; + scene->setAction(&scene->_sequenceManager, scene, 3705, &BF_GLOBALS._player, this, NULL); + return true; + } + // Deliberate fall-through + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene370::Item1::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, 15); + return true; + case CURSOR_USE: + SceneItem::display2(370, 16); + return true; + case 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 NamedHotspot::startAction(action, event); + } +} + +bool Scene370::Item6::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(370, 14); + return true; + case CURSOR_USE: + SceneItem::display2(370, 29); + return true; + case 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(); + 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 SceneHotspot::startAction(action, event); + } +} + + +bool Scene370::Exit::startAction(CursorType action, Event &event) { + Scene370 *scene = (Scene370 *)BF_GLOBALS._sceneManager._scene; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) + return false; + else { + ADD_PLAYER_MOVER(event.mousePos.x, event.mousePos.y); + return true; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene370::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(370); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_lauraSpeaker); + _stripManager.addSpeaker(&_lauraHeldSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1351); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setStrip(8); + BF_GLOBALS._player.setPosition(Common::Point(310, 153)); + BF_GLOBALS._player._moveDiff = Common::Point(7, 2); + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS.getFlag(greenTaken)) { + // Green has already been arrested + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player._moveDiff.x = 6; + BF_GLOBALS._player.enableControl(); + } else { + // Hostage scene setup + _green.postInit(); + _green.setVisage(373); + _green.setStrip(2); + _green._numFrames = 5; + _green.setPosition(Common::Point(164, 137)); + _green.animate(ANIM_MODE_7, 0, NULL); + _green.fixPriority(125); + BF_GLOBALS._sceneItems.push_back(&_green); + + _laura.postInit(); + _laura.setVisage(374); + _laura.setStrip(2); + _laura.setPosition(_green._position); + _laura.hide(); + _laura.animate(ANIM_MODE_1, NULL); + + _harrison.postInit(); + _harrison.setVisage(372); + _harrison.setPosition(Common::Point(256, 166)); + BF_GLOBALS._sceneItems.push_back(&_harrison); + + _sceneMode = 3700; + setAction(&_sequenceManager, this, 3700, NULL); + } + + if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 320) && (BF_INVENTORY.getObjectScene(INV_GREENS_GUN) != 1)) { + _greensGun.postInit(); + _greensGun.setVisage(362); + _greensGun.setStrip(6); + _greensGun.setPosition(_green._position); + _greensGun.fixPriority(149); + _greensGun.hide(); + } + + if ((BF_INVENTORY.getObjectScene(INV_GREENS_GUN) == 370) && (BF_GLOBALS._dayNumber == 1)) { + _greensGun.setPosition(Common::Point(172, 137)); + _greensGun.show(); + BF_GLOBALS._sceneItems.push_front(&_greensGun); + } + + _item1._sceneRegionId = 8; + BF_GLOBALS._sceneItems.push_back(&_item1); + _item2.setDetails(9, 370, 17, -1, 18, 1); + _item3.setDetails(10, 370, 19, -1, 20, 1); + _item4.setDetails(11, 370, 21, -1, 22, 1); + _item5.setDetails(12, 370, 23, -1, 24, 1); + _exit.setDetails(Rect(316, 133, 320, 166), 360, -1, -1, -1, 1, NULL); + _item6.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); + + BF_GLOBALS._sceneItems.push_back(&_item6); + BF_GLOBALS._sceneItems.remove(&BF_GLOBALS._player); + BF_GLOBALS._sceneItems.push_back(&BF_GLOBALS._player); +} + +void Scene370::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._bookmark = bArrestedGreen; + BF_GLOBALS._sceneManager.changeScene(350); + break; + case 2: + case 3717: + BF_GLOBALS._player.enableControl(); + break; + case 3: + break; + case 3707: + _object5.setDetails(370, 6, -1, 7, 1, NULL); + BF_GLOBALS._sceneItems.push_back(&_object5); + // Deliberate fall-through + case 3700: + case 3706: + _green.setAction(&_sequenceManager, this, 3701, NULL); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + case 3701: + BF_GLOBALS._player.disableControl(); + setAction(&_sequenceManager, this, 3710, NULL); + break; + case 3702: + // Player tried to shoot Green + BF_GLOBALS._deathReason = 2; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3703: + // Player dropped his gun + BF_GLOBALS._deathReason = 9; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3704: + BF_GLOBALS.clearFlag(gunDrawn); + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 390); + BF_GLOBALS._player.setVisage(361); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setStrip(3); + + BF_GLOBALS._sceneItems.push_front(&_laura); + BF_GLOBALS._walkRegions.proc1(3); + _harrison.setAction(NULL); + BF_GLOBALS._player.enableControl(); + + BF_GLOBALS.set2Flags(f1015Marina); + BF_GLOBALS.set2Flags(f1027Marina); + BF_GLOBALS.set2Flags(f1098Marina); + break; + case 3705: + _laura.remove(); + BF_GLOBALS._walkRegions.proc2(6); + BF_GLOBALS._walkRegions.proc2(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); + BF_GLOBALS._sceneItems.push_front(&_greensGun); + + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + + _sceneMode = 0; + _object5.remove(); + _green.setAction(NULL); + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._walkRegions.proc1(1); + break; + case 3709: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3713; + setAction(&_sequenceManager, this, 3713, NULL); + break; + case 3710: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + _sceneMode = 3701; + _green.setAction(&_sequenceManager, this, 3701, NULL); + break; + case 3711: + BF_GLOBALS._walkRegions.proc1(3); + BF_INVENTORY.setObjectScene(INV_GREENS_GUN, 1); + BF_GLOBALS._uiElements.addScore(30); + _greensGun.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 3712: + BF_GLOBALS._uiElements._active = false; + BF_GLOBALS._uiElements.hide(); + + if (BF_GLOBALS._sceneObjects->contains(&_greensGun)) + _greensGun.remove(); + _sceneMode = 1; + setAction(&_sequenceManager, this, 3714, NULL); + break; + case 3713: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + case 3715: + BF_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._player.enableControl(); + break; + case 3716: + BF_GLOBALS.clearFlag(fCalledBackup); + BF_GLOBALS.clearFlag(fBackupIn350); + BF_GLOBALS.clearFlag(fBackupArrived340); + BF_GLOBALS.setFlag(greenTaken); + BF_GLOBALS.setFlag(fToldToLeave340); + + BF_GLOBALS._bookmark = bCalledToDomesticViolence; + _harrison.remove(); + _green.remove(); + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene370::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_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 Scene370::dispatch() { + SceneExt::dispatch(); + + if ((BF_GLOBALS._player._position.x >= 316) && !BF_GLOBALS._sceneObjects->contains(&_laura) && + !BF_GLOBALS._sceneObjects->contains(&_green)) { + if (BF_GLOBALS._bookmark < bArrestedGreen) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 3712; + setAction(&_sequenceManager, this, 3712, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS._sound1.fadeSound(35); + BF_GLOBALS._sceneManager.changeScene(360); + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 380 - Outside City Hall & Jail + * + *--------------------------------------------------------------------------*/ + +bool Scene380::Vechile::startAction(CursorType action, Event &event) { + Scene380 *scene = (Scene380 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 3802, &BF_GLOBALS._player, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene380::Door::startAction(CursorType action, Event &event) { + Scene380 *scene = (Scene380 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 3800, &BF_GLOBALS._player, &scene->_door, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene380::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(380); + setZoomPercents(68, 80, 131, 100); + + BF_GLOBALS._sound1.fadeSound(33); + BF_GLOBALS._walkRegions.proc1(9); + + _door.postInit(); + _door.setVisage(380); + _door.setStrip(4); + _door.setPosition(Common::Point(132, 66)); + _door.setDetails(380, 12, 13, -1, 1, NULL); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.changeZoom(-1); + + _vechile.postInit(); + _vechile.setVisage(380); + _vechile.fixPriority(109); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + // Show vechile as car + _vechile.setStrip(3); + _vechile.setPosition(Common::Point(273, 125)); + _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); + } else if (BF_GLOBALS.getFlag(onDuty)) { + // Show on duty motorcycle + _vechile.setStrip(2); + _vechile.setDetails(300, 11, 13, -1, 1, NULL); + _vechile.setPosition(Common::Point(252, 115)); + + BF_GLOBALS._player.setVisage(1341); + } else { + // Show off duty motorcycle + _vechile.setStrip(1); + _vechile.setDetails(580, 0, 1, -1, 1, NULL); + _vechile.setPosition(Common::Point(249, 110)); + + BF_GLOBALS._player.setVisage(129); + } + + BF_GLOBALS._player.updateAngle(_vechile._position); + BF_GLOBALS._sceneItems.push_back(&_door); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 50: + case 60: + case 330: + case 370: + BF_GLOBALS._player.setPosition(Common::Point(251, 100)); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player.enableControl(); + break; + default: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 3801, &BF_GLOBALS._player, &_door, NULL); + break; + } + + _item1.setDetails(7, 380, 0, 1, 2, 1); + _item2.setDetails(9, 380, 3, 4, 5, 1); + _item3.setDetails(17, 380, 6, 7, 8, 1); + _item4.setDetails(20, 380, 9, 10, 11, 1); + _item5.setDetails(15, 380, 14, 15, 16, 1); + _item6.setDetails(4, 380, 17, 18, 19, 1); + _item7.setDetails(19, 380, 20, 4, 21, 1); + _item8.setDetails(18, 380, 22, 23, 24, 1); + _item9.setDetails(6, 380, 25, 26, 27, 1); +} + +void Scene380::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(385); + break; + default: + BF_GLOBALS._player.enableControl(); + } +} + +/*-------------------------------------------------------------------------- + * Scene 385 - City Hall + * + *--------------------------------------------------------------------------*/ + +void Scene385::Action1::signal() { + Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + + switch (scene->_talkAction) { + case 0: + error("Bugs::talkscript385"); + break; + case 3850: + case 3851: + case 3852: + case 3853: + case 3854: + case 3855: + case 3856: + case 3857: + case 3863: + case 3866: { + ADD_PLAYER_MOVER(187, 144); + break; + } + default: { + ADD_PLAYER_MOVER(231, 158); + break; + } + } + break; + case 1: + BF_GLOBALS._player.changeAngle(45); + setDelay(3); + break; + case 2: + scene->_stripManager.start(scene->_talkAction, this); + break; + case 3: + if (scene->_talkAction) + scene->_dezi.animate(ANIM_MODE_5, NULL); + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +void Scene385::Action2::signal() { + Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + ADD_PLAYER_MOVER(231, 158); + break; + } + case 1: + BF_GLOBALS._player.updateAngle(BF_GLOBALS._player._position); + setDelay(3); + break; + case 2: + scene->_stripManager.start(3864, this); + break; + case 3: + scene->_jim.animate(ANIM_MODE_5, this); + break; + case 4: + scene->_jim.setStrip(4); + scene->_jim.animate(ANIM_MODE_5, this); + break; + case 5: + scene->_stripManager.start(3865, this); + break; + case 6: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene385::Door::startAction(CursorType action, Event &event) { + Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + BF_GLOBALS._walkRegions.proc2(6); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3850; + scene->setAction(&scene->_sequenceManager, scene, 3850, &BF_GLOBALS._player, this, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene385::Jim::startAction(CursorType action, Event &event) { + Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (scene->_jimFlag) { + scene->_talkAction = 3867; + scene->setAction(&scene->_action1); + } else { + switch (BF_GLOBALS._dayNumber) { + case 1: + scene->_talkAction = 3858; + break; + case 2: + scene->_talkAction = 3859; + break; + case 3: + scene->_talkAction = 3860; + break; + case 4: + scene->_talkAction = 3861; + break; + default: + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3868; + break; + } + + scene->_jimFlag = 1; + scene->setAction(&scene->_action1); + } + return true; + case INV_PRINT_OUT: + if (!BF_GLOBALS.getFlag(fGotPointsForMCard)) { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.getFlag(fGotPointsForMCard); + + scene->setAction(&scene->_action2); + return true; + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene385::Dezi::startAction(CursorType action, Event &event) { + Scene385 *scene = (Scene385 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (BF_GLOBALS._deziTopic == 3) { + scene->_talkAction = 3857; + } else { + BF_GLOBALS._deziTopic = 3; + + switch (BF_GLOBALS._dayNumber) { + case 1: + if (BF_GLOBALS._deziTopic++ == 0) { + scene->_talkAction = 3850; + } else { + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3851; + } + break; + case 2: + if (BF_GLOBALS._deziTopic++ == 0) { + scene->_talkAction = 3852; + } else { + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3853; + } + break; + case 3: + if (BF_GLOBALS._deziTopic++ == 0) { + scene->_talkAction = 3854; + } else { + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3855; + } + break; + case 4: + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3856; + break; + default: + BF_GLOBALS._deziTopic = 3; + scene->_talkAction = 3868; + break; + } + } + + scene->setAction(&scene->_action1); + return true; + case INV_PRINT_OUT: + scene->_talkAction = 3863; + scene->setAction(&scene->_action1); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene385::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 100, BF_GLOBALS._player._position.y + 100); + return true; +} + +/*--------------------------------------------------------------------------*/ + + +Scene385::Scene385(): SceneExt() { + _talkAction = _jimFlag = 0; +} + +void Scene385::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_talkAction); + s.syncAsSint16LE(_jimFlag); +} + +void Scene385::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + _exit.setDetails(Rect(0, 162, 320, 167), 385, -1, -1, -1, 1, NULL); + BF_GLOBALS._sound1.fadeSound(119); + + loadScene(385); + setZoomPercents(115, 90, 145, 100); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jake385Speaker); + _stripManager.addSpeaker(&_jimSpeaker); + _stripManager.addSpeaker(&_deziSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.enableControl(); + + _item3.setDetails(1, 385, 5, -1, -1, 1); + _item2.setDetails(2, 385, 7, -1, -1, 1); + _item1.setDetails(3, 385, 6, -1, 6, 1); + _item5.setDetails(4, 385, 14, -1, -1, 1); + + _jim.postInit(); + _jim.setVisage(385); + _jim.setStrip(3); + _jim.setPosition(Common::Point(304, 113)); + _jim.setDetails(385, 1, -1, 2, 1, NULL); + + _dezi.postInit(); + _dezi.setVisage(385); + _dezi.setStrip(2); + _dezi.setPosition(Common::Point(235, 93)); + _dezi.fixPriority(120); + _dezi.setDetails(385, 3, -1, 2, 1, NULL); + + _door.postInit(); + _door.setVisage(385); + _door.setPosition(Common::Point(107, 27)); + _door.setDetails(385, 0, -1, -1, 1, NULL); + + BF_GLOBALS._walkRegions.proc1(6); + + if (BF_GLOBALS._sceneManager._previousScene == 390) { + BF_GLOBALS._player.setPosition(Common::Point(109, 119)); + } else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setPosition(Common::Point(15, 250)); + _sceneMode = 3852; + setAction(&_sequenceManager, this, 3852, &BF_GLOBALS._player, NULL); + } + + _item4.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 385, 4, -1, -1, 1, NULL); +} + +void Scene385::signal() { + switch (_sceneMode) { + case 3850: + BF_GLOBALS._sceneManager.changeScene(390); + break; + case 3851: + BF_GLOBALS._sceneManager.changeScene(380); + break; + case 3852: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene385::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + 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 Scene385::dispatch() { + SceneExt::dispatch(); + + if (!_action && (BF_GLOBALS._player._position.y > 162)) { + // Leaving by exit + BF_GLOBALS._player.disableControl(); + _sceneMode = 3851; + setAction(&_sequenceManager, this, 3851, &BF_GLOBALS._player, NULL); + } +} + +/*-------------------------------------------------------------------------- + * Scene 390 - City Jail + * + *--------------------------------------------------------------------------*/ + +void Scene390::Action1::signal() { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(1); + break; + case 1: + switch (scene->_sceneMode) { + case 3900: + case 3905: + case 3906: + case 3913: + case 3914: + case 3916: + case 3917: { + ADD_PLAYER_MOVER(75, 122); + break; + } + default: { + ADD_PLAYER_MOVER(147, 133); + break; + } + } + break; + case 2: + switch (scene->_sceneMode) { + case 3900: + case 3905: + case 3906: + case 3913: + case 3914: + case 3916: + case 3917: { + BF_GLOBALS._player.changeAngle(315); + break; + } + default: { + BF_GLOBALS._player.changeAngle(90); + break; + } + } + setDelay(1); + break; + case 3: + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 4: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene390::BookingForms::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (_flag) { + SceneItem::display2(390, 16); + } else if (!BF_GLOBALS.getFlag(onDuty)) { + SceneItem::display2(390, 22); + } else if (((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) || + ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1))) { + BF_GLOBALS._player.disableControl(); + ++_flag; + scene->_sceneMode = 3902; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display2(390, 23); + } + return true; + default: + return NamedHotspotExt::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene390::Green::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (!_flag) { + ++_flag; + scene->_sceneMode = 3901; + } else { + scene->_sceneMode = 3902; + } + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readGreenRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(readGreenRights); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3904; + + scene->setAction(&scene->_sequenceManager, scene, 3904, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene390::Object2::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (!_flag) + break; + + if (!BF_GLOBALS.getFlag(onDuty)) { + scene->_sceneMode = 3917; + } else if (BF_GLOBALS.getFlag(fTalkedToBarry) && !BF_GLOBALS.getFlag(fTalkedToLarry)) { + scene->_sceneMode = 3913; + } else if (!BF_GLOBALS.getFlag(fTalkedToLarry)) { + scene->_sceneMode = 3914; + } else { + ++_flag; + + if (BF_GLOBALS._sceneObjects->contains(&scene->_green)) { + scene->_sceneMode = 3900; + } else if (!BF_GLOBALS._sceneObjects->contains(&scene->_green)) { + scene->_sceneMode = 3905; + } else if (BF_GLOBALS.getFlag(fCuffedFrankie)) { + scene->_sceneMode = 3906; + } else { + scene->_sceneMode = 3916; + } + } + + BF_GLOBALS.setFlag(fTalkedToLarry); + scene->setAction(&scene->_action1); + return true; + case INV_BOOKING_GREEN: + if (BF_GLOBALS._bookmark >= bLauraToParamedics) + SceneItem::display2(390, 21); + else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._bookmark = bLauraToParamedics; + scene->_sceneMode = 3905; + + BF_INVENTORY.setObjectScene(INV_GREEN_ID, 390); + if (BF_GLOBALS.getFlag(fLeftTraceIn910)) + BF_GLOBALS.clearFlag(fLeftTraceIn910); + + scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL); + BF_GLOBALS.clearFlag(f1015Marina); + BF_GLOBALS.clearFlag(f1027Marina); + BF_GLOBALS.clearFlag(f1035Marina); + } + return true; + case INV_BOOKING_FRANKIE: + case INV_BOOKING_GANG: + if (BF_GLOBALS.getFlag(frankInJail)) { + SceneItem::display2(390, 21); + } else { + scene->_sceneMode = 3905; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_sequenceManager, scene, 3905, &BF_GLOBALS._player, this, NULL); + + BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 390); + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 390); + BF_GLOBALS.clearFlag(frankInJail); + BF_GLOBALS.clearFlag(f1015Frankie); + BF_GLOBALS.clearFlag(f1027Frankie); + BF_GLOBALS.clearFlag(f1035Frankie); + } + return true; + default: + break; + } + + return NamedObjectExt::startAction(action, event); +} + +bool Scene390::Object3::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case INV_GREEN_ID: + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + BF_INVENTORY.setObjectScene(INV_BOOKING_GREEN, 1); + return true; + case INV_FRANKIE_ID: + BF_INVENTORY.setObjectScene(INV_BOOKING_FRANKIE, 1); + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + return true; + case INV_TYRONE_ID: + scene->_sceneMode = 3903; + setAction(&scene->_sequenceManager, scene, 3902, &BF_GLOBALS._player, NULL); + remove(); + BF_INVENTORY.setObjectScene(INV_BOOKING_GANG, 1); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::GangMember1::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + scene->_sceneMode = 3908; + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 3904; + scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::GangMember2::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + scene->_sceneMode = 3909; + scene->setAction(&scene->_action1); + return true; + case INV_MIRANDA_CARD: + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 3904; + scene->setAction(&scene->_sequenceManager, scene, 3907, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene390::Door::startAction(CursorType action, Event &event) { + Scene390 *scene = (Scene390 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GREEN) == 1) && (BF_INVENTORY.getObjectScene(INV_GREEN_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_FRANKIE) == 1) && (BF_INVENTORY.getObjectScene(INV_FRANKIE_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else if ((BF_INVENTORY.getObjectScene(INV_BOOKING_GANG) == 1) && (BF_INVENTORY.getObjectScene(INV_TYRONE_ID) == 1)) { + scene->_stripManager.start(3918, &BF_GLOBALS._stripProxy); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 3900; + scene->setAction(&scene->_sequenceManager, scene, 3900, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene390::postInit(TsAGE::SceneObjectList *OwnerList) { + BF_GLOBALS._sound1.play(17); + SceneExt::postInit(); + setZoomPercents(105, 85, 130, 100); + loadScene(390); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_greenSpeaker); + _stripManager.addSpeaker(&_jailerSpeaker); + _stripManager.addSpeaker(&_shooterSpeaker); + _stripManager.addSpeaker(&_driverSpeaker); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS.setFlag(onDuty); + BF_GLOBALS._bookmark = bStoppedFrankie; + BF_GLOBALS.clearFlag(frankInJail); + BF_GLOBALS.setFlag(fTalkedToBarry); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 361 : 368); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(147, 114)); + BF_GLOBALS._player.setStrip(6); + BF_GLOBALS._player.changeZoom(-1); + + _object2.postInit(); + _object2.setVisage(395); + _object2.setStrip(2); + _object2.setPosition(Common::Point(38, 84)); + _object2.fixPriority(50); + _object2._flag = 0; + _object2.setDetails(390, 10, 17, 10, 1, NULL); + + _door.postInit(); + _door.setVisage(390); + _door.setStrip(2); + _door.setPosition(Common::Point(151, 18)); + _door.setDetails(390, 5, -1, -1, 1, NULL); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 3901; + setAction(&_sequenceManager, this, 3901, &BF_GLOBALS._player, NULL); + + if ((BF_GLOBALS._bookmark < bLauraToParamedics) && BF_GLOBALS.getFlag(greenTaken)) { + _green.postInit(); + _green.setVisage(392); + _green.setPosition(Common::Point(241, 164)); + _green.fixPriority(153); + _green.setDetails(390, 12, -1, 13, 1, NULL); + _green._flag = 0; + } + + if ((BF_GLOBALS._bookmark >= bStoppedFrankie) && !BF_GLOBALS.getFlag(frankInJail) && (BF_GLOBALS._dayNumber == 1)) { + _gangMember1.postInit(); + _gangMember1.setVisage(396); + _gangMember1.setPosition(Common::Point(273, 169)); + _gangMember1.fixPriority(152); + _gangMember1._flag = 0; + _gangMember1.setDetails(390, 19, -1, 20, 1, NULL); + + _gangMember2.postInit(); + _gangMember2.setVisage(396); + _gangMember2.setStrip(2); + _gangMember2.setPosition(Common::Point(241, 153)); + _gangMember2.fixPriority(152); + _gangMember2._flag = 0; + _gangMember2.setDetails(390, 19, -1, 20, 1, NULL); + } + + _item1.setDetails(Rect(22, 40, 77, 67), 390, 0, -1, 1, 1, NULL); + _bookingForms.setDetails(Rect(89, 46, 110, 65), 390, 2, -1, -1, 1, NULL); + _item3.setDetails(Rect(193, 0, 320, 165), 390, 4, -1, -1, 1, NULL); + _item4.setDetails(Rect(0, 0, 320, 170), 390, 7, -1, -1, 1, NULL); +} + +void Scene390::signal() { + switch (_sceneMode) { + case 3900: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(385); + break; + case 3901: + case 3904: + if ((BF_INVENTORY.getObjectScene(INV_22_SNUB) == 410) && BF_GLOBALS._sceneObjects->contains(&_gangMember1)) { + _sceneMode = 3906; + setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL); + } else if ((BF_INVENTORY.getObjectScene(INV_GREENS_KNIFE) == 370) && BF_GLOBALS._sceneObjects->contains(&_green)) { + _sceneMode = 3906; + setAction(&_sequenceManager, this, 3906, &BF_GLOBALS._player, &_object2, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + break; + case 3902: + SceneItem::display2(390, 3); + + _object3.postInit(); + _object3.setVisage(390); + _object3.setPosition(Common::Point(250, 60)); + _object3.fixPriority(255); + _object3.setDetails(390, 8, -1, 9, 2, NULL); + + BF_GLOBALS._player.enableControl(); + break; + case 3903: + SceneItem::display2(390, 18); + BF_GLOBALS._player.enableControl(); + break; + case 3905: + BF_GLOBALS._uiElements.addScore(30); + _object2.remove(); + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 1); + BF_GLOBALS._player.enableControl(); + break; + case 3906: + BF_GLOBALS._deathReason = 18; + BF_GLOBALS._sceneManager.changeScene(666); + break; + } +} + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes3.h b/engines/tsage/blue_force/blueforce_scenes3.h index 42ae69fc3f..86150433fd 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.h +++ b/engines/tsage/blue_force/blueforce_scenes3.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" @@ -46,29 +47,29 @@ class Scene300: public SceneExt { public: Object(int stripNumber) { _stripNumber = stripNumber; } - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; - class Object17: public NamedObject { + class Object19: public NamedObject { public: - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; /* Items */ class Item1: public NamedHotspot { public: - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; class Item2: public NamedHotspot { public: - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; class Item14: public NamedHotspot { public: - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; class Item15: public NamedHotspot { public: - virtual void startMover(CursorType action); + virtual bool startAction(CursorType action, Event &event); }; /* Actions */ @@ -102,8 +103,8 @@ public: SceneObject _object8, _object9, _object10; NamedObject _object11, _object12; Object _object13, _object14, _object15, _object16; - Object17 _object17; - NamedObject _object18, _object19; + NamedObject _object17, _object18; + Object19 _object19; Item1 _item1; Item2 _item2; NamedHotspot _item3, _item4, _item5, _item6, _item7; @@ -130,6 +131,761 @@ public: virtual void dispatch(); }; +class Scene315: public SceneExt { + /* Objects */ + class BulletinMemo: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class ATFMemo: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Barry: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SutterSlot: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Sign: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BulletinBoard: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CleaningKit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BriefingMaterial: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class WestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SouthWestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerSutter _sutterSpeaker; + SpeakerHarrison _harrisonSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerJailer _jailerSpeaker; + Barry _barry; + SutterSlot _sutterSlot; + NamedHotspot _item3; + Sign _sign; + BulletinBoard _bulletinBoard; + BulletinMemo _bulletinMemo; + Object2 _object2; + ATFMemo _atfMemo; + SceneObject _object4, _object5, _object6; + SceneObject _object7, _object8, _object9; + NamedHotspot _item6, _item7, _item8, _item9; + NamedHotspot _item10, _item11, _item12, _item13; + CleaningKit _cleaningKit; + BriefingMaterial _briefingMaterial; + WestExit _westExit; + SouthWestExit _swExit; + Action1 _action1; + int _field1390; + int _stripNumber; + int _field1398; + int _field1B60, _field1B62, _field1B64; + int _field1B66, _field1B6C, _field139C; + bool _field1B68, _field1B6A; + CursorType _currentCursor; + + Scene315(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene325: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerPSutter _PSutterSpeaker; + Item1 _item1; + NamedObject _object1, _object2, _object3, _object4, _object5; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene330: public SceneExt { + class Timer1: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + NamedObject _object1; + SceneObject _object2; + ASoundExt _sound1, _sound2; + Timer1 _timer; + int _seqNumber; + + Scene330(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + +class Scene340: public PalettedScene { + /* 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(); + void process(Event &event); + }; + + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class WestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SouthWestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class NorthExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Child: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Woman: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Harrison: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Timers */ + class Timer2: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + Child _child; + Woman _woman; + Harrison _harrison; + SceneObject _object4, _object5; + Item1 _item1; + NamedHotspot _item2, _item3; + WestExit _westExit; + SouthWestExit _swExit; + NorthExit _northExit; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + Action8 _action8; + SpeakerGameText _gameTextSpeaker; + SpeakerJordan _jordanSpeaker; + SpeakerSkipB _skipBSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerHarrison _harrisonSpeaker; + ASoundExt _sound1, _sound2; + TimerExt _timer1; + Timer2 _timer2; + int _seqNumber1, _field2652, _field2654; + + Scene340(); + 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(); +}; + +class Scene342: public PalettedScene { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class WestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SouthWestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class NorthExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Timers */ + class Timer1: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2; + Lyle _lyle; + NamedObject _object2; + SceneObject _object3, _object4; + Item1 _item1; + NamedHotspot _item2, _item3; + WestExit _westExit; + SouthWestExit _swExit; + NorthExit _northExit; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + ASoundExt _sound1; + Timer1 _timer1; + int _field1A1A; + + Scene342(); + 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(); +}; + +class Scene350: public SceneExt { + /* Items */ + class Item5: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Yacht: public NamedHotspot { + public: + bool _flag; + + virtual Common::String getClassName() { return "Scene350_Item6"; } + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + }; + class SouthWestExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Hook: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Timers */ + class Timer1: public Timer { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; + NamedObject _harrison; + SceneObject _yachtDoor; + BackgroundSceneObject _yachtBody; + Hook _hook; + Object5 _object5; + NamedHotspot _item1, _item2, _item3, _item4; + Item5 _item5; + Yacht _yacht; + SouthWestExit _swExit; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerHarrison _harrisonSpeaker; + ASoundExt _sound1, _sound2; + Timer1 _timer1; + int _field1D44, _field1D46; + + Scene350(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + virtual void checkGun(); +}; + +class Scene355: public PalettedScene { + /* Objects */ + class Doorway: public NamedObject { + public: + int _v1, _v2, _v3; + + Doorway() { _v1 = _v2 = _v3 = 0; } + virtual Common::String getClassName() { return "Scene355_Doorway"; } + virtual void synchronize(Serializer &s); + virtual bool startAction(CursorType action, Event &event); + }; + class Locker: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class LockerDoor: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object6: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object7: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object8: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item1: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3: public SceneHotspotExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item4: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item5: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item11: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item12: 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(); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerHarrison _harrisonSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerGreen _greenSpeaker; + NamedObject _harrison; + Doorway _doorway; + Locker _locker; + LockerDoor _lockerDoor; + Object5 _object5; + Object6 _object6; + Object7 _object7; + Object8 _object8; + NamedObject _object9, _object10, _object11; + Item1 _item1; + Item2 _item2; + Item3 _item3; + Item4 _item4; + Item5 _item5; + NamedHotspot _item6, _item7, _item8; + NamedHotspot _item9, _item10; + Item11 _item11; + Item12 _item12; + ASoundExt _sound1, _sound2, _sound3; + Action1 _action1; + Action2 _action2; + int _nextSceneMode; + bool _modeFlag; + + Scene355(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); + + void setMode(bool mode, int sceneMode); +}; + +class Scene360: public SceneExt { + /* Objects */ + class SlidingDoor: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Window: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object4: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BsseballCards: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object6: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object7: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item1: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item3: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Barometer: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerHarrison _harrisonSpeaker; + SpeakerGreen _greenSpeaker; + SlidingDoor _slidingDoor; + SceneObject _object2; + Window _window; + Object4 _object4; + BsseballCards _baseballCards; + Object6 _object6; + Object7 _object7; + Item1 _item1; + Item2 _item2; + Item3 _item3; + Barometer _barometer; + Action1 _action1; + ASound _sound1; + int _field380; + + Scene360(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene370: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item6: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class GreensGun: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Green: public NamedObject2 { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Harrison: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Laura: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Speakers */ + class SpeakerLaura370: public SpeakerLaura { + public: + virtual void setText(const Common::String &msg); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerLaura _lauraSpeaker; + SpeakerLauraHeld _lauraHeldSpeaker; + SpeakerGreen _greenSpeaker; + SpeakerHarrison _harrisonSpeaker; + GreensGun _greensGun; + Green _green; + Harrison _harrison; + Laura _laura; + NamedObject _object5; + SceneObject _object6; + Item1 _item1; + NamedHotspot _item2, _item3, _item4, _item5; + Item6 _item6; + Exit _exit; + ASound _sound1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene380: public SceneExt { + /* Objects */ + class Vechile: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + Vechile _vechile; + Door _door; + NamedHotspot _item1, _item2, _item3, _item4, _item5; + NamedHotspot _item6, _item7, _item8, _item9; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene385: public SceneExt { + /* Items */ + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Jim: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Dezi: public NamedObject { + 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(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + Action2 _action2; + Door _door; + Jim _jim; + Dezi _dezi; + SpeakerGameText _gameTextSpeaker; + SpeakerJim _jimSpeaker; + SpeakerDezi _deziSpeaker; + SpeakerJake385 _jake385Speaker; + NamedHotspot _item1, _item2, _item3, _item4, _item5; + Exit _exit; + int _talkAction, _jimFlag; + + Scene385(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene390: public SceneExt { + /* Items */ + class BookingForms: public NamedHotspotExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Green: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GangMember1: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GangMember2: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerGreen _greenSpeaker; + SpeakerJailer _jailerSpeaker; + SpeakerDriver _driverSpeaker; + SpeakerShooter _shooterSpeaker; + Action1 _action1; + Green _green; + Object2 _object2; + Object3 _object3; + GangMember1 _gangMember1; + GangMember2 _gangMember2; + Door _door; + NamedHotspot _item1, _item3, _item4; + BookingForms _bookingForms; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + } // End of namespace BlueForce } // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes4.cpp b/engines/tsage/blue_force/blueforce_scenes4.cpp new file mode 100644 index 0000000000..07445a7e76 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes4.cpp @@ -0,0 +1,1659 @@ +/* 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/blue_force/blueforce_scenes4.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 410 - Traffic Stop Gang Members + * + *--------------------------------------------------------------------------*/ + +void Scene410::Action1::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (scene->_field1FB6++) { + case 0: + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + setDelay(3); + } else { + scene->_sceneMode = 4101; + scene->_stripManager.start(4103, scene); + } + break; + case 1: + scene->_sceneMode = 0; + scene->_stripManager.start(4104, scene); + break; + case 2: + scene->_sceneMode = 0; + scene->_stripManager.start(4105, scene); + break; + default: + scene->_sceneMode = 0; + scene->_stripManager.start(4106, scene); + break; + } +} + +void Scene410::Action2::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + BF_GLOBALS._player.disableControl(); + + switch (scene->_field1FB8++) { + case 0: + scene->_sceneMode = 4105; + scene->_stripManager.start(BF_GLOBALS.getFlag(fTalkedShooterNoBkup) ? 4123 : 4107, scene); + break; + case 1: + scene->_sceneMode = 4110; + scene->_stripManager.start(4102, scene); + break; + case 2: + scene->_sceneMode = 0; + scene->_stripManager.start(4108, scene); + break; + case 3: + scene->_sceneMode = 0; + scene->_stripManager.start(4109, scene); + break; + case 4: + scene->_sceneMode = 0; + scene->_stripManager.start(4110, scene); + break; + 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_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 13, SET_EXT_BGCOLOR, 82, + SET_EXT_FGCOLOR, 13, LIST_END); + BF_GLOBALS._player.enableControl(); + break; + } +} + +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); + } else { + BF_GLOBALS.setFlag(fTalkedShooterNoBkup); + scene->_sceneMode = 0; + scene->_stripManager.start(4107, scene); + } +} + +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; + } +} + +void Scene410::Action5::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; + } +} + +void Scene410::Action6::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(126, 99); + } + break; + case 1: + BF_GLOBALS._player.updateAngle(scene->_object1._position); + setDelay(3); + break; + case 2: + setDelay(3); + break; + case 3: + if (BF_GLOBALS.getFlag(fCalledBackup)) + scene->setAction(&scene->_action1); + else + scene->setAction(&scene->_action4); + remove(); + break; + default: + break; + } +} + +void Scene410::Action7::signal() { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(2); + break; + case 1: + BF_GLOBALS._bookmark = bStoppedFrankie; + BF_GLOBALS.set2Flags(f1098Frankie); + BF_GLOBALS.clearFlag(f1098Marina); + scene->_stripManager.start(4113, this); + break; + case 2: + case 4: + setDelay(2); + break; + 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); + break; + case 5: + BF_GLOBALS._uiElements.addScore(30); + setAction(&scene->_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL); + BF_GLOBALS._player.disableControl(); + break; + case 6: + scene->_sceneMode = 3; + scene->signal(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene410::Item2::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fCalledBackup)) { + scene->_sceneMode = 4103; + scene->signal(); + } else if (BF_GLOBALS.getFlag(fSearchedTruck) && !BF_GLOBALS._sceneObjects->contains(&scene->_object3)) { + scene->_sceneMode = 4103; + scene->signal(); + } else if (scene->_field1FBC != 0) { + SceneItem::display2(410, 12); + } else { + scene->_sceneMode = 4103; + scene->signal(); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene410::Item4::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_GLOBALS._bookmark < bStoppedFrankie) && (!scene->_field1FBC || !scene->_field1FBA)) + break; + else if (BF_GLOBALS.getFlag(fSearchedTruck)) + SceneItem::display2(410, 13); + else if (BF_GLOBALS.getFlag(fGangInCar)) { + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4118; + scene->signal(); + } else { + scene->setAction(&scene->_action7); + } + return true; + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + + +/*--------------------------------------------------------------------------*/ + +bool Scene410::Object1::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(fTalkedDriverNoBkup)) { + scene->setAction(&scene->_action4); + } else { + SceneItem::display2(410, 7); + } + } else if (!scene->_field1FBC) { + SceneItem::display2(410, 7); + } else if (!scene->_field1FC0) { + scene->_sceneMode = 4124; + scene->_field1FC0 = 1; + BF_GLOBALS._uiElements.addScore(30); + scene->signal(); + } else { + break; + } + return true; + case CURSOR_TALK: + BF_GLOBALS._player.setAction(&scene->_action6); + return true; + case INV_HANDCUFFS: + if (BF_GLOBALS.getFlag(fCalledBackup)) { + if ((scene->_field1FB8 < 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); + } else { + if (BF_GLOBALS.getFlag(fTalkedDriverNoBkup)) { + scene->setAction(&scene->_action4); + } else { + break; + } + } + return true; + case INV_TICKET_BOOK: + if (!BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + return startAction(CURSOR_TALK, event); + } else if (!scene->_field1FC4) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager1, scene, 4120, &scene->_object2, &BF_GLOBALS._player, NULL); + } else if ((scene->_field1FBC != 0) || (scene->_field1FC2 != 0)) { + break; + } else { + scene->_field1FC2 = 1; + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4127; + scene->setAction(&scene->_sequenceManager1, scene, 4127, &scene->_object1, NULL); + } + return true; + case INV_MIRANDA_CARD: + if (scene->_field1FBC == 0) + return false; + + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 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); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Object2::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)) { + scene->setAction(&scene->_action3); + } else { + SceneItem::display2(410, 5); + } + } else if (!scene->_field1FBA) { + SceneItem::display2(410, 5); + } else if (!scene->_field1FBE) { + scene->_sceneMode = 4121; + scene->_field1FBE = 1; + BF_GLOBALS._uiElements.addScore(50); + scene->signal(); + } 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)) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9; + ADD_PLAYER_MOVER(195, 139); + } else if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + scene->setAction(&scene->_action3); + } else { + break; + } + return true; + case INV_MIRANDA_CARD: + if (!scene->_field1FBA) + break; + + if (BF_GLOBALS.getFlag(readFrankRights)) { + SceneItem::display2(390, 15); + } else { + BF_GLOBALS.setFlag(readFrankRights); + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager1, scene, 4125, &BF_GLOBALS._player, + &scene->_object2, NULL); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene410::Object3::startAction(CursorType action, Event &event) { + Scene410 *scene = (Scene410 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (BF_GLOBALS._bookmark == bStoppedFrankie) { + if (BF_GLOBALS.getFlag(fSearchedTruck)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8; + ADD_PLAYER_MOVER(147, 143); + } else { + SceneItem::display2(350, 13); + } + } else if ((scene->_field1FBA != 0) && (scene->_field1FBC != 0)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4112; + scene->_stripManager.start(4113, scene); + BF_GLOBALS._bookmark = bStoppedFrankie; + 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); + } 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); + scene->_sceneMode = 4122; + scene->_stripManager.start(4112, scene); + } else if (scene->_field1FB6 < 1) { + break; + } else if (scene->_field1FBC != 0) { + error("Error - want to cuff driver, but he's cuffed already"); + } else { + BF_GLOBALS._player.disableControl(); + scene->_field1FBC = 1; + scene->_field1FC0 = 1; + BF_GLOBALS._walkRegions.proc2(22); + scene->_sceneMode = 4109; + scene->_stripManager.start(4112, scene); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + + +/*--------------------------------------------------------------------------*/ + +Scene410::Scene410(): SceneExt() { + _field1FB6 = _field1FB8 = _field1FBA = _field1FBC = 0; + _field1FBE = _field1FC0 = _field1FC2 = _field1FC4 = 0; +} + +void Scene410::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1FB6); + s.syncAsSint16LE(_field1FB8); + s.syncAsSint16LE(_field1FBA); + s.syncAsSint16LE(_field1FBC); + s.syncAsSint16LE(_field1FBE); + s.syncAsSint16LE(_field1FC0); + s.syncAsSint16LE(_field1FC2); + s.syncAsSint16LE(_field1FC4); +} + +void Scene410::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(410); + setZoomPercents(74, 75, 120, 100); + + if (BF_GLOBALS._sceneManager._previousScene != 60) + _sound1.fadeSound(11); + BF_GLOBALS._driveToScene = 64; + BF_GLOBALS._mapLocationId = 64; + BF_GLOBALS.setFlag(fArrivedAtGangStop); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_harrisonSpeaker); + _stripManager.addSpeaker(&_shooterSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(1341); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.changeAngle(90); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setPosition(Common::Point(114, 133)); + BF_GLOBALS._player.changeZoom(-1); + + _item2.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); + + _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); + + _object5.postInit(); + _object5.setVisage(410); + _object5.setStrip(2); + _object5.setPosition(Common::Point(282, 96)); + + _object6.postInit(); + _object6.setVisage(410); + _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); + + 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)); + + _field1FC4 = 1; + _sceneMode = 0; + signal(); + break; + case 60: + if (BF_GLOBALS.getFlag(fSearchedTruck)) { + _object2.remove(); + _object1.remove(); + _sceneMode = 0; + } else { + _field1FC4 = BF_GLOBALS._v50CC8; + _field1FBA = BF_GLOBALS._v50CC2; + _field1FB8 = BF_GLOBALS._v50CC6; + _field1FB6 = BF_GLOBALS._v50CC4; + + _object2.setVisage(418); + _object2.setStrip(6); + _object2.setPosition(Common::Point(227, 137)); + + if (_field1FB8 > 0) { + _object2.setVisage(415); + _object2.setStrip(2); + _object2.setFrame(5); + } + if (_field1FBA) { + _object2.setVisage(415); + _object2.setStrip(6); + _object2.setFrame(8); + } + + BF_GLOBALS._walkRegions.proc1(16); + if (BF_GLOBALS.getFlag(fDriverOutOfTruck)) { + _object1.setVisage(417); + _object1.setStrip(1); + _object1.setPosition(Common::Point(152, 97)); + + BF_GLOBALS._walkRegions.proc1(7); + } + + if (BF_GLOBALS.getFlag(fCalledBackup)) { + 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); + BF_GLOBALS._sceneItems.addBefore(&_object1, &_object3); + + _object3.setPosition(Common::Point(-10, 124)); + _object3.changeZoom(-1); + + _object4.postInit(); + _object4.setVisage(410); + _object4.setDetails(410, 8, 9, 10, 1, NULL); + _object4.fixPriority(148); + + if (_field1FC4) { + _object3.setPosition(Common::Point(108, 112)); + _object4.fixPriority(148); + _object4.setPosition(Common::Point(39, 168)); + + _sceneMode = 0; + } else { + _sceneMode = 4104; + } + } else { + _sceneMode = 0; + } + + _field1FC4 = 1; + } + break; + case 50: + default: + BF_GLOBALS.setFlag(onDuty); + _sound1.play(21); + _sceneMode = 4100; + break; + } + + signal(); + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y), 410, 0, 1, 2, 1, NULL); +} + +void Scene410::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS.set2Flags(f1097Frankie); + BF_GLOBALS.clearFlag(f1097Marina); + + BF_GLOBALS._v50CC8 = _field1FC4; + BF_GLOBALS._v50CC2 = _field1FBA; + BF_GLOBALS._v50CC6 = _field1FB8; + BF_GLOBALS._v50CC4 = _field1FB6; + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 2: + BF_GLOBALS._deathReason = 3; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 3: + BF_GLOBALS._sceneManager.changeScene(415); + break; + case 5: + BF_INVENTORY.setObjectScene(INV_HANDCUFFS, 315); + _sceneMode = 0; + BF_GLOBALS.set2Flags(f1015Frankie); + BF_GLOBALS.clearFlag(f1015Marina); + signal(); + break; + case 6: + BF_INVENTORY.setObjectScene(INV_22_SNUB, 1); + BF_INVENTORY.setObjectScene(INV_FRANKIE_ID, 1); + BF_GLOBALS.set2Flags(f1027Frankie); + BF_GLOBALS.clearFlag(f1027Marina); + _sceneMode = 0; + signal(); + break; + case 7: + BF_INVENTORY.setObjectScene(INV_TYRONE_ID, 1); + signal(); + break; + case 8: + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.changeAngle(225); + _object3.changeAngle(45); + _sceneMode = 4114; + _stripManager.start(4120, this); + break; + case 9: + _sceneMode = 4106; + _stripManager.start(4111, this); + _field1FBA = 1; + BF_GLOBALS.setFlag(fCuffedFrankie); + BF_GLOBALS._uiElements.addScore(30); + break; + case 10: + BF_GLOBALS._player.updateAngle(_object3._position); + _sceneMode = 0; + break; + case 4100: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4100, &_object2, &_object5, NULL); + BF_GLOBALS._walkRegions.proc1(16); + break; + case 4101: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4100, &_object1, &_object6, NULL); + BF_GLOBALS.setFlag(fDriverOutOfTruck); + BF_GLOBALS._walkRegions.proc1(7); + break; + case 4103: + BF_GLOBALS._player.disableControl(); + _sceneMode = 1; + setAction(&_sequenceManager1, this, 4103, &BF_GLOBALS._player, NULL); + break; + case 4104: + _field1FC4 = 1; + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4104, &_object4, &_object3, NULL); + break; + case 4105: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4105, &_object2, NULL); + case 4106: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4119; + setAction(&_sequenceManager1, this, 4106, &_object2, NULL); + break; + case 4107: + BF_GLOBALS._player.disableControl(); + _sceneMode = 5; + setAction(&_sequenceManager1, this, 4107, &_object2, 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._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4108, &_object3, NULL); + break; + case 4109: + if ((BF_GLOBALS._player._position.x > 116) && (BF_GLOBALS._player._position.x != 195) && + (BF_GLOBALS._player._position.y != 139)) { + ADD_PLAYER_MOVER(195, 139); + } + + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4109, &_object1, &_object3, NULL); + break; + case 4110: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4110, &_object3, &_object1, NULL); + break; + case 4112: + BF_GLOBALS.setFlag(fGangInCar); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.updateAngle(Common::Point(100, 170)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 4108; + setAction(&_sequenceManager1, this, 4112, &_object1, &_object2, &_object3, NULL); + break; + case 4114: + BF_GLOBALS._walkRegions.proc2(22); + BF_GLOBALS._player.disableControl(); + _sceneMode = 4116; + setAction(&_sequenceManager1, this, 4114, &_object3, &_object4, NULL); + break; + case 4116: + BF_GLOBALS._walkRegions.proc2(21); + BF_GLOBALS._walkRegions.proc2(22); + _object3.remove(); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4116, &_object4, NULL); + break; + case 4118: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager1, this, 4118, &BF_GLOBALS._player, NULL); + break; + case 4119: + BF_GLOBALS._player.disableControl(); + _sceneMode = 4107; + setAction(&_sequenceManager1, this, 4119, &_object2, NULL); + break; + case 4121: + BF_GLOBALS._player.disableControl(); + _sceneMode = 6; + setAction(&_sequenceManager1, this, 4121, &BF_GLOBALS._player, &_object2, NULL); + break; + case 4122: + BF_GLOBALS._walkRegions.proc2(22); + BF_INVENTORY.setObjectScene(INV_22_SNUB, 0); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 4122, &_object2, &_object3, 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); + break; + case 4124: + BF_GLOBALS._player.disableControl(); + _sceneMode = 7; + setAction(&_sequenceManager1, this, 4124, &_object1, &BF_GLOBALS._player, NULL); + break; + case 4127: + SceneItem::display2(410, 16); + BF_GLOBALS._player.enableControl(); + break; + case 0: + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene410::process(Event &event) { + // Check for gun being clicked on player + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos) && !BF_GLOBALS.getFlag(fCalledBackup)) { + if (BF_GLOBALS.getFlag(fTalkedShooterNoBkup)) { + if (!_action) { + event.handled = true; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager1, this, 4102, &_object2, &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); + } + } + } + + if (!event.handled) + SceneExt::process(event); +} + +void Scene410::dispatch() { + SceneExt::dispatch(); + if ((_sceneMode == 4112) || (_sceneMode == 4101)) { + _object3.updateAngle(_object1._position); + } +} + +/*-------------------------------------------------------------------------- + * Scene 415 - Searching Truck + * + *--------------------------------------------------------------------------*/ + +bool Scene415::GunInset::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + FocusObject::startAction(action, event); + } else { + remove(); + scene->_gunAndWig.remove(); + } + return true; + } else { + return FocusObject::startAction(action, event); + } +} + +bool Scene415::GunAndWig::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + NamedObject::startAction(action, event); + BF_INVENTORY.setObjectScene(INV_AUTO_RIFLE, 1); + BF_INVENTORY.setObjectScene(INV_WIG, 1); + BF_GLOBALS.setFlag(fGotAutoWeapon); + BF_GLOBALS._uiElements.addScore(30); + + remove(); + return true; + case INV_FOREST_RAP: + if (scene->_fieldE14) + break; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->_stripManager.start(4126, scene); + BF_GLOBALS._uiElements.addScore(50); + scene->_fieldE14 = true; + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene415::BulletsInset::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + FocusObject::startAction(action, event); + } else { + remove(); + scene->_theBullets.remove(); + } + return true; + } else { + return FocusObject::startAction(action, event); + } +} + +bool Scene415::DashDrawer::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_LOOK) || (action == CURSOR_USE)) { + scene->showBullets(); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene415::TheBullets::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + NamedObject::startAction(action, event); + BF_INVENTORY.setObjectScene(INV_22_BULLET, 1); + BF_GLOBALS.setFlag(fGotBulletsFromDash); + BF_GLOBALS._uiElements.addScore(30); + + remove(); + scene->_dashDrawer.remove(); + return true; + case INV_FOREST_RAP: + if (scene->_fieldE16) { + 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; + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene415::Lever::startAction(CursorType action, Event &event) { + Scene415 *scene = (Scene415 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fGotAutoWeapon)) { + SceneItem::display2(415, 20); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 4150, &scene->_object6, NULL); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene415::Scene415(): SceneExt() { + _fieldE14 = _fieldE16 = false; +} + +void Scene415::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_fieldE14); + s.syncAsSint16LE(_fieldE16); +} + +void Scene415::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(415); + + _stripManager.addSpeaker(&_jakeRadioSpeaker); + + _dashDrawer.postInit(); + _dashDrawer.setVisage(411); + _dashDrawer.setStrip(3); + _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); + + _windowLever.setDetails(16, 415, 25, -1, 26, 1); + _item7.setDetails(17, 415, 32, -1, 33, 1); + _seatBelt.setDetails(14, 415, 29, -1, 30, 1); + _lever.setDetails(19, 415, 23, 24, -1, 1); + _seat.setDetails(18, 415, 3, 4, 2, 1); + _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); + + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + BF_GLOBALS._events.setCursor(CURSOR_WALK); + + signal(); +} + +void Scene415::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._sceneManager.changeScene(410); + break; + case 2: + showGunAndWig(); + _sceneMode = 0; + signal(); + break; + case 0: + default: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player._canWalk = false; + break; + } +} + +void Scene415::dispatch() { + SceneExt::dispatch(); + if (BF_GLOBALS.getFlag(fGotAutoWeapon) && BF_GLOBALS.getFlag(fGotBulletsFromDash)) { + _sceneMode = 1; + signal(); + } +} + +void Scene415::showBullets() { + _bulletsInset.postInit(); + _bulletsInset.setVisage(411); + _bulletsInset.setStrip(1); + _bulletsInset.setPosition(Common::Point(158, 100)); + _bulletsInset.setDetails(415, -1, -1, -1); + + _theBullets.postInit(); + _theBullets.setVisage(411); + _theBullets.setStrip(1); + _theBullets.setFrame(2); + _theBullets.setPosition(Common::Point(184, 86)); + _theBullets.fixPriority(105); + _theBullets.setDetails(415, 16, 17, 18, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_theBullets); + BF_GLOBALS._sceneItems.push_front(&_theBullets); +} + +void Scene415::showGunAndWig() { + _gunInset.postInit(); + _gunInset.setVisage(411); + _gunInset.setStrip(2); + _gunInset.setPosition(Common::Point(158, 100)); + _gunInset.setDetails(415, -1, -1, -1); + + _gunAndWig.postInit(); + _gunAndWig.setVisage(411); + _gunAndWig.setStrip(2); + _gunAndWig.setFrame(2); + _gunAndWig.setPosition(Common::Point(159, 88)); + _gunAndWig.fixPriority(105); + _gunAndWig.setDetails(415, 13, 14, 15, 1, NULL); + + BF_GLOBALS._sceneItems.remove(&_gunAndWig); + BF_GLOBALS._sceneItems.push_front(&_gunAndWig); +} + +/*-------------------------------------------------------------------------- + * Scene 440 - Outside Alleycat Bowl + * + *--------------------------------------------------------------------------*/ + +bool Scene440::Doorway::startAction(CursorType action, Event &event) { + Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 1); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4400; + scene->setAction(&scene->_sequenceManager, scene, 4400, &BF_GLOBALS._player, this, &scene->_lyle, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene440::Vechile::startAction(CursorType action, Event &event) { + Scene440 *scene = (Scene440 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS.getFlag(fWithLyle)) { + SceneItem::display2(440, 3); + } else { + SceneItem::display2(440, 2); + } + return true; + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4403; + scene->setAction(&scene->_sequenceManager, scene, 4403, &BF_GLOBALS._player, &scene->_lyle, NULL); + } else { + BF_GLOBALS._sceneManager.changeScene(60); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene440::Lyle::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 4); + return true; + case CURSOR_TALK: + SceneItem::display2(440, 5); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene440::Item1::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(440, 0); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene440::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(440); + setZoomPercents(75, 60, 120, 100); + BF_GLOBALS._sound1.fadeSound(33); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setPosition(Common::Point(203, 113)); + + _vechile.postInit(); + + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.setPosition(Common::Point(-40, -10)); + _lyle.changeZoom(-1); + _lyle.hide(); + BF_GLOBALS._sceneItems.push_back(&_lyle); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _vechile.setVisage(444); + _vechile.setFrame(2); + _vechile.setPosition(Common::Point(147, 128)); + _vechile.fixPriority(114); + + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.setPosition(Common::Point(187, 104)); + + _lyle.setPosition(Common::Point(135, 128)); + _lyle.show(); + + BF_GLOBALS._walkRegions.proc1(12); + BF_GLOBALS._walkRegions.proc1(13); + } else { + _vechile.setPosition(Common::Point(169, 121)); + _vechile.fixPriority(117); + + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setVisage(440); + _vechile.setStrip(1); + + BF_GLOBALS._player.setVisage(304); + BF_GLOBALS._player.setStrip(3); + } else { + _vechile.setVisage(580); + _vechile.setStrip(2); + _vechile.setFrame(3); + + BF_GLOBALS._player.setVisage(303); + } + } + + BF_GLOBALS._sceneItems.push_back(&_vechile); + BF_GLOBALS._walkRegions.proc1(11); + + _doorway.postInit(); + _doorway.setVisage(440); + _doorway.setStrip(5); + _doorway.setPosition(Common::Point(198, 91)); + _doorway.fixPriority(80); + BF_GLOBALS._sceneItems.push_back(&_doorway); + + if (BF_GLOBALS._sceneManager._previousScene == 450) { + _lyle.setPosition(Common::Point(143, 93)); + _lyle.setStrip(5); + _lyle.fixPriority(90); + + _doorway.setFrame(_doorway.getFrameCount()); + _sceneMode = 4401; + setAction(&_sequenceManager, this, 4401, &BF_GLOBALS._player, &_doorway, NULL); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _sceneMode = 4402; + setAction(&_sequenceManager, this, 4402, &_lyle, NULL); + } else { + BF_GLOBALS._player.enableControl(); + } + + _item1.setBounds(Rect(0, 0, SCREEN_WIDTH, BF_INTERFACE_Y - 1)); + BF_GLOBALS._sceneItems.push_back(&_item1); +} + +void Scene440::signal() { + switch (_sceneMode) { + case 4400: + BF_GLOBALS._sceneManager.changeScene(450); + break; + case 4401: + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.enableControl(); + break; + case 4402: + BF_GLOBALS._player.enableControl(); + break; + case 4403: + BF_GLOBALS._sceneManager.changeScene(60); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 450 - Inside Alleycat Bowl + * + *--------------------------------------------------------------------------*/ + +bool Scene450::Object1::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 0); + return true; + case CURSOR_USE: + SceneItem::display2(450, 1); + return true; + case CURSOR_TALK: + case INV_ID: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4504; + if (_flag) { + scene->setAction(&scene->_sequenceManager, scene, 4515, &BF_GLOBALS._player, this, NULL); + } else { + ++_flag; + scene->setAction(&scene->_sequenceManager, scene, 4504, &BF_GLOBALS._player, this, NULL); + } + return true; + case INV_FOREST_RAP: + BF_INVENTORY.setObjectScene(INV_FOREST_RAP, 450); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._uiElements.addScore(30); + + scene->_sceneMode = 4505; + scene->setAction(&scene->_sequenceManager, scene, 4505, &BF_GLOBALS._player, this, + &scene->_counterDoor, &scene->_object2, NULL); + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene450::Object3::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 4); + return true; + case CURSOR_USE: + SceneItem::display2(450, 5); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4502; + if (BF_GLOBALS.getFlag(onDuty)) { + scene->setAction(&scene->_sequenceManager, scene, 4516, &BF_GLOBALS._player, this, NULL); + } else { + scene->setAction(&scene->_sequenceManager, scene, 4502, &BF_GLOBALS._player, this, NULL); + } + return true; + case INV_NAPKIN: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4509; + scene->setAction(&scene->_sequenceManager, scene, 4509, &BF_GLOBALS._player, this, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene450::Object4::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(450, 6); + return true; + case CURSOR_USE: + SceneItem::display2(450, 7); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(takenWeasel) && !BF_GLOBALS.getFlag(gotTrailer450)) { + BF_GLOBALS.setFlag(gotTrailer450); + scene->_sceneMode = 4517; + scene->setAction(&scene->_sequenceManager, scene, 4517, &BF_GLOBALS._player, this, + &scene->_door, NULL); + } else { + animate(ANIM_MODE_8, 1, NULL); + + if (scene->_field19AC) { + scene->_sceneMode = 2; + if (scene->_field19AE) { + scene->_stripManager.start(4521, scene); + } else { + scene->_field19AE = 1; + scene->_stripManager.start(4512, scene); + } + } else { + scene->_sceneMode = 4506; + if (scene->_field19AE) { + scene->setAction(&scene->_sequenceManager, scene, 4518, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 4506; + scene->_field19AE = 1; + scene->setAction(&scene->_sequenceManager, scene, 4506, &BF_GLOBALS._player, this, NULL); + } + } + } + return true; + case INV_FOREST_RAP: + SceneItem::display2(450, 19); + return true; + case INV_NAPKIN: + animate(ANIM_MODE_8, 1, NULL); + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS.getFlag(showEugeneNapkin)) { + SceneItem::display2(450, 16); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS.setFlag(showEugeneNapkin); + + if (!BF_GLOBALS.getFlag(showEugeneID)) { + scene->_sceneMode = 4513; + scene->setAction(&scene->_sequenceManager, scene, 4513, &BF_GLOBALS._player, this, NULL); + } else if (BF_GLOBALS.getFlag(fMgrCallsWeasel)) { + SceneItem::display2(450, 16); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 4510; + BF_INVENTORY.setObjectScene(INV_NAPKIN, 450); + scene->setAction(&scene->_sequenceManager, scene, 4510, &BF_GLOBALS._player, this, NULL); + } + } + return true; + case INV_ID: + if (BF_GLOBALS.getFlag(takenWeasel)) { + return startAction(CURSOR_TALK, event); + } else { + animate(ANIM_MODE_8, 1, NULL); + BF_GLOBALS._player.disableControl(); + + if (!BF_GLOBALS.getFlag(showEugeneID)) + BF_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); + scene->_sceneMode = 4511; + scene->setAction(&scene->_sequenceManager, scene, 4511, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 4506; + scene->setAction(&scene->_sequenceManager, scene, 4512, &BF_GLOBALS._player, this, NULL); + } + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene450::Item1::startAction(CursorType action, Event &event) { + Scene450 *scene = (Scene450 *)BF_GLOBALS._sceneManager._scene; + + if (event.eventType == EVENT_BUTTON_DOWN) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 4501; + scene->signal(); + return true; + } else { + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene450::Scene450(): SceneExt() { + _field19AC = _field19AE = 0; +} + +void Scene450::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field19AC); + s.syncAsSint16LE(_field19AE); +} + +void Scene450::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(450); + setZoomPercents(110, 90, 155, 115); + BF_GLOBALS._sound1.fadeSound(13); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_eugeneSpeaker); + _stripManager.addSpeaker(&_billySpeaker); + _stripManager.addSpeaker(&_weaselSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(BF_GLOBALS.getFlag(onDuty) ? 1341 : 129); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(-30, 155)); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + _door.postInit(); + _door.setVisage(450); + _door.setStrip(2); + _door.setPosition(Common::Point(72, 80)); + _door.setDetails(450, 15, -1, 13, 1, NULL); + + _counterDoor.postInit(); + _counterDoor.setVisage(450); + _counterDoor.setPosition(Common::Point(39, 104)); + _counterDoor.fixPriority(100); + _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); + } 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); + } else { + _object4.postInit(); + _object4.setVisage(467); + _object4.setPosition(Common::Point(138, 121)); + _object4.changeZoom(-1); + BF_GLOBALS._sceneItems.push_back(&_object4); + + if (!BF_GLOBALS.getFlag(takenWeasel)) { + _object2.postInit(); + _object2.setVisage(469); + _object2.animate(ANIM_MODE_1, NULL); + _object2.setObjectWrapper(new SceneObjectWrapper()); + _object2.setPosition(Common::Point(-30, 126)); + ADD_MOVER_NULL(_object2, 27, 126); + _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); + } + } + + _sceneMode = 4500; + setAction(&_sequenceManager, this, 4500, &BF_GLOBALS._player, NULL); + + _exit.setDetails(Rect(0, 100, 4, 167), 450, -1, -1, -1, 1, NULL); + _counter.setDetails(8, 450, 8, -1, 9, 1); + _shelf.setDetails(Rect(114, 10, 179, 77), 450, 10, -1, 11, 1, NULL); + _interior.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 450, 14, -1, -1, 1, NULL); +} + +void Scene450::signal() { + switch (_sceneMode) { + case 450: + case 451: + BF_GLOBALS._sceneManager.changeScene(440); + break; + case 4501: + if (BF_GLOBALS._sceneObjects->contains(&_object2)) { + ADD_MOVER(_object2, -20, 135); + } else { + ADD_PLAYER_MOVER(0, 160); + } + break; + case 4503: + _object1.fixPriority(100); + BF_GLOBALS._player.enableControl(); + break; + case 4505: + BF_GLOBALS.setFlag(takenWeasel); + _object1.remove(); + _object2.remove(); + BF_GLOBALS._walkRegions.proc2(4); + BF_GLOBALS._player.enableControl(); + break; + case 4507: + case 4510: + case 4511: + BF_GLOBALS.setFlag(fMgrCallsWeasel); + _field19AC = 1; + _sceneMode = 4503; + setAction(&_sequenceManager, this, 4503, &_object1, &_door, &_object4, NULL); + break; + case 4508: + _object4.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); + _sceneMode = 4508; + setAction(&_sequenceManager, this, 4508, &BF_GLOBALS._player, &_object4, &_door, NULL); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene450::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + 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); + } + } +} + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes4.h b/engines/tsage/blue_force/blueforce_scenes4.h new file mode 100644 index 0000000000..5da61cfaa0 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes4.h @@ -0,0 +1,267 @@ +/* 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_BLUEFORCE_SCENES4_H +#define TSAGE_BLUEFORCE_SCENES4_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene410: 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(); + }; + class Action5: public Action { + public: + virtual void signal(); + }; + class Action6: public Action { + public: + virtual void signal(); + }; + class Action7: public Action { + public: + virtual void signal(); + }; + + /* Objects */ + class Object1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item2: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item4: 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; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + Action5 _action5; + Action6 _action6; + Action7 _action7; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerHarrison _harrisonSpeaker; + SpeakerDriver _driverSpeaker; + SpeakerShooter _shooterSpeaker; + ASoundExt _sound1; + int _field1FB6, _field1FB8, _field1FBA; + int _field1FBC, _field1FBE; + int _field1FC0, _field1FC2, _field1FC4; + + Scene410(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene415: public SceneExt { + /* Objects */ + class GunInset: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class GunAndWig: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BulletsInset: public FocusObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class DashDrawer: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class TheBullets: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Lever: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +private: + void showBullets(); + void showGunAndWig(); +public: + SequenceManager _sequenceManager; + GunInset _gunInset; + GunAndWig _gunAndWig; + BulletsInset _bulletsInset; + DashDrawer _dashDrawer; + TheBullets _theBullets; + NamedObject _object6; + NamedHotspot _item1, _steeringWheel, _horn, _dashboard; + NamedHotspot _seat, _windowLever, _item7, _seatBelt; + Lever _lever; + SpeakerJakeRadio _jakeRadioSpeaker; + bool _fieldE14, _fieldE16; + + Scene415(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void synchronize(Serializer &s); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene440: public SceneExt { + /* Objects */ + class Doorway: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + Doorway _doorway; + Vechile _vechile; + Lyle _lyle; + Item1 _item1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene450: public SceneExt { + /* Objects */ + class Object1: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + 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); + }; + + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerEugene _eugeneSpeaker; + SpeakerWeasel _weaselSpeaker; + SpeakerBilly _billySpeaker; + Object1 _object1; + NamedObject _object2; + Object3 _object3; + Object4 _object4; + NamedObject _door, _counterDoor; + NamedHotspot _exit, _interior, _shelf, _counter; + int _field19AC, _field19AE; + + Scene450(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp new file mode 100644 index 0000000000..9b67159f9b --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes5.cpp @@ -0,0 +1,2547 @@ +/* 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/blue_force/blueforce_scenes5.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 550 - Outside Bikini Hut + * + *--------------------------------------------------------------------------*/ + +void Scene550::Action1::signal() { + Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(5); + break; + case 1: + scene->_stripManager.start(scene->_sceneMode, this); + break; + case 2: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene550::Object1::startAction(CursorType action, Event &event) { + Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) || + (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) { + if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) && + (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) { + BF_GLOBALS.setFlag(fToldLyleOfSchedule); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5501; + scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL); + } else { + scene->_sceneMode = 0; + scene->_stripManager.start(5509, scene); + } + } else if (BF_GLOBALS._sceneManager._previousScene == 930) { + scene->_sceneMode = 5512; + scene->setAction(&scene->_action1); + } else { + scene->_sceneMode = BF_INVENTORY.getObjectScene(BF_ITEM_67) == 1 ? 5513 : 5512; + scene->_stripManager.setAction(&scene->_action1); + } + return true; + case INV_SCHEDULE: + BF_GLOBALS.setFlag(fToldLyleOfSchedule); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5501; + scene->setAction(&scene->_sequenceManager, scene, 5514, &BF_GLOBALS._player, this, NULL); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene550::CaravanDoor::startAction(CursorType action, Event &event) { + Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 0); + return true; + case CURSOR_USE: + SceneItem::display2(550, 7); + return true; + case BF_ITEM_67: + if ((BF_GLOBALS._dayNumber == 3) || !BF_GLOBALS.getFlag(fWithLyle)) + SceneItem::display2(550, 33); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5500; + scene->setAction(&scene->_sequenceManager, scene, 5500, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene550::Vechile::startAction(CursorType action, Event &event) { + Scene550 *scene = (Scene550 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 3); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5510; + scene->setAction(&scene->_sequenceManager, scene, BF_GLOBALS.getFlag(fWithLyle) ? 5510 : 5515, + &BF_GLOBALS._player, this, NULL); + } else if (BF_GLOBALS.getFlag(fToldLyleOfSchedule)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL); + } else if ((BF_INVENTORY.getObjectScene(INV_SCHEDULE) == 1) || + (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1)) { + if (BF_INVENTORY.getObjectScene(INV_9MM_BULLETS) == 1) { + scene->_sceneMode = 5501; + scene->_stripManager.start(5511, scene); + } else { + scene->_sceneMode = 0; + scene->_stripManager.start(5509, scene); + } + } else if (BF_GLOBALS._sceneManager._previousScene == 930) { + scene->_sceneMode = 5512; + scene->setAction(&scene->_action1); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 5501, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene550::postInit(SceneObjectList *OwnerList) { + BF_GLOBALS._sound1.fadeSound(16); + + if ((BF_GLOBALS._bookmark == bInspectionDone) && !BF_GLOBALS.getFlag(fHasDrivenFromDrunk)) { + _sceneMode = 1; + signal(); + return; + } + + SceneExt::postInit(); + loadScene(550); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff = Common::Point(2, 1); + BF_GLOBALS._player.enableControl(); + + _caravanDoor.postInit(); + _caravanDoor.setVisage(550); + _caravanDoor.setPosition(Common::Point(34, 66)); + BF_GLOBALS._sceneItems.push_back(&_caravanDoor); + + _vechile.postInit(); + _vechile.fixPriority(70); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._walkRegions.proc1(10); + BF_GLOBALS._walkRegions.proc1(11); + + _vechile.setVisage(444); + _vechile.setStrip(4); + _vechile.setFrame2(2); + _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); + + BF_GLOBALS._player.setVisage(303); + BF_GLOBALS._player.setPosition(Common::Point(89, 76)); + BF_GLOBALS._player.updateAngle(_object1._position); + } else { + BF_GLOBALS._walkRegions.proc1(12); + + _vechile.setPosition(Common::Point(205, 77)); + _vechile.changeZoom(80); + + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setVisage(301); + _vechile.setStrip(1); + + BF_GLOBALS._player.setVisage(304); + } else { + _vechile.setVisage(580); + _vechile.setStrip(2); + _vechile.setFrame(2); + + BF_GLOBALS._player.setVisage(303); + } + + BF_GLOBALS._sceneItems.push_back(&_vechile); + + 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; + } + } + + _item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL); + _item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL); +} + +void Scene550::signal() { + switch (_sceneMode) { + case 0: + BF_GLOBALS._player.enableControl(); + break; + case 1: + BF_GLOBALS._sceneManager.changeScene(551); + break; + case 2: + case 5510: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 3: + BF_GLOBALS._driveFromScene = 16; + BF_GLOBALS._driveToScene = 128; + BF_GLOBALS._mapLocationId = 128; + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(800); + break; + case 5500: + BF_GLOBALS._sceneManager.changeScene(930); + break; + case 5501: + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager, this, 5501, &BF_GLOBALS._player, NULL); + break; + default: + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 551 - Outside Bikini Hut (Drunk Stop) + * + *--------------------------------------------------------------------------*/ + +void Scene551::Action2::signal() { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._walkRegions.proc2(18); + BF_GLOBALS._walkRegions.proc2(4); + scene->_field1CD2 = 1; + + scene->_harrison.setObjectWrapper(new SceneObjectWrapper()); + scene->_harrison.animate(ANIM_MODE_1, NULL); + + BF_GLOBALS._player.setVisage(304); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + + if (scene->_drunkStanding._flag != 1) { + ADD_PLAYER_MOVER_THIS(scene->_harrison, 126, 85); + } else { + ADD_PLAYER_MOVER_THIS(scene->_harrison, 88, 91); + } + break; + case 1: + scene->_harrison.updateAngle(BF_GLOBALS._player._position); + + if (scene->_drunkStanding._flag == 1) { + BF_GLOBALS._walkRegions.proc1(4); + ADD_PLAYER_MOVER(71, 97); + } else { + ADD_PLAYER_MOVER(141, 87); + } + break; + case 2: + scene->_harrison.updateAngle(BF_GLOBALS._player._position); + BF_GLOBALS._player.updateAngle(scene->_harrison._position); + setDelay(10); + break; + case 3: + scene->_stripManager.start(scene->_harrison._flag, this); + break; + case 4: + scene->_field1CD2 = 0; + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene551::Vechile::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 3); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(didDrunk)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL); + } else if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1) { + BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0); + scene->_harrison._flag = 5505; + scene->setAction(&scene->_action2, scene); + scene->_sceneMode = 5509; + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene551::DrunkStanding::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 15); + return true; + case CURSOR_USE: + SceneItem::display2(550, 16); + return true; + case CURSOR_TALK: + SceneItem::display2(550, 17); + return true; + case INV_HANDCUFFS: + scene->_harrison.animate(ANIM_MODE_1, NULL); + BF_GLOBALS.set2Flags(f1098Drunk); + BF_GLOBALS.setFlag(didDrunk); + _flag = 2; + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5509; + + scene->setAction(&scene->_sequenceManager, scene, 5509, &BF_GLOBALS._player, this, &scene->_harrison, NULL); + BF_GLOBALS.set2Flags(f1015Drunk); + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +bool Scene551::Drunk::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + switch (_flag) { + case 0: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 5505, &BF_GLOBALS._player, &scene->_object15, NULL); + break; + case 1: + SceneItem::display2(550, 11); + break; + case 2: + SceneItem::display2(550, 12); + break; + case 3: + SceneItem::display2(550, 27); + break; + } + return true; + case CURSOR_USE: + switch (_flag) { + case 0: + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) { + scene->_sceneMode = 5508; + scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS.setFlag(fTalkedToDrunkInCar); + scene->_sceneMode = 16; + scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL); + } + break; + case 2: + SceneItem::display2(550, 13); + break; + case 3: + SceneItem::display2(550, 27); + break; + default: + break; + } + return true; + case CURSOR_TALK: + if (_flag) + break; + BF_GLOBALS._player.disableControl(); + + if (BF_GLOBALS.getFlag(fTalkedToDrunkInCar)) { + scene->_sceneMode = 5508; + scene->setAction(&scene->_sequenceManager, scene, 5508, &BF_GLOBALS._player, NULL); + } else { + BF_GLOBALS.setFlag(fTalkedToDrunkInCar); + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 5504, &BF_GLOBALS._player, &scene->_object15, NULL); + } + return true; + case INV_CENTER_PUNCH: + if (_flag) { + SceneItem::display2(550, 14); + } else { + BF_GLOBALS.set2Flags(f1098Drunk); + BF_GLOBALS.setFlag(didDrunk); + _flag = 1; + BF_GLOBALS._uiElements.addScore(30); + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5506; + scene->setAction(&scene->_sequenceManager, scene, 5506, &BF_GLOBALS._player, this, + &scene->_object12, NULL); + } + return true; + default: + break; + } + + return NamedObjectExt::startAction(action, event); +} + +bool Scene551::PatrolCarTrunk::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) != 1) { + BF_GLOBALS._walkRegions.proc2(18); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 2; + scene->setAction(&scene->_sequenceManager, scene, 5503, &BF_GLOBALS._player, &scene->_harrison, this, NULL); + return true; + } + break; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +void Scene551::TrunkInset::remove() { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + scene->_trunkKits.remove(); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 0; + scene->setAction(&scene->_sequenceManager, scene, 5516, &scene->_harrison, + &scene->_patrolCarTrunk, NULL); + + FocusObject::remove(); +} + +bool Scene551::TrunkInset::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 18); + return true; + case CURSOR_USE: + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene551::TrunkKits::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + Rect tempRect = _bounds; + tempRect.collapse(10, 6); + if (!tempRect.contains(event.mousePos)) + return false; + + switch (action) { + case CURSOR_LOOK: + switch (_frame) { + case 1: + SceneItem::display2(550, 19); + break; + case 2: + SceneItem::display2(550, 20); + break; + case 3: + SceneItem::display2(550, 21); + break; + default: + break; + } + return true; + case CURSOR_USE: + if (event.mousePos.y < _bounds.top) { + setFrame(1); + } else if ((event.mousePos.x < (_bounds.left - 25)) && (_frame > 1)) { + SceneItem::display2(550, 28); + } else { + switch (_frame) { + case 1: + setFrame(BF_INVENTORY.getObjectScene(INV_CENTER_PUNCH) == 1 ? 3 : 2); + break; + case 2: + if (!BF_GLOBALS.getFlag(fShowedBluePrint)) { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fShowedBluePrint); + } + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5520; + scene->setAction(&scene->_sequenceManager, scene, 5520, &BF_GLOBALS._player, NULL); + BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 1); + setFrame(3); + break; + case 3: + setFrame(1); + break; + default: + break; + } + } + return true; + case INV_CENTER_PUNCH: + SceneItem::display2(550, 22); + BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0); + setFrame(2); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene551::Harrison::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 23); + return true; + case CURSOR_USE: + SceneItem::display2(550, 24); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + + if (scene->_drunkStanding._flag == 1) { + _flag = 5508; + } else if (!scene->_field1CD0) { + _flag = 5502; + } else { + scene->_field1CD0 = 1; + _flag = 5500; + } + scene->setAction(&scene->_action2); + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene551::Item4::startAction(CursorType action, Event &event) { + Scene551 *scene = (Scene551 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(550, 34); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 5510, &BF_GLOBALS._player, &scene->_vechile2, NULL); + return true; + default: + return false; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene551::Scene551(): Scene550() { + _field1CD0 = _field1CD2 = 0; +} + +void Scene551::synchronize(Serializer &s) { + Scene550::synchronize(s); + s.syncAsSint16LE(_field1CD0); + s.syncAsSint16LE(_field1CD2); +} + +void Scene551::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(550); + BF_GLOBALS._walkRegions.load(551); + BF_GLOBALS._sound1.fadeSound(16); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_gigglesSpeaker); + _stripManager.addSpeaker(&_drunkSpeaker); + + if (BF_GLOBALS.getFlag(fHasLeftDrunk)) { + _item4.setBounds(Rect(0, 0, 320, 170)); + BF_GLOBALS._sceneItems.push_back(&_item4); + } + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(160, 100)); + BF_GLOBALS._player._moveDiff = Common::Point(2, 1); + BF_GLOBALS._player.enableControl(); + + _caravanDoor.postInit(); + _caravanDoor.setVisage(550); + _caravanDoor.setPosition(Common::Point(34, 66)); + BF_GLOBALS._sceneItems.push_back(&_caravanDoor); + + _vechile2.postInit(); + _vechile2.setVisage(301); + _vechile2.setStrip(1); + _vechile2.setPosition(Common::Point(205, 77)); + _vechile2.fixPriority(70); + _vechile2.changeZoom(80); + BF_GLOBALS._sceneItems.push_back(&_vechile2); + + BF_GLOBALS._walkRegions.proc1(14); + + _drunk.postInit(); + _drunk.setVisage(550); + _drunk.setStrip(3); + _drunk.fixPriority(84); + _drunk.setPosition(Common::Point(29, 92)); + _drunk._flag = 0; + BF_GLOBALS._sceneItems.push_back(&_drunk); + + _object12.postInit(); + _object12.setVisage(550); + _object12.setStrip(7); + _object12.setPosition(Common::Point(29, 92)); + _object12.hide(); + + _object13.postInit(); + _object13.setVisage(550); + _object13.setStrip(2); + _object13.setPosition(Common::Point(29, 92)); + _object13.fixPriority(82); + _object13.setDetails(550, 8, -1, 9, 1, NULL); + + if (BF_GLOBALS.getFlag(didDrunk)) { + _drunk._flag = 3; + _drunk.setStrip(3); + + _object12.show(); + _object12.setDetails(550, 25, -1, 26, 1, NULL); + BF_GLOBALS._sceneItems.push_front(&_object12); + + _harrison.postInit(); + _harrison.setVisage(304); + _harrison.setPosition(Common::Point(67, 102)); + _harrison.setStrip(8); + _harrison.setFrame(1); + _harrison._flag = 1; + BF_GLOBALS._sceneItems.push_back(&_harrison); + + _object14.postInit(); + _object14.setVisage(550); + _object14.setStrip(5); + _object14.animate(ANIM_MODE_2, NULL); + _object14.fixPriority(80); + _object14.setPosition(Common::Point(122, 57)); + + _object11.postInit(); + _object11.setVisage(550); + _object11.setStrip(2); + _object11.setFrame(2); + _object11.setPosition(Common::Point(116, 84)); + _object11.fixPriority(77); + _object11.setDetails(550, 32, -1, 10, 1, NULL); + + _drunkStanding.postInit(); + _drunkStanding._flag = 0; + _drunkStanding.setVisage(554); + _drunkStanding.setStrip(7); + _drunkStanding.setFrame(8); + _drunkStanding.fixPriority(83); + _drunkStanding.setPosition(Common::Point(57, 99)); + } else { + _harrison.postInit(); + _harrison.setVisage(304); + _harrison.setPosition(Common::Point(126, 83)); + _harrison.setObjectWrapper(new SceneObjectWrapper()); + _harrison._flag = 0; + _harrison._moveDiff = Common::Point(2, 1); + BF_GLOBALS._sceneItems.push_back(&_harrison); + + _object14.postInit(); + _object14.setVisage(550); + _object14.setStrip(5); + _object14.animate(ANIM_MODE_2, NULL); + _object14.fixPriority(80); + _object14.setPosition(Common::Point(122, 57)); + + _patrolCarTrunk.postInit(); + _patrolCarTrunk.setVisage(550); + _patrolCarTrunk.setStrip(4); + _patrolCarTrunk.setFrame(1); + _patrolCarTrunk.setPosition(Common::Point(149, 69)); + _patrolCarTrunk.fixPriority(79); + _patrolCarTrunk.setDetails(550, 18, -1, 9, 1, NULL); + + _object11.postInit(); + _object11.setVisage(550); + _object11.setStrip(2); + _object11.setFrame(2); + _object11.setPosition(Common::Point(116, 84)); + _object11.fixPriority(77); + _object11.setDetails(550, 32, -1, 10, 1, NULL); + + _drunkStanding.postInit(); + _drunkStanding._flag = 0; + _drunkStanding.setVisage(554); + _drunkStanding.fixPriority(83); + _drunkStanding.setPosition(Common::Point(47, 93)); + + _object15.postInit(); + _object15.setVisage(552); + _object15.setPosition(Common::Point(59, 94)); + _object15.fixPriority(200); + _object15.hide(); + } + + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager, this, 5502, &BF_GLOBALS._player, &_vechile2, NULL); + + _item2.setDetails(Rect(0, 26, 53, 67), 550, 1, -1, 2, 1, NULL); + _item3.setDetails(Rect(53, 12, 173, 65), 550, 4, -1, 5, 1, NULL); + _item1.setDetails(Rect(0, 0, 320, 170), 550, 6, -1, -1, 1, NULL); +} + +void Scene551::signal() { + switch (_sceneMode) { + case 0: + BF_GLOBALS._player.enableControl(); + break; + case 1: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS.set2Flags(f1027Drunk); + BF_GLOBALS.set2Flags(f1097Drunk); + + if (BF_GLOBALS.getFlag(didDrunk)) + BF_GLOBALS.setFlag(f1098Drunk); + + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 2: + BF_GLOBALS._walkRegions.proc1(18); + + _trunkInset.postInit(); + _trunkInset.setVisage(553); + _trunkInset.setPosition(Common::Point(59, 92)); + _trunkInset.fixPriority(252); + BF_GLOBALS._sceneItems.push_front(&_trunkInset); + + _trunkKits.postInit(); + _trunkKits.setVisage(553); + _trunkKits.setStrip(2); + _trunkKits.setPosition(Common::Point(57, 73)); + _trunkKits.fixPriority(254); + BF_GLOBALS._sceneItems.push_front(&_trunkKits); + BF_GLOBALS._player.enableControl(); + break; + case 3: + if (BF_GLOBALS.getFlag(talkedToHarrisAboutDrunk)) { + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS.setFlag(talkedToHarrisAboutDrunk); + _harrison._flag = 5500; + setAction(&_action2); + } + break; + case 5506: + _harrison.setObjectWrapper(new SceneObjectWrapper()); + ADD_PLAYER_MOVER_NULL(_harrison, 88, 91); + + _object12.show(); + _object12.setDetails(550, 25, -1, 26, 1, NULL); + BF_GLOBALS._sceneItems.push_front(&_object12); + BF_GLOBALS._player.enableControl(); + + _sceneMode = 5507; + setAction(&_sequenceManager, this, 5507, &BF_GLOBALS._player, &_drunk, &_drunkStanding, NULL); + break; + case 5507: + BF_GLOBALS._walkRegions.proc1(2); + BF_GLOBALS._walkRegions.proc1(4); + + _drunkStanding._flag = 1; + BF_GLOBALS._sceneItems.push_front(&_drunkStanding); + BF_GLOBALS._player.enableControl(); + break; + case 5508: + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 5505, &BF_GLOBALS._player, &_object15, NULL); + break; + case 5509: + BF_INVENTORY.setObjectScene(INV_CENTER_PUNCH, 0); + BF_GLOBALS._player.disableControl(); + _sceneMode = 5510; + setAction(&_sequenceManager, this, 5510, &BF_GLOBALS._player, &_vechile2, NULL); + break; + case 5510: + BF_GLOBALS._bookmark = bCalledToDrunkStop; + if (BF_GLOBALS.getFlag(didDrunk)) + BF_GLOBALS.setFlag(fHasLeftDrunk); + + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 5520: + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + _harrison.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.enableControl(); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene551::dispatch() { + SceneExt::dispatch(); + + if ((_drunkStanding._flag != 2) && !_harrison._mover && !_field1CD2) + _harrison.updateAngle(BF_GLOBALS._player._position); +} + +/*-------------------------------------------------------------------------- + * Scene 550 - Study + * + *--------------------------------------------------------------------------*/ + +void Scene560::Action1::signal() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + break; + case 1: + ADD_MOVER(BF_GLOBALS._player, 105, 140); + break; + case 2: + scene->_deskChair.hide(); + + BF_GLOBALS._player.changeZoom(81); + BF_GLOBALS._player.setVisage(561); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.setPosition(Common::Point(96, 138)); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 3: + scene->_deskChair.setVisage(561); + scene->_deskChair.setFrame(BF_GLOBALS._player._frame); + scene->_deskChair.setStrip(BF_GLOBALS._player._strip); + scene->_deskChair.setPosition(BF_GLOBALS._player._position); + + scene->_field380 = 1; + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene560::Action2::signal() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(10); + break; + case 1: + scene->_deskChair.hide(); + + BF_GLOBALS._player.setVisage(561); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount()); + BF_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 2: + scene->_field380 = 0; + scene->_deskChair.setPosition(Common::Point(81, 149)); + scene->_deskChair.setVisage(561); + scene->_deskChair.setStrip(3); + scene->_deskChair.setFrame(1); + scene->_deskChair.fixPriority(151); + scene->_deskChair.show(); + + BF_GLOBALS._player.setVisage(563); + BF_GLOBALS._player.setPosition(Common::Point(105, 140)); + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.animate(ANIM_MODE_1, this); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.enableControl(); + ADD_PLAYER_MOVER(scene->_destPosition.x, scene->_destPosition.y); + remove(); + break; + default: + break; + } +} + +void Scene560::Action3::signal() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + setDelay(10); + break; + case 1: + if (scene->_field380) { + setDelay(10); + } else { + setAction(&scene->_action1, this); + } + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(570); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene560::PicturePart::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (scene->_field380) { + SceneItem::display2(560, 54); + } else if ((scene->_sceneMode != 4) && (scene->_sceneMode != 3)) { + scene->_sceneMode = _flag + 4; + PlayerMover *mover = new PlayerMover(); + Common::Point destPos(139, 106); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } + return true; + default: + return NamedHotspotExt::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene560::DeskChair::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && !scene->_field380) { + scene->setAction(&scene->_action1); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene560::Box::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (scene->_field380) { + SceneItem::display2(560, 54); + } else { + scene->_sceneMode = 9; + Common::Point destPos(289, 108); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &destPos, scene); + } + return true; + default: + return NamedObjectExt::startAction(action, event); + } +} + +void Scene560::SafeInset::postInit(SceneObjectList *OwnerList) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + FocusObject::postInit(); + + _cursorVisage.setVisage(1, 5); + + if (BF_GLOBALS._safeCombination == 172) { + setFrame(2); + if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) { + scene->_nickel.postInit(); + scene->_nickel.setVisage(560); + scene->_nickel.setStrip(2); + scene->_nickel.setFrame(3); + scene->_nickel.fixPriority(252); + scene->_nickel.setPosition(Common::Point(181, 140)); + scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL); + BF_GLOBALS._sceneItems.remove(&scene->_nickel); + BF_GLOBALS._sceneItems.push_front(&scene->_nickel); + } + } else { + setFrame(1); + _item1.setDetails(Rect(143, 68, 159, 85), 560, 49, 50, -1, 1, NULL); + _item2.setDetails(Rect(159, 68, 175, 85), 560, 49, 50, -1, 1, NULL); + _item3.setDetails(Rect(175, 68, 191, 85), 560, 49, 50, -1, 1, NULL); + _item4.setDetails(Rect(143, 86, 159, 102), 560, 49, 50, -1, 1, NULL); + _item5.setDetails(Rect(159, 86, 175, 102), 560, 49, 50, -1, 1, NULL); + _item6.setDetails(Rect(175, 86, 191, 102), 560, 49, 50, -1, 1, NULL); + + BF_GLOBALS._sceneItems.remove(&_item1); + BF_GLOBALS._sceneItems.remove(&_item2); + BF_GLOBALS._sceneItems.remove(&_item3); + BF_GLOBALS._sceneItems.remove(&_item4); + BF_GLOBALS._sceneItems.remove(&_item5); + BF_GLOBALS._sceneItems.remove(&_item6); + BF_GLOBALS._sceneItems.push_front(&_item6); + BF_GLOBALS._sceneItems.push_front(&_item5); + BF_GLOBALS._sceneItems.push_front(&_item4); + BF_GLOBALS._sceneItems.push_front(&_item3); + BF_GLOBALS._sceneItems.push_front(&_item2); + BF_GLOBALS._sceneItems.push_front(&_item1); + + _item1._flag = 1; + _item2._flag = 2; + _item3._flag = 3; + _item4._flag = 4; + _item5._flag = 5; + _item6._flag = 6; + + _digit2.postInit(); + _digit2.setVisage(560); + _digit2.setStrip(3); + _digit2.setPosition(Common::Point(151, 94)); + _digit2.fixPriority(252); + + _digit1.postInit(); + _digit1.setVisage(560); + _digit1.setStrip(3); + _digit1.setPosition(Common::Point(167, 94)); + _digit1.fixPriority(252); + + _digit0.postInit(); + _digit0.setVisage(560); + _digit0.setStrip(3); + _digit0.setPosition(Common::Point(183, 94)); + _digit0.fixPriority(252); + + int amount = (BF_GLOBALS._safeCombination != 0) ? BF_GLOBALS._safeCombination : 1000; + + // Get digit 0 portion + int remainder = amount % 10; + amount /= 10; + _digit0.setFrame(!remainder ? 10 : remainder); + + // Get digit 1 portion + remainder = amount % 10; + amount /= 10; + _digit1.setFrame(!remainder ? 10 : remainder); + + // Get digit 2 portion + remainder = amount % 10; + _digit2.setFrame(!remainder ? 10 : remainder); + } +} + +void Scene560::SafeInset::remove() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + _item1.remove(); + _item2.remove(); + _item3.remove(); + _item4.remove(); + _item5.remove(); + _item6.remove(); + _digit2.remove(); + _digit1.remove(); + _digit0.remove(); + + scene->_nickel.remove(); + + if (BF_GLOBALS._events.getCursor() == CURSOR_USE) { + GfxSurface cursor = _cursorVisage.getFrame(2); + BF_GLOBALS._events.setCursor(cursor); + } + + FocusObject::remove(); +} + +void Scene560::SafeInset::signal() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + // Recalculate the new total + int total = 0; + if (_digit2._frame < 10) + total = _digit2._frame * 100; + if (_digit1._frame < 10) + total += _digit1._frame * 10; + if (_digit0._frame < 10) + total += _digit0._frame; + + BF_GLOBALS._safeCombination = !total ? 1000 : total; + + // Check if the combination is correct + if (total == 172) { + BF_GLOBALS._sceneObjects->draw(); + + if (!BF_GLOBALS.getFlag(fGotPointsForBank)) { + BF_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.setFlag(fGotPointsForBank); + } + + setFrame(2); + GfxSurface cursor = _cursorVisage.getFrame(2); + BF_GLOBALS._events.setCursor(cursor); + + _item1.remove(); + _item2.remove(); + _item3.remove(); + _item4.remove(); + _item5.remove(); + _item6.remove(); + _digit2.remove(); + _digit1.remove(); + _digit0.remove(); + + if (BF_INVENTORY.getObjectScene(INV_NICKEL) == 560) { + // Nickel is still in the safe, show it + scene->_nickel.postInit(); + scene->_nickel.setVisage(560); + scene->_nickel.setStrip(2); + scene->_nickel.setFrame(3); + scene->_nickel.fixPriority(252); + scene->_nickel.setPosition(Common::Point(181, 140)); + scene->_nickel.setDetails(560, 47, 48, -1, 1, NULL); + BF_GLOBALS._sceneItems.remove(&scene->_nickel); + BF_GLOBALS._sceneItems.push_front(&scene->_nickel); + } + } +} +void Scene560::SafeInset::process(Event &event) { + if (_bounds.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + if (cursorId == CURSOR_USE) { + // Instead of standard cursor, use special hand cursor + GfxSurface cursor = _cursorVisage.getFrame(6); + BF_GLOBALS._events.setCursor(cursor); + } else { + // Set cursor again just in case Exit cursor was showing + BF_GLOBALS._events.setCursor(cursorId); + } + + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (event.btnState == 3)) { + BF_GLOBALS._events.setCursor(CURSOR_USE); + event.handled = true; + } + } else { + GfxSurface cursor = _cursorVisage.getFrame(7); + BF_GLOBALS._events.setCursor(cursor); + + if ((event.mousePos.y < BF_INTERFACE_Y) && (event.eventType == EVENT_BUTTON_DOWN)) { + // Leave the safe view + event.handled = true; + remove(); + } + } +} + +bool Scene560::SafeInset::Item::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + switch (_flag) { + case 1: { + int newFrame = scene->_safeInset._digit2._frame + 1; + if (newFrame == 11) + newFrame = 1; + + scene->_safeInset._digit2.setFrame(newFrame); + break; + } + case 2: { + int newFrame = scene->_safeInset._digit1._frame + 1; + if (newFrame == 11) + newFrame = 1; + + scene->_safeInset._digit1.setFrame(newFrame); + break; + } + case 3: { + int newFrame = scene->_safeInset._digit0._frame + 1; + if (newFrame == 11) + newFrame = 1; + + scene->_safeInset._digit0.setFrame(newFrame); + break; + } + case 4: { + int newFrame = scene->_safeInset._digit2._frame - 1; + if (newFrame == 0) + newFrame = 10; + + scene->_safeInset._digit2.setFrame(newFrame); + break; + } + case 5: { + int newFrame = scene->_safeInset._digit1._frame - 1; + if (newFrame == 0) + newFrame = 10; + + scene->_safeInset._digit1.setFrame(newFrame); + break; + } + case 6: { + int newFrame = scene->_safeInset._digit0._frame - 1; + if (newFrame == 0) + newFrame = 10; + + scene->_safeInset._digit0.setFrame(newFrame); + break; + } + default: + break; + } + + scene->_safeInset.signal(); + scene->_sound1.play(75); + return true; + default: + return NamedHotspotExt::startAction(action, event); + } +} + +bool Scene560::Nickel::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_INVENTORY.setObjectScene(INV_NICKEL, 1); + BF_GLOBALS._uiElements.addScore(10); + remove(); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +void Scene560::BoxInset::postInit(SceneObjectList *OwnerList) { + FocusObject::postInit(); + _item1.setDetails(Rect(110, 48, 189, 102), 560, 43, 44, -1, 1, NULL); + BF_GLOBALS._sceneItems.remove(&_item1); + BF_GLOBALS._sceneItems.push_front(&_item1); +} + +void Scene560::BoxInset::remove() { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + if (scene->_sceneMode != 3) + scene->_sceneMode = 0; + + _item1.remove(); + FocusObject::remove(); +} + +bool Scene560::BoxInset::Item1::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + if (!BF_GLOBALS.getFlag(fGotPointsForBox)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fGotPointsForBox); + } + + scene->_safeInset.postInit(); + scene->_safeInset.setVisage(560); + scene->_safeInset.setStrip(2); + scene->_safeInset.setPosition(Common::Point(160, 141)); + scene->_safeInset.fixPriority(251); + scene->_safeInset.setDetails(560, 45, 46, -1); + + scene->_sceneMode = 3; + scene->_boxInset.remove(); + + GfxSurface cursor = surfaceFromRes(1, 5, 6); + BF_GLOBALS._events.setCursor(cursor); + return true; + } else { + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene560::Computer::startAction(CursorType action, Event &event) { + Scene560 *scene = (Scene560 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_GLOBALS._bookmark < bTalkedToGrannyAboutSkipsCard) { + SceneItem::display2(666, 24); + } else { + scene->setAction(&scene->_action3); + } + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +Scene560::Scene560(): SceneExt() { + _field380 = _field11EA = 0; +} + +void Scene560::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(560); + setZoomPercents(100, 60, 168, 90); + _stripManager.addSpeaker(&_gameTextSpeaker); + + _picture1.setDetails(Rect(121, 16, 139, 35), 560, -1, -1, -1, 1, NULL); + _picture2.setDetails(Rect(139, 16, 157, 35), 560, -1, -1, -1, 1, NULL); + _picture3.setDetails(Rect(121, 35, 139, 54), 560, -1, -1, -1, 1, NULL); + _picture4.setDetails(Rect(139, 35, 157, 54), 560, -1, -1, -1, 1, NULL); + _picture1._flag = 3; + _picture2._flag = 4; + _picture3._flag = 2; + _picture4._flag = 1; + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 3; + + if (BF_GLOBALS._bookmark >= bTalkedToGrannyAboutSkipsCard) { + _box.postInit(); + _box.setVisage(560); + _box.setStrip(4); + _box.setFrame(1); + _box.setPosition(Common::Point(295, 37)); + _box.setDetails(560, 41, 42, -1, 1, NULL); + } + + _deskChair.postInit(); + _deskChair.setVisage(561); + _deskChair.setStrip(3); + _deskChair.setPosition(Common::Point(81, 149)); + _deskChair.fixPriority(151); + _deskChair.changeZoom(81); + + if (BF_GLOBALS._sceneManager._previousScene == 570) { + // Returning from using computer + BF_GLOBALS._events.setCursor(CURSOR_USE); + + _deskChair.hide(); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(561); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(BF_GLOBALS._player.getFrameCount()); + BF_GLOBALS._player._moveDiff.x = 11; + BF_GLOBALS._player.setPosition(Common::Point(96, 138)); + BF_GLOBALS._player.changeZoom(81); + + _deskChair.setFrame(BF_GLOBALS._player._frame); + _deskChair.setStrip(BF_GLOBALS._player._strip); + _deskChair.setPosition(BF_GLOBALS._player._position); + + _field11EA = 0; + _field380 = 1; + } else { + // Entering study through doorway + _field11EA = 0; + _field380 = 0; + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(563); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.setPosition(Common::Point(79, 110)); + BF_GLOBALS._player._moveDiff.x = 11; + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.disableControl(); + + _sceneMode = 10; + ADD_MOVER(BF_GLOBALS._player, 85, 115); + } + + _computer.setDetails(Rect(16, 77, 58, 107), 560, 2, -1, -1, 1, NULL); + _deskChair.setDetails(560, 3, -1, -1, 1, NULL); + _chair.setDetails(Rect(163, 64, 196, 102), 560, 13, 25, 36, 1, NULL); + _lamp.setDetails(Rect(197, 43, 214, 56), 560, 7, 19, 30, 1, NULL); + _item4.setDetails(Rect(121, 18, 156, 54), 560, 8, 20, 31, 1, NULL); + _trophy.setDetails(Rect(259, 52, 275, 63), 560, 10, 22, 33, 1, NULL); + _watercolours.setDetails(Rect(214, 48, 239, 64), 560, 12, 24, 35, 1, NULL); + _fileCabinets.setDetails(Rect(0, 47, 49, 100), 560, 14, 26, 37, 1, NULL); + _certificate.setDetails(Rect(280, 51, 292, 62), 560, 11, 23, 34, 1, NULL); + _bookcase.setDetails(Rect(176, 0, 319, 103), 560, 9, 21, 32, 1, NULL); + _desk.setDetails(1, 560, 6, 10, 29, 1); + _item12.setDetails(Rect(62, 16, 96, 101), 560, 51, 52, 53, 1, NULL); + _carpet.setDetails(Rect(0, 103, 319, 167), 560, 5, 16, 28, 1, NULL); + _office.setDetails(Rect(0, 0, 320, 168), 560, 4, -1, -1, 1, NULL); + + BF_GLOBALS._player.enableControl(); +} + +void Scene560::signal() { + switch (_sceneMode) { + case 1: + _object6.hide(); + _object6.remove(); + BF_GLOBALS._player.enableControl(); + break; + case 5: + case 6: + case 7: + case 8: + BF_GLOBALS._player._strip = 4; + BF_GLOBALS._player._frame = 1; + BF_GLOBALS._player.disableControl(); + + _object6.postInit(); + _object6.setVisage(560); + _object6.setStrip(1); + _object6.setFrame(_sceneMode - 4); + _object6.setPosition(Common::Point(160, 141)); + _object6.fixPriority(250); + _stripManager.start(_sceneMode + 5595, this); + _sceneMode = 1; + break; + case 9: + // Clicked on the Baseball Cards Box + _object6._strip = 4; + _object6._frame = 1; + + if (BF_GLOBALS._safeCombination == 172) { + if (_sceneMode != 3) { + _safeInset.postInit(); + _safeInset.setVisage(560); + _safeInset.setStrip(2); + _safeInset.setPosition(Common::Point(160, 141)); + _safeInset.fixPriority(251); + _safeInset.setDetails(560, 45, 46, -1); + + _sceneMode = 3; + } + } else if ((_sceneMode != 3) && (_sceneMode != 4)) { + if (!BF_GLOBALS.getFlag(fGotPointsForPunch)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fGotPointsForPunch); + } + + _boxInset.postInit(); + _boxInset.setVisage(560); + _boxInset.setStrip(2); + _boxInset.setFrame(4); + _boxInset.setPosition(Common::Point(160, 141)); + _boxInset.fixPriority(251); + _boxInset.setDetails(560, 43, 44, -1); + + _sceneMode = 4; + } + break; + case 10: + _field11EA = 0; + BF_GLOBALS._player.enableControl(); + break; + case 11: + BF_GLOBALS._sceneManager.changeScene(270); + break; + } +} + +void Scene560::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && + (_field380 == 1) && !_action) { + _destPosition = event.mousePos; + BF_GLOBALS._player.disableControl(); + setAction(&_action2); + + event.handled = true; + } + + SceneExt::process(event); +} + +void Scene560::dispatch() { + if (!_field11EA && (BF_GLOBALS._player._position.y < 105)) { + _field11EA = 1; + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sceneManager.changeScene(270); + } + + SceneExt::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 570 - Computer + * + *--------------------------------------------------------------------------*/ + +Scene570::PasswordEntry::PasswordEntry(): EventHandler() { + _passwordStr = SCENE570_PASSWORD; +} + +void Scene570::PasswordEntry::synchronize(Serializer &s) { + EventHandler::synchronize(s); + s.syncString(_entryBuffer); +} + +void Scene570::PasswordEntry::postInit(SceneObjectList *OwnerList) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + scene->_sceneMode = 10; + scene->_object3.setStrip(6); + scene->_object3.setFrame(1); + scene->_object3.fixPriority(3); + + _passwordText._color1 = 22; + _passwordText._color2 = 9; + _passwordText._color3 = 9; + _passwordText._width = 128; + _passwordText._fontNumber = 9000; + _passwordText.setPosition(Common::Point(165, 40)); + _passwordText.fixPriority(255); + _passwordText.setup(_passwordStr); + + _entryText._color1 = 22; + _entryText._color2 = 9; + _entryText._color3 = 9; + _entryText._width = 128; + _entryText._fontNumber = 9000; + _entryText.setPosition(Common::Point(220, 40)); + _entryText.fixPriority(255); + _entryText.setup(_entryBuffer); +} + +void Scene570::PasswordEntry::process(Event &event) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + bool entryChanged = false; + + switch (event.eventType) { + case EVENT_KEYPRESS: { + int key = toupper(event.kbd.ascii); + scene->_sound1.play(72); + + if ((event.kbd.keycode == Common::KEYCODE_BACKSPACE) || (event.kbd.keycode == Common::KEYCODE_DELETE)) { + // Delete a key from the entry + if (_entryBuffer.size() > 0) + _entryBuffer.deleteLastChar(); + entryChanged = true; + } else if (event.kbd.keycode == Common::KEYCODE_RETURN) { + // Finished entering password + _passwordText.remove(); + _entryText.remove(); + + checkPassword(); + remove(); + } else if ((key >= 32) || (key <= 126)) { + // Valid character pressed + if (_entryBuffer.size() < 10) + _entryBuffer += (char)key; + event.handled = true; + entryChanged = true; + } + break; + } + case EVENT_BUTTON_DOWN: + event.handled = true; + break; + default: + break; + } + + if (entryChanged) { + _entryText._color1 = 22; + _entryText._color2 = 9; + _entryText._color3 = 9; + _entryText._width = 128; + _entryText._fontNumber = 9000; + _entryText.setPosition(Common::Point(213, 40)); + _entryText.fixPriority(255); + _entryText.setup(_entryBuffer); + + // Pad entered text with spaces to make up the allowed width and then display + Common::String msg = _entryBuffer; + while (msg.size() < 10) + msg += " "; + _entryText.setup(msg); + } +} + +void Scene570::PasswordEntry::checkPassword() { + // Check if the password is correctly entered as 'JACKIE' or, as a nod to the + // reimplementation in ScummVM, as the project name. + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + if (!_entryBuffer.compareTo("JACKIE") || !_entryBuffer.compareTo("SCUMMVM")) { + // Password was correct + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS._player.disableControl(); + scene->_sound1.play(73); + + BF_GLOBALS._uiElements.hide(); + BF_GLOBALS._uiElements._active = false; + scene->_sceneMode = 5701; + scene->setAction(&scene->_sequenceManager, scene, 5701, &scene->_object3, NULL); + } else { + // Password was incorrect + _entryBuffer = ""; + + scene->_object3.fixPriority(1); + scene->_iconManager.refreshList(); + BF_GLOBALS._events.setCursor(CURSOR_USE); + scene->_sceneMode = 0; + } +} + +Scene570::IconManager::IconManager(): EventHandler() { + _mode = _selectedFolder = _fieldAA = _fieldAC = 0; +} + +void Scene570::IconManager::remove() { + _object1.remove(); + EventHandler::remove(); +} + +void Scene570::IconManager::setup(int mode) { + _mode = mode; + _selectedFolder = 0; + + _object1.postInit(); + _object1.setVisage(572); + _object1.fixPriority(2); + _object1.setFrame((mode == 1) ? 4 : 5); + EventHandler::postInit(); +} + +void Scene570::IconManager::hideList() { + SynchronizedList<Icon *>::iterator i; + for (i = _list.begin(); i != _list.end(); ++i) { + (*i)->_sceneText.remove(); + } +} + +void Scene570::IconManager::refreshList() { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + _object1.setPosition(Common::Point(163, 19)); + scene->_object3.setStrip(4); + + // Clear any current icons + SynchronizedList<Icon *>::iterator i; + for (i = _list.begin(); i != _list.end(); ++i) { + Icon *item = *i; + + item->setVisage(572); + item->setStrip(1); + item->fixPriority(2); + item->setPosition(Common::Point(330, 100)); + item->_sceneText.remove(); + } + + // Refresh the list + int iconIndex = 0, folderIndex = 0; + for (i = _list.begin(); i != _list.end(); ++i) { + Icon *item = *i; + + if (item->_iconId == 1) { + // Folder + int parentId = item->_parentFolderId; + item->setFrame((_selectedFolder == (item->_folderId - 1)) ? 1 : 8); + item->setPosition(Common::Point(168 + parentId * 11, folderIndex * 8 + 27)); + item->_sceneText.setPosition(Common::Point(175 + parentId * 11, folderIndex * 8 + 21)); + item->_sceneText.setup(item->_text); + ++folderIndex; + } else if (item->_parentFolderId == _selectedFolder) { + item->setPosition(Common::Point(229, 27 + iconIndex * 12)); + + switch (item->_iconId) { + case 2: + item->setFrame(9); + break; + case 3: + item->setFrame(7); + break; + case 5: + item->setFrame(10); + break; + case 6: + item->setFrame(11); + break; + case 7: + item->setFrame(12); + break; + default: + break; + } + + item->_sceneText.setPosition(Common::Point(236, iconIndex * 12 + 22)); + item->_sceneText.setup(item->_text); + ++iconIndex; + } + } +} + +void Scene570::IconManager::addItem(Icon *item) { + item->_mode = _mode; + _list.push_back(item); +} + +Scene570::Icon::Icon(): NamedObject() { + _iconId = _folderId = 0; +} + +void Scene570::Icon::synchronize(Serializer &s) { + NamedObject::synchronize(s); + s.syncAsSint16LE(_iconId); + s.syncAsSint16LE(_folderId); + s.syncAsSint16LE(_parentFolderId); + s.syncAsSint16LE(_mode); +} + +void Scene570::Icon::remove() { + _sceneText.remove(); + NamedObject::remove(); +} + +bool Scene570::Icon::startAction(CursorType action, Event &event) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + switch (_iconId) { + case 1: + SceneItem::display2(570, 9); + break; + case 2: + SceneItem::display2(570, 10); + break; + case 3: + SceneItem::display2(570, 4); + break; + case 5: + SceneItem::display2(570, 11); + break; + case 6: + SceneItem::display2(570, 12); + break; + case 7: + SceneItem::display2(570, 13); + break; + default: + break; + } + return true; + case CURSOR_USE: + // Select the given icon + scene->_sound1.play(73); + switch (_iconId) { + case 1: + // Folder, so select it + scene->_iconManager._selectedFolder = _folderId - 1; + scene->_iconManager.refreshList(); + break; + case 2: + scene->_iconManager.hideList(); + scene->_sceneMode = 5702; + scene->setAction(&scene->_sequenceManager, scene, 5702, &scene->_object3, NULL); + break; + case 3: + scene->_iconManager.hideList(); + scene->_passwordEntry.postInit(); + break; + case 5: + SceneItem::display2(570, 5); + break; + case 6: + scene->_iconManager.hideList(); + switch (_folderId) { + case 8: + BF_GLOBALS._uiElements.hide(); + BF_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; + scene->_sceneMode = 5706; + scene->setAction(&scene->_sequenceManager, scene, 5706, &scene->_object3, NULL); + break; + case 12: + BF_GLOBALS._uiElements.hide(); + BF_GLOBALS._uiElements._active = false; + scene->_sceneMode = 5707; + scene->setAction(&scene->_sequenceManager, scene, 5707, &scene->_object3, NULL); + break; + default: + break; + } + break; + case 7: + scene->_iconManager.hideList(); + BF_GLOBALS._uiElements.hide(); + BF_GLOBALS._uiElements._active = false; + scene->_sceneMode = 5704; + scene->setAction(&scene->_sequenceManager, scene, 5704, &scene->_object3, NULL); + break; + } + return true; + case CURSOR_TALK: + SceneItem::display2(570, 15); + return true; + case CURSOR_PRINTER: + switch (_iconId) { + case 1: + // Folder - "You can't print that" + SceneItem::display2(570, 8); + break; + case 7: + scene->_sound1.play(74); + if (BF_INVENTORY.getObjectScene(INV_PRINT_OUT) == 570) { + SceneItem::display2(570, 6); + BF_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(INV_PRINT_OUT, 1); + } else { + SceneItem::display2(570, 7); + } + break; + default: + // You don't want to print that + SceneItem::display2(570, 18); + break; + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +void Scene570::Icon::setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + NamedObject::postInit(); + + _iconId = iconId; + _folderId = folderId; + _parentFolderId = parentFolderId; + _text = msg; + + _sceneText._color1 = 22; + _sceneText._color2 = 9; + _sceneText._color3 = 9; + _sceneText._width = 128; + _sceneText._fontNumber = 9000; + _sceneText.fixPriority(2); + + BF_GLOBALS._sceneItems.push_front(this); + scene->_iconManager.addItem(this); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene570::PowerSwitch::startAction(CursorType action, Event &event) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (scene->_object4._flag == 1) { + setFrame(1); + scene->_object3.remove(); + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForCoin)) { + BF_GLOBALS._uiElements.addScore(10); + BF_GLOBALS.setFlag(fGotPointsForCoin); + } + + scene->_sound1.play(70); + scene->_object4._flag = 1; + setFrame(2); + + scene->_object3.postInit(); + scene->_object3.fixPriority(1); + scene->_object3.setDetails(570, 16, 15, 17); + BF_GLOBALS._sceneItems.remove(&scene->_object3); + BF_GLOBALS._sceneItems.push_front(&scene->_object3); + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5700; + setAction(&scene->_sequenceManager, scene, 5700, &scene->_object3, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene570::PrinterIcon::startAction(CursorType action, Event &event) { + if (action == CURSOR_USE) { + BF_GLOBALS._events.setCursor(CURSOR_PRINTER); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +void Scene570::Object3::remove() { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + scene->_object4._flag = 0; + + scene->_printerIcon.remove(); + scene->_iconManager.remove(); + scene->_folder1.remove(); + scene->_folder2.remove(); + scene->_folder3.remove(); + scene->_folder4.remove(); + scene->_icon1.remove(); + scene->_icon2.remove(); + scene->_icon3.remove(); + scene->_icon4.remove(); + scene->_icon5.remove(); + scene->_icon6.remove(); + scene->_icon7.remove(); + scene->_icon8.remove(); + scene->_icon9.remove(); + + FocusObject::remove(); + BF_GLOBALS._sceneManager.changeScene(560); +} + +/*--------------------------------------------------------------------------*/ + +bool Scene570::FloppyDrive::startAction(CursorType action, Event &event) { + Scene570 *scene = (Scene570 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(INV_D_FLOPPY) == 571) { + BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 1); + scene->_iconManager.refreshList(); + SceneItem::display2(570, 2); + } else { + SceneItem::display2(570, 3); + } + return true; + case INV_D_FLOPPY: + BF_INVENTORY.setObjectScene(INV_D_FLOPPY, 571); + scene->_iconManager.refreshList(); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene570::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(570); + + _stripManager.addSpeaker(&_gameTextSpeaker); + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + _object4._flag = 0; + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.hide(); + + _powerSwitch.postInit(); + _powerSwitch.setVisage(570); + _powerSwitch.setStrip(4); + _powerSwitch.setFrame(1); + _powerSwitch.setPosition(Common::Point(163, 131)); + _powerSwitch.setDetails(570, 1, 15, -1, 1, NULL); + + _floppyDrive.setDetails(Rect(258, 111, 303, 120), 570, 0, 15, -1, 1, NULL); + _item11.setDetails(0, 570, 15, 15, 15, 1); + _monitor.setDetails(1, 570, 19, 20, 21, 1); + _item3.setDetails(2, 570, 22, 23, 24, 1); + _case.setDetails(3, 570, 25, 26, 27, 1); + _keyboard.setDetails(4, 570, 28, 29, 30, 1); + _desk.setDetails(5, 570, 31, 32, 33, 1); + _printer.setDetails(7, 570, 37, 38, 39, 1); + _window.setDetails(8, 570, 40, 41, 42, 1); + _plant.setDetails(9, 570, 43, 44, 45, 1); + + if ((BF_GLOBALS._dayNumber == 1) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) { + _object4.postInit(); + _object4.setVisage(574); + _object4.setPosition(Common::Point(90, 84)); + } +} + +void Scene570::signal() { + switch (_sceneMode) { + case 5700: + _object3.setStrip(4); + _object3.setFrame(1); + + _printerIcon.postInit(); + _printerIcon.setVisage(572); + _printerIcon.setFrame(3); + _printerIcon.setPosition(Common::Point(172, 71)); + _printerIcon.fixPriority(2); + _printerIcon.setDetails(570, 14, 15, -1, 2, NULL); + + _iconManager.setup(2); + _folder1.setDetails(1, 1, 0, 2, SCENE570_C_DRIVE); + _folder2.setDetails(1, 2, 1, 2, SCENE570_RING); + _folder3.setDetails(1, 3, 1, 2, SCENE570_PROTO); + _folder4.setDetails(1, 4, 1, 2, SCENE570_WACKY); + + if (!BF_GLOBALS.getFlag(fDecryptedBluePrints)) + _icon1.setDetails(3, 5, 0, 2, SCENE570_COBB); + _icon2.setDetails(2, 7, 0, 2, SCENE570_LETTER); + if (BF_GLOBALS.getFlag(fDecryptedBluePrints)) + _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB); + + _icon4.setDetails(6, 8, 1, 2, SCENE570_RINGEXE); + _icon5.setDetails(5, 9, 1, 2, SCENE570_RINGDATA); + _icon6.setDetails(6, 10, 2, 2, SCENE570_PROTOEXE); + _icon7.setDetails(5, 11, 2, 2, SCENE570_PROTODATA); + _icon8.setDetails(6, 12, 3, 2, SCENE570_WACKYEXE); + _icon9.setDetails(5, 13, 3, 2, SCENE570_WACKYDATA); + + _iconManager.refreshList(); + BF_GLOBALS._player.enableControl(); + break; + case 5701: + BF_GLOBALS.setFlag(fDecryptedBluePrints); + _iconManager._list.remove(&_icon1); + _icon1.remove(); + + _object3.setVisage(572); + _object3.setStrip(4); + _object3.setFrame(1); + _object3.fixPriority(1); + + _icon3.setDetails(7, 6, 0, 2, SCENE570_COBB); + _iconManager.refreshList(); + BF_GLOBALS._uiElements._active = true; + BF_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(); + _object3.setPosition(Common::Point(220, 75)); + _object3.setVisage(572); + _object3.setStrip(4); + _object3.setFrame(1); + // Deliberate fall-through + case 5702: + case 5703: + _object3.fixPriority(1); + _iconManager.refreshList(); + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene570::process(Event &event) { + SceneExt::process(event); + + if (!event.handled && (_sceneMode == 10)) + // Password entry active, so pass events to it + _passwordEntry.process(event); +} + +/*-------------------------------------------------------------------------- + * Scene 580 - Child Protective Services Parking Lot + * + *--------------------------------------------------------------------------*/ + +bool Scene580::Vechile::startAction(CursorType action, Event &event) { + Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager, scene, 5800, &BF_GLOBALS._player, NULL); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene580::Door::startAction(CursorType action, Event &event) { + Scene580 *scene = (Scene580 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 5802; + scene->setAction(&scene->_sequenceManager, scene, 5802, &BF_GLOBALS._player, this, NULL); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene580::Lyle::startAction(CursorType action, Event &event) { + if (action == CURSOR_LOOK) { + SceneItem::display2(580, 7); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene580::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(580); + setZoomPercents(45, 95, 55, 100); + BF_GLOBALS._sound1.changeSound(33); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._moveDiff = Common::Point(2, 1); + + _door.postInit(); + _door.setVisage(580); + _door.setStrip(4); + _door.setPosition(Common::Point(168, 41)); + _door.hide(); + _door.setDetails(580, 5, -1, -1, 1, NULL); + + _vechile.postInit(); + _vechile.setVisage(580); + _vechile.fixPriority(65); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle._moveDiff = Common::Point(2, 1); + _lyle.setPosition(Common::Point(149, 70)); + BF_GLOBALS._sceneItems.push_back(&_lyle); + + _vechile.changeZoom(90); + _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); + } else { + _vechile.setPosition(Common::Point(159, 72)); + + if (BF_GLOBALS.getFlag(onDuty)) { + _vechile.setStrip(1); + _vechile.setFrame(2); + _vechile.setDetails(300, 11, 13, -1, 1, NULL); + + BF_GLOBALS._player.setVisage(304); + } else { + _vechile.setStrip(2); + _vechile.setFrame(3); + _vechile.setDetails(580, 0, 1, -1, 1, NULL); + + BF_GLOBALS._player.setVisage(303); + } + } + + BF_GLOBALS._player.updateAngle(_vechile._position); + + if (BF_GLOBALS._sceneManager._previousScene == 590) { + // Leaving Services + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 5801, &BF_GLOBALS._player, NULL); + } else { + // Arriving at parking lot + BF_GLOBALS._player.setPosition(Common::Point(177, 58)); + signal(); + } + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 580, 6, -1, -1, 1, NULL); +} + +void Scene580::signal() { + switch (_sceneMode) { + case 1: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 5802: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(590); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene580::process(Event &event) { + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == INV_COLT45) && + BF_GLOBALS._player.contains(event.mousePos)) { + BF_GLOBALS._player.disableControl(); + SceneItem::display2(350, 26); + + _sceneMode = 0; + signal(); + event.handled = true; + } +} + +/*-------------------------------------------------------------------------- + * Scene 590 - Child Protective Services + * + *--------------------------------------------------------------------------*/ + +bool Scene590::Laura::startAction(CursorType action, Event &event) { + Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (!scene->_field17DC) + scene->_stripNumber = 5905; + else if (!scene->_field17DE) { + if (scene->_field17E2) { + scene->_stripNumber = 5907; + } else { + scene->_field17E2 = 1; + scene->_stripNumber = 5906; + } + } + + scene->setAction(&scene->_action1); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene590::Skip::startAction(CursorType action, Event &event) { + Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (BF_INVENTORY.getObjectScene(INV_BASEBALL_CARD) == 1) { + scene->_stripNumber = !scene->_field17DC ? 5903 : 5902; + } else { + scene->_stripNumber = !scene->_field17DC ? 5901 : 5902; + } + + scene->setAction(&scene->_action1); + scene->_field17DC = 1; + return true; + case INV_BASEBALL_CARD: + scene->_field17DE = 1; + BF_GLOBALS._uiElements.addScore(10); + BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 2); + BF_GLOBALS._player.disableControl(); + + scene->_stripNumber = !scene->_field17DC ? 5900 : 5904; + scene->_field17DC = 1; + scene->setAction(&scene->_action2); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene590::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 100, BF_GLOBALS._player._position.y + 75); + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene590::Action1::signal() { + Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_PLAYER_MOVER(220, 132); + break; + case 1: + scene->_stripManager.start(scene->_stripNumber, this); + break; + case 2: + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene590::Action2::signal() { + Scene590 *scene = (Scene590 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132); + break; + } + case 1: + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 220, 132); + break; + case 2: + BF_GLOBALS._player.setVisage(381); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.setPosition(Common::Point(257, 130)); + BF_GLOBALS._player.animate(ANIM_MODE_4, 3, 1, this); + + scene->_skip.setStrip(2); + scene->_skip.animate(ANIM_MODE_5, NULL); + break; + case 3: + scene->_skip.animate(ANIM_MODE_6, NULL); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 4: + scene->_skip.setStrip(1); + scene->_skip.animate(ANIM_MODE_1, NULL); + + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player.setStrip(7); + BF_GLOBALS._player.setPosition(Common::Point(238, 131)); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + scene->_stripManager.start(scene->_stripNumber, this); + break; + case 5: + scene->_sceneMode = 3; + scene->signal(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene590::Scene590(): PalettedScene() { + _field17DC = _field17DE = _stripNumber = _field17E2 = 0; +} + +void Scene590::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + s.syncAsSint16LE(_field17DC); + s.syncAsSint16LE(_field17DE); + s.syncAsSint16LE(_stripNumber); + s.syncAsSint16LE(_field17E2); +} + +void Scene590::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(590); + + BF_GLOBALS._sound1.fadeOut2(NULL); + _sound1.play(18); + _sound1.fade(100, 5, 10, false, NULL); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._bookmark = bEndOfWorkDayOne; + BF_INVENTORY.setObjectScene(INV_BASEBALL_CARD, 1); + } + + _exit.setDetails(Rect(0, 157, 182, 167), 590, -1, -1, -1, 1, NULL); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setPosition(Common::Point(0, 190)); + + _stripManager.addSpeaker(&_skipSpeaker); + _stripManager.addSpeaker(&_lauraSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + + if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.setVisage(361); + BF_GLOBALS._player._moveDiff = Common::Point(6, 2); + } else { + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player._moveDiff = Common::Point(6, 2); + + if ((BF_GLOBALS._bookmark >= bEndOfWorkDayOne) && (BF_GLOBALS._bookmark < bLyleStoppedBy)) { + _skip.postInit(); + _skip.setVisage(693); + _skip.setPosition(Common::Point(271, 117)); + _skip.setDetails(590, 26, -1, 27, 1, NULL); + + _laura.postInit(); + _laura.setVisage(692); + _laura.setPosition(Common::Point(248, 115)); + _laura.setDetails(590, 24, -1, 25, 1, NULL); + } + } + + _item2.setDetails(1, 590, 0, -1, 12, 1); + _item3.setDetails(3, 590, 2, -1, 14, 1); + _item4.setDetails(20, 590, 3, -1, 15, 1); + _item5.setDetails(22, 590, 4, -1, 16, 1); + _item6.setDetails(7, 590, 6, -1, 17, 1); + _item7.setDetails(7, 590, 6, -1, 18, 1); + _item8.setDetails(9, 590, 7, -1, 19, 1); + _item9.setDetails(11, 590, 8, -1, 20, 1); + _item10.setDetails(13, 590, 9, -1, 21, 1); + _item11.setDetails(15, 590, 10, -1, 22, 1); + _item12.setDetails(17, 590, 11, -1, 23, 1); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 5900, &BF_GLOBALS._player, NULL); +} + +void Scene590::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 1: + _sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(271); + break; + case 2: + _sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(580); + break; + case 3: + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 0, 170); + + _skip.animate(ANIM_MODE_1, NULL); + ADD_MOVER_NULL(_skip, 0, 170); + + _laura.animate(ANIM_MODE_1, NULL); + ADD_MOVER_NULL(_laura, 0, 170); + + _sceneMode = 1; + addFader((byte *)&black, 2, this); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene590::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_exit.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_SW); + 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); + } + } +} + +} // 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 new file mode 100644 index 0000000000..8ff5b40657 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes5.h @@ -0,0 +1,406 @@ +/* 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_BLUEFORCE_SCENES5_H +#define TSAGE_BLUEFORCE_SCENES5_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene550: public SceneExt { + /* Objects */ + class Object1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class CaravanDoor: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1: public ActionExt { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Object1 _object1; + CaravanDoor _caravanDoor; + Vechile _vechile; + NamedHotspot _item1, _item2, _item3; + SpeakerGameText _gameTextSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + Action1 _action1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene551: public Scene550 { + /* Objects */ + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class DrunkStanding: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Drunk: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class PatrolCarTrunk: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class TrunkInset: public FocusObject { + public: + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + }; + class TrunkKits: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Harrison: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Item4: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action2: public Action { + public: + virtual void signal(); + }; +public: + SpeakerDrunk _drunkSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerGiggles _gigglesSpeaker; + Vechile _vechile2; + DrunkStanding _drunkStanding; + Drunk _drunk; + PatrolCarTrunk _patrolCarTrunk; + TrunkInset _trunkInset; + TrunkKits _trunkKits; + Harrison _harrison; + NamedObject _object11, _object12, _object13; + SceneObject _object14, _object15; + Item4 _item4; + Action2 _action2; + int _field1CD0, _field1CD2; + + Scene551(); + virtual void synchronize(Serializer &s); + void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene560: public SceneExt { + /* Objects */ + class DeskChair: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Box: public NamedObjectExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class SafeInset: public FocusObject { + /* Items */ + class Item: public NamedHotspotExt { + public: + virtual bool startAction(CursorType action, Event &event); + }; + public: + NamedObject _digit0, _digit1, _digit2; + Item _item1, _item2, _item3, _item4, _item5, _item6; + Visage _cursorVisage; + + virtual Common::String getClassName() { return "Scene560_SafeInset"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); + virtual void process(Event &event); + }; + class Nickel: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class BoxInset: public FocusObject { + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + public: + Item1 _item1; + + virtual Common::String getClassName() { return "Scene560_BoxInset"; } + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + }; + + /* Item groups */ + class PicturePart: public NamedHotspotExt { + public: + virtual Common::String getClassName() { return "Scene560_PicturePart"; } + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Computer: 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(); + }; +public: + Action1 _action1; + Action2 _action2; + Action3 _action3; + SpeakerGameText _gameTextSpeaker; + DeskChair _deskChair; + Box _box; + SafeInset _safeInset; + Nickel _nickel; + BoxInset _boxInset; + NamedObject _object6; + PicturePart _picture1, _picture2, _picture3, _picture4; + Computer _computer; + NamedHotspot _chair, _lamp, _item4, _trophy, _watercolours, _fileCabinets; + NamedHotspot _certificate, _bookcase, _desk, _carpet, _item12, _office; + ASound _sound1; + int _field380, _field11EA; + Common::Point _destPosition; + + Scene560(); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + +class Scene570: public SceneExt { + /* Custom classes */ + class PasswordEntry: public EventHandler { + private: + void checkPassword(); + public: + SceneText _passwordText, _entryText; + Common::String _passwordStr, _entryBuffer; + + PasswordEntry(); + virtual Common::String getClassName() { return "Scene570_PasswordEntry"; } + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void process(Event &event); + }; + class Icon: public NamedObject { + public: + SceneText _sceneText; + int _iconId, _folderId, _parentFolderId, _mode; + Common::String _text; + + Icon(); + virtual Common::String getClassName() { return "Scene570_Custom2"; } + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual bool startAction(CursorType action, Event &event); + + void setDetails(int iconId, int folderId, int parentFolderId, int unused, const Common::String &msg); + }; + class IconManager: public EventHandler { + public: + NamedObject _object1; + SynchronizedList<Icon *> _list; + int _mode, _selectedFolder, _fieldAA, _fieldAC; + + IconManager(); + virtual void remove(); + + void setup(int mode); + void hideList(); + void refreshList(); + void addItem(Icon *item); + }; + + /* Objects */ + class PowerSwitch: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class PrinterIcon: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object3: public FocusObject { + public: + virtual void remove(); + }; + + /* Items */ + class FloppyDrive: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + PasswordEntry _passwordEntry; + PowerSwitch _powerSwitch; + PrinterIcon _printerIcon; + Object3 _object3; + NamedObjectExt _object4; + Icon _folder1, _folder2, _folder3, _folder4; + Icon _icon1, _icon2, _icon3, _icon4, _icon5; + Icon _icon6, _icon7, _icon8, _icon9; + IconManager _iconManager; + FloppyDrive _floppyDrive; + NamedHotspot _monitor, _item3, _case, _keyboard, _desk; + NamedHotspot _item7, _printer, _window, _plant, _item11; + ASound _sound1; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene580: public SceneExt { + /* Objects */ + class Vechile: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + Vechile _vechile; + Door _door; + Lyle _lyle; + NamedHotspot _item1; + SpeakerGameText _gameTextSpeaker; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +class Scene590: public PalettedScene { + /* Objects */ + class Laura: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Skip: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Items */ + class Exit: 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(); + }; +public: + SequenceManager _sequenceManager; + Laura _laura; + Skip _skip; + SceneObject _object3; + Exit _exit; + NamedHotspot _item2, _item3, _item4, _item5, _item6, _item7; + NamedHotspot _item8, _item9, _item10, _item11, _item12; + SpeakerSkip _skipSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLaura _lauraSpeaker; + ASoundExt _sound1; + Action1 _action1; + Action2 _action2; + int _field17DC, _field17DE, _stripNumber, _field17E2; + + Scene590(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes6.cpp b/engines/tsage/blue_force/blueforce_scenes6.cpp new file mode 100644 index 0000000000..0d6587daa9 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes6.cpp @@ -0,0 +1,507 @@ +/* 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/blue_force/blueforce_scenes6.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 600 - Crash cut-scene + * + *--------------------------------------------------------------------------*/ + +void Scene600::Action1::signal() { + Scene600 *scene = (Scene600 *)BF_GLOBALS._sceneManager._scene; + static const uint32 black = 0; + + switch (_actionIndex++) { + case 0: + setDelay(2); + break; + case 1: + BF_GLOBALS._sound1.play(57); + setDelay(120); + break; + case 2: + scene->_sound1.play(59); + setAction(&scene->_sequenceManager, this, 600, &scene->_object2, &scene->_object1, + &BF_GLOBALS._player, &scene->_object3, NULL); + break; + case 3: + BF_GLOBALS._sound1.play(61); + setDelay(180); + break; + case 4: + setDelay(180); + break; + case 5: { + BF_GLOBALS._player.remove(); + scene->_object1.remove(); + scene->_object2.remove(); + scene->_object3.remove(); + + for (int percent = 100; percent >= 0; percent -= 5) { + BF_GLOBALS._scenePalette.fade((byte *)&black, false, percent); + g_system->delayMillis(10); + } + + SynchronizedList<SceneObject *>::iterator i; + for (i = BF_GLOBALS._sceneObjects->begin(); i != BF_GLOBALS._sceneObjects->end(); ++i) { + SceneObject *pObj = *i; + pObj->addMover(NULL); + pObj->setObjectWrapper(NULL); + pObj->animate(ANIM_MODE_NONE, NULL); + } + + BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); + BF_GLOBALS._v51C44 = 1; + scene->loadScene(999); + setDelay(5); + break; + } + case 6: + setDelay(5); + break; + case 7: + BF_GLOBALS._v51C44 = 0; + remove(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene600::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(600); + setZoomPercents(0, 100, 200, 100); + _sceneBounds.moveTo(320, 0); + + _sound1.play(58); + _sound1.holdAt(1); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.hide(); + BF_GLOBALS._player.setPosition(Common::Point(639, 0)); + BF_GLOBALS._player.disableControl(); + + _object3.postInit(); + _object3.hide(); + _object2.postInit(); + + _object1.postInit(); + _object1.setVisage(600); + _object1.setStrip(7); + _object1.setPosition(Common::Point(417, 82)); + + BF_GLOBALS.clearFlag(onDuty); + BF_INVENTORY.setObjectScene(INV_TICKET_BOOK, 60); + BF_INVENTORY.setObjectScene(INV_MIRANDA_CARD, 60); + _sceneMode = 600; + + setAction(&_action1, this); +} + +void Scene600::signal() { + BF_GLOBALS._sceneManager.changeScene(620); +} + +/*-------------------------------------------------------------------------- + * Scene 620 - Hospital cut-scene + * + *--------------------------------------------------------------------------*/ + +void Scene620::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(999); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setVisage(621); + BF_GLOBALS._player.setPosition(Common::Point(47, 96)); + + static const uint32 black = 0; + add2Faders((const byte *)&black, 2, 621, this); +} + +void Scene620::signal() { + static const uint32 black = 0; + + switch (_sceneMode++) { + case 0: + case 3: + case 9: + case 12: + _timer1.set(60, this); + break; + case 1: + case 4: + case 7: + case 10: + case 13: + case 16: + case 19: + addFader((const byte *)&black, 2, this); + break; + case 2: + BF_GLOBALS._player.remove(); + _object1.postInit(); + _object1.setVisage(622); + _object1.setPosition(Common::Point(101, 41)); + addFader((const byte *)&black, 2, this); + break; + case 5: + _object1.remove(); + + _object2.postInit(); + _object2.setVisage(623); + _object2.setPosition(Common::Point(216, 4)); + add2Faders((const byte *)&black, 2, 623, this); + break; + case 6: + _object2.animate(ANIM_MODE_5, this); + break; + case 8: + _object2.remove(); + + _object3.postInit(); + _object3.setVisage(624); + _object3.setFrame(1); + _object3.setPosition(Common::Point(28, 88)); + add2Faders((const byte *)&black, 2, 624, this); + break; + case 11: + _object3.remove(); + + _object4.postInit(); + _object4.setVisage(625); + _object4.setPosition(Common::Point(168, 8)); + add2Faders((const byte *)&black, 2, 625, this); + break; + case 14: + _object4.remove(); + + _object5.postInit(); + _object5.setVisage(626); + _object5.setPosition(Common::Point(249, 183)); + add2Faders((const byte *)&black, 2, 626, this); + break; + case 15: + _object5.animate(ANIM_MODE_5, this); + break; + case 17: + _object5.remove(); + + _object6.postInit(); + _object6.setVisage(627); + _object6.setPosition(Common::Point(65, 24)); + add2Faders((const byte *)&black, 2, 627, this); + break; + case 18: + _object6.animate(ANIM_MODE_5, this); + break; + case 20: + _object6.remove(); + BF_GLOBALS._bookmark = bArrestedDrunk; + BF_GLOBALS._v4CEB6 = 0; + BF_GLOBALS._dayNumber = 3; + BF_GLOBALS._sceneManager.changeScene(271); + break; + } +} + +/*-------------------------------------------------------------------------- + * Scene 666 - Death Scene + * + *--------------------------------------------------------------------------*/ + +void Scene666::Action1::signal() { + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.hide(); + setDelay(6); + break; + case 1: + BF_GLOBALS._game->restartGame(); + break; + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene666::Item1::startAction(CursorType action, Event &event) { + return true; +} + +/*--------------------------------------------------------------------------*/ + +void Scene666::postInit(SceneObjectList *OwnerList) { + BF_GLOBALS._sound1.play(27); + SceneExt::postInit(); + BF_GLOBALS._interfaceY = 200; + loadScene(999); + BF_GLOBALS._screenSurface.fillRect(BF_GLOBALS._screenSurface.getBounds(), 0); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS._deathReason = BF_GLOBALS._randomSource.getRandomNumber(23); + } + + BF_GLOBALS._scenePalette.loadPalette(BF_GLOBALS._sceneManager._previousScene); + BF_GLOBALS._uiElements._active = false; + + _item1.setDetails(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), 666, -1, -1, -1, 1, NULL); + BF_GLOBALS._player.postInit(); + BF_GLOBALS._events.setCursor(CURSOR_WALK); + + if (BF_GLOBALS._sceneManager._previousScene == 271) { + setAction(&_action1); + } else { + switch (BF_GLOBALS._deathReason) { + case 4: + case 18: + case 19: + case 20: + BF_GLOBALS._scenePalette.loadPalette(668); + BF_GLOBALS._player.setVisage(668); + BF_GLOBALS._player.setStrip2(1); + BF_GLOBALS._player.setPosition(Common::Point(77, 155)); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 5: + BF_GLOBALS._scenePalette.loadPalette(900); + BF_GLOBALS._scenePalette.refresh(); + BF_GLOBALS._player.setVisage(666); + BF_GLOBALS._player.setPosition(Common::Point(60, 160)); + signal(); + break; + case 7: + case 11: + case 12: + case 22: + BF_GLOBALS._scenePalette.loadPalette(667); + BF_GLOBALS._scenePalette.refresh(); + + _object1.postInit(); + _object2.postInit(); + _object3.postInit(); + setAction(&_sequenceManager, this, 6660, &BF_GLOBALS._player, &_object1, &_object2, + &_object3, NULL); + break; + case 13: + case 14: + BF_GLOBALS._scenePalette.loadPalette(665); + BF_GLOBALS._scenePalette.refresh(); + BF_GLOBALS._player.setVisage(665); + BF_GLOBALS._player.setPosition(Common::Point(80, 140)); + signal(); + break; + case 24: + BF_GLOBALS._player.setVisage(664); + BF_GLOBALS._player.setPosition(Common::Point(70, 160)); + signal(); + break; + default: + BF_GLOBALS._scenePalette.loadPalette(669); + BF_GLOBALS._scenePalette.refresh(); + BF_GLOBALS._player.setVisage(669); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setPosition(Common::Point(27, 27)); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + } + } +} + +void Scene666::remove() { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + SceneExt::remove(); + BF_GLOBALS._uiElements._active = true; +} + +void Scene666::signal() { + BF_GLOBALS._player.enableControl(); + Rect textRect, sceneBounds; + + _text._color1 = 19; + _text._color2 = 9; + _text._color3 = 13; + _text._fontNumber = 4; + _text._width = 150; + + Common::String msg = g_resourceManager->getMessage(666, BF_GLOBALS._deathReason); + sceneBounds = BF_GLOBALS._sceneManager._scene->_sceneBounds; + sceneBounds.collapse(4, 2); + BF_GLOBALS.gfxManager()._font.getStringBounds(msg.c_str(), textRect, _text._width); + textRect.moveTo(160, 10); + textRect.contain(sceneBounds); + + _text.setup(msg); + _text.setPosition(Common::Point(textRect.left, textRect.top)); + _text.setPriority(255); + _text.show(); +} + +/*-------------------------------------------------------------------------- + * Scene 690 - Decking + * + *--------------------------------------------------------------------------*/ + +bool Scene690::Object1::startAction(CursorType action, Event &event) { + Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_USE) && (scene->_object2._strip == 1)) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(1); + BF_GLOBALS._walkRegions.proc2(6); + scene->_sceneMode = 6901; + scene->setAction(&scene->_sequenceManager, scene, 6901, &BF_GLOBALS._player, + &scene->_object2, &scene->_object1, &scene->_object4, &scene->_object5, NULL); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene690::Object2::startAction(CursorType action, Event &event) { + Scene690 *scene = (Scene690 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (scene->_object2._strip == 3) { + scene->_object6.postInit(); + scene->_object6.hide(); + scene->_object6.fixPriority(1); + scene->_object6.setDetails(690, 21, 17, 23, 1, NULL); + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 6902; + scene->setAction(&scene->_sequenceManager, scene, 6902, &BF_GLOBALS._player, + &scene->_object2, &scene->_object6, NULL); + return true; + } + break; + case CURSOR_TALK: + scene->_stripManager.start(6900, &BF_GLOBALS._stripProxy); + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +void Scene690::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(690); + setZoomPercents(125, 80, 140, 100); + BF_GLOBALS._sound1.fadeSound(48); + + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + + _stripManager.addSpeaker(&_jakeSpeaker); + + _object1.postInit(); + _object1.setVisage(690); + _object1.setStrip2(2); + _object1.fixPriority(188); + _object1.setPosition(Common::Point(50, 166)); + _object1.setDetails(690, 4, 17, 26, 1, NULL); + + _object3.postInit(); + _object3.setVisage(690); + _object3.fixPriority(100); + _object3.setPosition(Common::Point(238, 125)); + _object3.setDetails(690, 7, 17, 28, 1, NULL); + + _object2.postInit(); + _object2.setVisage(694); + _object2.setStrip2(3); + _object2.fixPriority(125); + _object2.setPosition(Common::Point(100, 134)); + _object2.setDetails(690, 12, -1, 11, 1, NULL); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player._moveDiff.x = 8; + + _object4.postInit(); + _object4.setDetails(690, 13, -1, -1, 1, NULL); + + _object5.postInit(); + _object5.setDetails(690, 14, -1, -1, 1, NULL); + + _sceneMode = 6903; + setAction(&_sequenceManager, this, 6903, &BF_GLOBALS._player, &_object3, &_object4, &_object5, NULL); + + _item1.setDetails(Rect(45, 28, 74, 48), 690, 0, 15, 20, 1, NULL); + _item2.setDetails(Rect(0, 0, 129, 78), 690, 1, 15, 20, 1, NULL); + _item9.setDetails(Rect(4, 26, 35, 143), 690, 29, 17, 22, 1, NULL); + _item10.setDetails(Rect(87, 29, 109, 112), 690, 29, 17, 22, 1, NULL); + _item11.setDetails(Rect(135, 30, 160, 120), 690, 29, 17, 22, 1, NULL); + _item3.setDetails(Rect(37, 89, 84, 117), 690, 2, 16, 21, 1, NULL); + _item4.setDetails(Rect(123, 98, 201, 131), 690, 5, -1, -1, 1, NULL); + _item7.setDetails(Rect(285, 95, 303, 133), 690, 8, -1, 25, 1, NULL); + _item16.setDetails(Rect(166, 35, 210, 116), 690, 32, -1, -1, 1, NULL); + _item6.setDetails(Rect(255, 44, 289, 130), 690, 7, 17, 24, 1, NULL); + _item8.setDetails(Rect(299, 44, 314, 53), 690, 27, 15, -1, 1, NULL); + _item5.setDetails(Rect(130, 20, 319, 135), 690, 6, 16, 28, 1, NULL); + _item12.setDetails(1, 690, 10, -1, -1, 1); + _item13.setDetails(2, 690, 30, -1, -1, 1); + _item14.setDetails(3, 690, 31, -1, -1, 1); + _item15.setDetails(4, 690, 9, -1, -1, 1); + _item17.setDetails(Rect(143, 0, 182, 14), 690, 33, -1, -1, 1, NULL); +} + +void Scene690::signal() { + switch (_sceneMode) { + case 6901: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(710); + break; + case 6902: + BF_GLOBALS._player.enableControl(); + break; + case 6903: + BF_GLOBALS._walkRegions.proc1(1); + BF_GLOBALS._walkRegions.proc1(6); + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + + +} // End of namespace BlueForce + +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes6.h b/engines/tsage/blue_force/blueforce_scenes6.h new file mode 100644 index 0000000000..7c35b75053 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes6.h @@ -0,0 +1,124 @@ +/* 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_BLUEFORCE_SCENES6_H +#define TSAGE_BLUEFORCE_SCENES6_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene600 : public SceneExt { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; +public: + SequenceManager _sequenceManager; + Action1 _action1; + ASoundExt _sound1; + NamedObject _object1, _object2, _object3; + BackgroundSceneObject _object4, _object5; + BackgroundSceneObject _object6, _object7, _object8; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene620 : public PalettedScene { +public: + SequenceManager _sequenceManager; + Timer _timer1; + NamedObject _object1, _object2, _object3; + NamedObject _object4, _object5, _object6; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; + +class Scene666 : public SceneExt { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + + /* Items */ + class Item1: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + Action1 _action1; + SequenceManager _sequenceManager; + NamedObject _object1, _object2, _object3; + Item1 _item1; + SceneText _text; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void signal(); +}; + + +class Scene690 : public SceneExt { + /* Objects */ + class Object1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; +public: + SequenceManager _sequenceManager; + Object1 _object1; + Object2 _object2; + NamedObject _object3, _object4, _object5, _object6; + NamedHotspot _item1, _item2, _item3, _item4, _item5; + NamedHotspot _item6, _item7, _item8, _item9, _item10; + NamedHotspot _item11, _item12, _item13, _item14, _item15; + NamedHotspot _item16, _item17; + SpeakerJake _jakeSpeaker; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); +}; +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp new file mode 100644 index 0000000000..1d94211871 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes7.cpp @@ -0,0 +1,277 @@ +/* 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/blue_force/blueforce_scenes7.h" +#include "tsage/globals.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 710 - + * + *--------------------------------------------------------------------------*/ +void Scene710::Timer1::signal() { + PaletteRotation *rotation = BF_GLOBALS._scenePalette.addRotation(136, 138, -1); + rotation->setDelay(25); + rotation = BF_GLOBALS._scenePalette.addRotation(146, 148, -1); + rotation->setDelay(30); + rotation = BF_GLOBALS._scenePalette.addRotation(187, 191, -1); + rotation->setDelay(35); + rotation = BF_GLOBALS._scenePalette.addRotation(245, 246, -1); + rotation->setDelay(20); + remove(); +} + +void Scene710::Action1::signal() { + Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + _state = 7104; + if (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1) + _state = 7105; + setDelay(3); + break; + case 1: { + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &scene->_laura._position, scene); + break; + } + case 2: + BF_GLOBALS._player._strip = 2; + scene->_stripManager.start(_state, this); + break; + case 3: + if (_state == 7105) + BF_GLOBALS._player.enableControl(); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 7106; + scene->setAction(&scene->_sequenceManager1, scene, 7106, &BF_GLOBALS._player, &scene->_laura, &scene->_kid, &scene->_dog, NULL); + } + if (_state < 7104) { + _state++; + if ((_state != 7104) && (BF_INVENTORY.getObjectScene(INV_CRATE1) == 1)) + _state = 7105; + } + remove(); + break; + default: + break; + } +} + +// Laura +bool Scene710::Object3::startAction(CursorType action, Event &event) { + Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_TALK) { + BF_GLOBALS._player.setAction(&scene->_action1); + return true; + } else + return NamedObject::startAction(action, event); +} + +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); + return true; + } else + return NamedObject::startAction(action, event); +} + +//Stick +bool Scene710::Object5::startAction(CursorType action, Event &event) { + Scene710 *scene = (Scene710 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (scene->_v1D64 <= 2) + return NamedObject::startAction(action, event); + else { + SceneItem::display(710, 3); + scene->_v1D66 = 1; + return true; + } + case CURSOR_USE: + if ((scene->_kid._position.x < 0) && (scene->_v1D62 == 1)) { + scene->_v1D64++; + if (scene->_v1D66 == 0) { + BF_GLOBALS._player.disableControl(); + scene->_v1D62 = 0; + scene->_sceneMode = 7105; + scene->setAction(&scene->_sequenceManager1, scene, 7105, &BF_GLOBALS._player, &scene->_stick, &scene->_dog, NULL); + } else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 7101; + scene->setAction(&scene->_sequenceManager1, scene, 7101, &BF_GLOBALS._player, &scene->_dog, &scene->_stick, NULL); + } + return true; + } + // No break on purpose + default: + return NamedObject::startAction(action, 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); + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.hide(); + BF_GLOBALS._player._moveDiff = Common::Point(4, 2); + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + _stripManager.addSpeaker(&_jakeSpeaker); + _stripManager.addSpeaker(&_skipSpeaker); + _stripManager.addSpeaker(&_lauraSpeaker); + _stripManager.addSpeaker(&_gameTextSpeaker); + + _kid.postInit(); + _kid._moveDiff = Common::Point(4, 2); + _laura.postInit(); + _laura._moveDiff = Common::Point(4, 2); + _dog.postInit(); + _dog._moveDiff = Common::Point(4, 2); + _stick.postInit(); + _stick.setVisage(710); + _stick.setStrip(2); + _stick.animate(ANIM_MODE_2, NULL); + _stick.setPosition(Common::Point(650, 160)); + _stick._moveDiff.x = 16; + _stick.setDetails(710, 4, -1, -1, 1, NULL); + _laura.setDetails(710, 2, -1, -1, 1, NULL); + _kid.setDetails(710, 6, -1, -1, 1, NULL); + _dog.setDetails(710, 0, -1, -1, 1, NULL); + + _item1.setDetails(Rect(555, 68, 583, 101), 710, 7, 23, -1, 1, NULL); + _item2.setDetails(Rect(583, 46, 611, 78), 710, 7, 23, -1, 1, NULL); + _item3.setDetails(Rect(611, 24, 639, 56), 710, 7, 23, -1, 1, NULL); + _item6.setDetails(1, 710, 9, 1, -1, 1); + _item4.setDetails(2, 710, 8, 14, -1, 1); + _item5.setDetails(3, 710, 10, 16, -1, 1); + _item8.setDetails(Rect(222, 18, 249, 42), 710, 12, 18, -1, 1, NULL); + _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; + _action1._state = 7100; + _timer1.set(2, NULL); + _sceneMode = 7100; + setAction(&_sequenceManager1, this, 7100, &BF_GLOBALS._player, &_laura, &_kid, &_dog, NULL); +} + +void Scene710::signal() { + switch (_sceneMode++) { + case 0: + BF_GLOBALS._player.enableControl(); + break; + case 7100: + BF_GLOBALS._player.enableControl(); + _sceneMode = 7102; + setAction(&_sequenceManager1, this, 7102, &_dog, NULL); + break; + case 7101: + BF_GLOBALS._player.enableControl(); + BF_INVENTORY.setObjectScene(288, 36); + _stick.remove(); + BF_GLOBALS._walkRegions.proc2(2); + break; + case 7102: + _stick.setPosition(Common::Point(100, 122)); + _stick.animate(ANIM_MODE_NONE, NULL); + _stick._strip = 2; + if (_v1D64 <= 2) + _stick._frame = 2; + else { + if (_v1D64 == 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)) + BF_GLOBALS._player.enableControl(); + break; + case 7103: + if (BF_GLOBALS._player._position.x > 179) { + _sceneMode = 7102; + setAction(&_sequenceManager1, this, 7102, &_dog, NULL); + } else { + _sceneMode = 7104; + setAction(&_sequenceManager3, this, 7104, &_kid, NULL); + } + break; + case 7105: + _v1D68 = 1; + // No break on purpose + case 7104: + _sceneMode = 7102; + setAction(&_sequenceManager1, this, 7102, &_dog, NULL); + BF_GLOBALS._walkRegions.proc2(2); + break; + case 7106: + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._sceneManager.changeScene(270); + break; + default: + break; + } +} + +void Scene710::dispatch() { + if ((_kid._position.x > 0) && (_v1D62 == 1) && (_sceneMode != 7106)) { + _v1D62 = 0; + _sceneMode = 7103; + setAction(&_sequenceManager1, this, 7103, &_kid, &_stick, &_dog, NULL); + } + SceneExt::dispatch(); +} + +void Scene710::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_v1D62); + s.syncAsSint16LE(_v1D64); + s.syncAsSint16LE(_v1D66); + s.syncAsSint16LE(_v1D68); +} + + +} // End of namespace BlueForce +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes7.h b/engines/tsage/blue_force/blueforce_scenes7.h new file mode 100644 index 0000000000..9bb43453ef --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes7.h @@ -0,0 +1,103 @@ +/* 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_BLUEFORCE_SCENES7_H +#define TSAGE_BLUEFORCE_SCENES7_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene710: public SceneExt { + // Actions + class Action1: public ActionExt { + public: + void signal(); + }; + // Timers + class Timer1: public Timer { + public: + void signal(); + }; + // Objects + class Object3: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object4: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + +public: + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + SequenceManager _sequenceManager3; + Timer1 _timer1; + SpeakerJake _jakeSpeaker; + SpeakerLaura _lauraSpeaker; + SpeakerSkip _skipSpeaker; + SpeakerGameText _gameTextSpeaker; + Action1 _action1; + NamedObject _object1; + NamedObject _kid; + Object3 _laura; + Object4 _dog; + Object5 _stick; + ASoundExt _soundExt1; + NamedHotspot _item1; + NamedHotspot _item2; + NamedHotspot _item3; + NamedHotspot _item4; + NamedHotspot _item5; + NamedHotspot _item6; + NamedHotspot _item7; + NamedHotspot _item8; + NamedHotspot _item9; + int _v1D62, _v1D64, _v1D66, _v1D68; + + void postInit(SceneObjectList *OwnerList = NULL); + void signal(); + void dispatch(); + void synchronize(Serializer &s); +}; + +} // End of namespace BlueForce +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp new file mode 100644 index 0000000000..49de0be65c --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -0,0 +1,1397 @@ +/* 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/blue_force/blueforce_scenes8.h" +#include "tsage/blue_force/blueforce_dialogs.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 800 - Jamison & Ryan + * + *--------------------------------------------------------------------------*/ + +bool Scene800::Item1::startAction(CursorType action, Event &event) { + if (action == CURSOR_LOOK) { + SceneItem::display2(800, 11); + return true; + } else { + return SceneHotspot::startAction(action, event); + } +} + +bool Scene800::Item2::startAction(CursorType action, Event &event) { + if (action == CURSOR_LOOK) { + SceneItem::display2(800, 1); + return true; + } else { + return SceneHotspot::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene800::Doorway::startAction(CursorType action, Event &event) { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(800, 4); + return true; + case CURSOR_USE: + if (BF_GLOBALS._dayNumber == 5) + SceneItem::display2(800, 14); + else if (BF_GLOBALS._dayNumber < 2) + 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); + else { + if (BF_GLOBALS.getFlag(fWithLyle)) { + ADD_PLAYER_MOVER_NULL(scene->_lyle, 277, 145); + } + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8000; + setAction(&scene->_sequenceManager, scene, 8000, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene800::Car1::startAction(CursorType action, Event &event) { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(800, 2); + return true; + case CURSOR_USE: + SceneItem::display2(800, 3); + return true; + case INV_TICKET_BOOK: + if (BF_GLOBALS.getFlag(ticketVW)) + SceneItem::display2(800, 12); + else if (!BF_GLOBALS.getFlag(onDuty)) + SceneItem::display2(800, 13); + else { + BF_GLOBALS.setFlag(ticketVW); + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._uiElements.addScore(30); + scene->_sceneMode = 8005; + scene->setAction(&scene->_action1); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene800::Motorcycle::startAction(CursorType action, Event &event) { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(800, 0); + return true; + case CURSOR_USE: + if (BF_GLOBALS.getFlag(fWithLyle)) + SceneItem::display2(800, 8); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8002; + setAction(&scene->_sequenceManager, scene, 8002, &BF_GLOBALS._player, this, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene800::Lyle::startAction(CursorType action, Event &event) { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(800, 7); + return true; + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8001; + scene->_stripManager.start(8003, scene); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene800::Car2::startAction(CursorType action, Event &event) { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(800, 9); + return true; + case CURSOR_USE: + if (!BF_GLOBALS.getFlag(fWithLyle)) + SceneItem::display2(800, 10); + else { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8003; + setAction(&scene->_sequenceManager, scene, 8003, &BF_GLOBALS._player, &scene->_lyle, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +void Scene800::Action1::signal() { + Scene800 *scene = (Scene800 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: { + BF_GLOBALS._player.disableControl(); + ADD_PLAYER_MOVER_THIS(BF_GLOBALS._player, 95, 153); + break; + } + case 1: { + ADD_MOVER(BF_GLOBALS._player, 70, 157); + break; + } + case 2: + BF_GLOBALS._player.setVisage(800); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.fixPriority(200); + BF_GLOBALS._player.animate(ANIM_MODE_4, 16, 1, this); + break; + case 3: + scene->_object6.postInit(); + scene->_object6.setVisage(800); + scene->_object6.setStrip(2); + scene->_object6.setFrame(2); + scene->_object6.setPosition(Common::Point(58, 135)); + scene->_object6.fixPriority(170); + BF_GLOBALS._player.animate(ANIM_MODE_5, this); + break; + case 4: + BF_GLOBALS._player.setVisage(352); + BF_GLOBALS._player.setStrip(2); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + ADD_MOVER(BF_GLOBALS._player, 89, 154); + break; + case 5: + BF_GLOBALS._player.enableControl(); + remove(); + break; + } + +} + +/*--------------------------------------------------------------------------*/ + +void Scene800::postInit(SceneObjectList *OwnerList) { + loadScene(800); + SceneExt::postInit(); + setZoomPercents(130, 50, 155, 100); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + 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(319, 144)); + BF_GLOBALS._player._moveDiff = Common::Point(3, 2); + BF_GLOBALS._player.changeZoom(-1); + + _motorcycle.postInit(); + _motorcycle.setVisage(301); + _motorcycle.setPosition(Common::Point(319, 162)); + + if ((BF_GLOBALS._dayNumber >= 2) && (BF_GLOBALS._dayNumber < 5)) { + _car2.postInit(); + _car2.setVisage(444); + _car2.setStrip(3); + _car2.setFrame(2); + _car2.setPosition(Common::Point(237, 161)); + _car2.changeZoom(110); + _car2.fixPriority(158); + BF_GLOBALS._sceneItems.push_back(&_car2); + + BF_GLOBALS._walkRegions.proc1(8); + } + + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark < bEndDayThree)) { + _car2.remove(); + BF_GLOBALS._walkRegions.proc2(8); + } + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setVisage(1359); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setPosition(Common::Point(210, 160)); + _lyle.changeZoom(-1); + BF_GLOBALS._sceneItems.push_back(&_lyle); + + _motorcycle.setVisage(580); + _motorcycle.setStrip(2); + _motorcycle.setFrame(2); + } else if (BF_GLOBALS.getFlag(onDuty)) { + BF_GLOBALS._player.setVisage(352); + } else { + _motorcycle.setVisage(580); + _motorcycle.setStrip(2); + _motorcycle.setFrame(2); + } + BF_GLOBALS._sceneItems.push_back(&_motorcycle); + + _doorway.postInit(); + _doorway.setVisage(800); + _doorway.setStrip(3); + _doorway.setPosition(Common::Point(287, 140)); + BF_GLOBALS._sceneItems.push_back(&_doorway); + + _car1.postInit(); + _car1.setVisage(800); + _car1.setStrip(2); + _car1.setFrame(1); + _car1.setPosition(Common::Point(58, 163)); + BF_GLOBALS._sceneItems.push_back(&_car1); + + if (BF_GLOBALS._sceneManager._previousScene == 810) { + if (BF_GLOBALS.getFlag(fWithLyle)) { + BF_GLOBALS._player.setPosition(Common::Point(271, 148)); + BF_GLOBALS._player.enableControl(); + } else { + BF_GLOBALS._player.changeZoom(75); + BF_GLOBALS._player.setPosition(Common::Point(275, 135)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 8001; + setAction(&_sequenceManager, this, 8001, &BF_GLOBALS._player, &_doorway, NULL); + } + } 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)); + BF_GLOBALS._player.setStrip(3); + + _lyle.setPosition(Common::Point(244, 162)); + _lyle.setStrip(4); + _sceneMode = 8004; + setAction(&_sequenceManager, this, 8001, &_lyle, &_doorway, NULL); + } else { + BF_GLOBALS._player.updateAngle(_motorcycle._position); + BF_GLOBALS._player.enableControl(); + } + + _item2.setBounds(Rect(47, 26, 319, 143)); + BF_GLOBALS._sceneItems.push_back(&_item2); + _item1.setBounds(Rect(0, 0, 320, 165)); + BF_GLOBALS._sceneItems.push_back(&_item1); + + BF_GLOBALS._sound1.fadeSound(33); +} + +void Scene800::signal() { + switch (_sceneMode) { + case 8000: + BF_GLOBALS._sceneManager.changeScene(810); + break; + case 8001: + case 8005: + BF_GLOBALS._player.enableControl(); + break; + case 8002: + case 8003: + BF_GLOBALS._sceneManager.changeScene(60); + break; + case 8004: + BF_GLOBALS.clearFlag(fWithLyle); + _lyle.remove(); + } +} + +void Scene800::dispatch() { + SceneExt::dispatch(); + if (BF_GLOBALS._player.getRegionIndex() == 7) { + BF_GLOBALS._player.updateZoom(); + } else { + BF_GLOBALS._player.changeZoom(-1); + } +} + +/*-------------------------------------------------------------------------- + * Scene 830 - Outside Boat Rentals + * + *--------------------------------------------------------------------------*/ + +bool Scene830::Lyle::startAction(CursorType action, Event &event) { + Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + if (scene->_field18AA) { + scene->_stripManager.start(8304, &BF_GLOBALS._stripProxy); + } else { + scene->_stripManager.start(8303, &BF_GLOBALS._stripProxy); + ++scene->_field18AA; + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene830::Door::startAction(CursorType action, Event &event) { + Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS._dayNumber == 2) { + scene->_sceneMode = 14; + Common::Point pt(186, 102); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + return true; + } + break; + case CURSOR_USE: + if (BF_GLOBALS._dayNumber == 2) { + scene->_sceneMode = 14; + Common::Point pt(186, 102); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, NULL); + } else if (scene->_field18A4) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 832; + + if (BF_GLOBALS.getFlag(onDuty)) { + scene->setAction(&scene->_sequenceManager, scene, 8302, &BF_GLOBALS._player, &scene->_door, NULL); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_sceneMode = 11; + scene->setAction(&scene->_sequenceManager, scene, 8308, &BF_GLOBALS._player, &scene->_door, &scene->_lyle, NULL); + } else { + scene->setAction(&scene->_sequenceManager, scene, 832, &BF_GLOBALS._player, &scene->_door, NULL); + } + } else { + scene->_stripManager.start(8305, &BF_GLOBALS._stripProxy); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 192, 145); + } + return true; + default: + break; + } + + return NamedObject::startAction(action, event); +} + +bool Scene830::Object4::startAction(CursorType action, Event &event) { + Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; + + if (action == INV_RENTAL_KEYS) { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS.getFlag(fWithLyle)) { + scene->_sceneMode = 8300; + 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); + } + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +bool Scene830::Object5::startAction(CursorType action, Event &event) { + Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8307; + scene->setAction(&scene->_sequenceManager, scene, 8307, &BF_GLOBALS._player, &scene->_object5, NULL); + return true; + } else { + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene830::SouthEastExit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x + 80, BF_GLOBALS._player._position.y + 100); + return true; +} + +bool Scene830::NoteBoard::startAction(CursorType action, Event &event) { + Scene830 *scene = (Scene830 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8309; + scene->setAction(&scene->_sequenceManager, scene, 8309, &BF_GLOBALS._player, NULL); + return true; + } + break; + case CURSOR_USE: + if (BF_GLOBALS._sceneObjects->contains(&scene->_object6)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8305; + scene->setAction(&scene->_sequenceManager, scene, 8305, &BF_GLOBALS._player, &scene->_object6, NULL); + return true; + } + break; + default: + break; + } + + return NamedHotspot::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ + +Scene830::Scene830(): PalettedScene() { + _field18A4 = _field18A6 = _field18A8 = _field18AA = _field18AC = 0; +} + +void Scene830::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + s.syncAsByte(_field18A4); + s.syncAsByte(_field18A6); + s.syncAsByte(_field18A8); + s.syncAsByte(_field18AA); + s.syncAsByte(_field18AC); +} + +void Scene830::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(830); + _sound1.fadeSound(35); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + if (BF_GLOBALS._dayNumber == 0) { + BF_GLOBALS._sceneManager._previousScene = 340; + BF_GLOBALS._dayNumber = 1; + BF_GLOBALS.setFlag(fWithLyle); + } + + _field18A8 = (BF_GLOBALS._dayNumber <= 3) ? 0 : 1; + _field18AC = 0; + BF_GLOBALS.clearFlag(fCanDrawGun); + + _seExit.setDetails(Rect(183, 161, 320, 167), 830, -1, -1, -1, 1, NULL); + + PaletteRotation *rot = BF_GLOBALS._scenePalette.addRotation(184, 189, 1); + rot->setDelay(30); + + BF_GLOBALS._player.postInit(); + 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); + } + + _door.postInit(); + _door.setVisage(830); + _door.setDetails(830, 3, 4, -1, 1, NULL); + _door.setStrip((BF_GLOBALS._dayNumber == 2) ? 4 : 3); + _door.setPosition(Common::Point(182, 97)); + + _field18A4 = 1; + _noteBoard.setDetails(1, 830, 30, 31, 32, 1); + + switch (BF_GLOBALS._dayNumber) { + case 1: + if ((BF_GLOBALS._bookmark >= bEndOfWorkDayOne) && (BF_INVENTORY.getObjectScene(INV_CARTER_NOTE) != 1) && + (BF_INVENTORY.getObjectScene(INV_CARTER_NOTE) != 3)) { + _object6.postInit(); + _object6.setVisage(830); + _object6.setStrip(4); + _object6.setFrame(2); + _object6.setPosition(Common::Point(302, 124)); + } + break; + case 4: + if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 830) { + _object5.postInit(); + _object5.setVisage(830); + _object5.setStrip(2); + _object5.setFrame(2); + _object5.setPosition(Common::Point(126, 133)); + _object5.setDetails(830, 7, 8, -1, 1, NULL); + } + break; + case 5: + if ((BF_GLOBALS._sceneManager._previousScene == 840) && (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) && + !BF_GLOBALS.getFlag(fWithLyle)) { + _field18A4 = 0; + + _lyle.postInit(); + _lyle._flags = OBJFLAG_CHECK_REGION; + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setStrip(4); + _lyle.setPosition(Common::Point(180, 154)); + _lyle._moveDiff = Common::Point(2, 0); + _lyle.setDetails(830, 28, -1, 29, 1, NULL); + + _field18AC = 1; + } + break; + } + + _item2.setDetails(7, 830, 9, 10, 11, 1); + _item4.setDetails(2, 830, 12, 13, 14, 1); + _item5.setDetails(3, 830, 15, 16, 17, 1); + _item6.setDetails(4, 830, 18, 19, 20, 1); + _item7.setDetails(5, 830, 21, 22, 23, 1); + _item8.setDetails(6, 830, 24, 25, 26, 1); + + switch (BF_GLOBALS._sceneManager._previousScene) { + case 840: + _sceneMode = 833; + if (BF_GLOBALS.getFlag(onDuty)) { + setAction(&_sequenceManager, this, 8304, &BF_GLOBALS._player, &_door, NULL); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle._moveDiff = Common::Point(2, 0); + _sceneMode = 837; + setAction(&_sequenceManager, this, 837, &_lyle, &_door, &BF_GLOBALS._player, NULL); + } else { + setAction(&_sequenceManager, this, 833, &BF_GLOBALS._player, &_door, NULL); + } + break; + case 850: + BF_GLOBALS._player.setVisage(831); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setStrip(3); + BF_GLOBALS._player._moveDiff = Common::Point(2, 0); + BF_GLOBALS._player.setPosition(Common::Point(220, 122)); + BF_GLOBALS._player.enableControl(); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setStrip(3); + _lyle._moveDiff = Common::Point(2, 0); + _lyle.setPosition(Common::Point(224, 126)); + } + + if ((BF_GLOBALS._bookmark == bEndDayThree) && (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 1)) { + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 0); + BF_INVENTORY.setObjectScene(INV_HOOK, 0); + } + break; + case 340: + case 830: + default: + _sceneMode = 830; + setAction(&_sequenceManager, this, BF_GLOBALS.getFlag(onDuty) ? 8303 : 830, &BF_GLOBALS._player, NULL); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setVisage(835); + _lyle.setObjectWrapper(new SceneObjectWrapper()); + _lyle.animate(ANIM_MODE_1, NULL); + _lyle.setPosition(Common::Point(SCREEN_WIDTH, SCREEN_HEIGHT)); + _lyle._moveDiff = Common::Point(2, 0); + ADD_MOVER(_lyle, 280, 160); + } + break; + } + + _field18A6 = 1; +} + +void Scene830::remove() { + BF_GLOBALS._scenePalette.clearListeners(); + PalettedScene::remove(); +} + +void Scene830::signal() { + static uint32 black = 0; + + switch (_sceneMode) { + case 11: + _sceneMode = 832; + BF_GLOBALS._scenePalette.clearListeners(); + addFader((const byte *)&black, 5, this); + BF_GLOBALS._v51C44 = 0; + break; + case 12: + _sceneMode = 831; + BF_GLOBALS._scenePalette.clearListeners(); + addFader((const byte *)&black, 5, this); + BF_GLOBALS._v51C44 = 0; + break; + case 13: + BF_GLOBALS._sceneManager.changeScene(850); + break; + case 14: + BF_GLOBALS._player.disableControl(); + _sceneMode = 8312; + + _object1.postInit(); + setAction(&_sequenceManager, this, 8312, &_object1, NULL); + break; + case 830: + _field18A6 = 1; + BF_GLOBALS._player.enableControl(); + break; + case 831: + case 8306: + BF_GLOBALS._sceneManager.changeScene((BF_GLOBALS._bookmark < bStartOfGame) || + (BF_GLOBALS._bookmark >= bCalledToDomesticViolence) ? 342 : 340); + break; + case 832: + BF_GLOBALS._sceneManager.changeScene(840); + break; + case 833: + if (_field18AC) { + BF_GLOBALS.setFlag(fWithLyle); + _sceneMode = 8311; + setAction(&_sequenceManager, this, 8311, &BF_GLOBALS._player, &_lyle, NULL); + } else { + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._strip = 3; + BF_GLOBALS._player._frame = 1; + } + break; + case 834: + BF_GLOBALS._sceneManager.changeScene(850); + break; + case 837: + BF_GLOBALS._player.enableControl(); + break; + case 8300: + _sceneMode = 13; + BF_GLOBALS._scenePalette.clearListeners(); + addFader((const byte *)&black, 5, this); + break; + case 8305: + _object6.remove(); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player._strip = 7; + + BF_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); + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); + break; + case 8309: + case 8311: + BF_GLOBALS._player.enableControl(); + break; + case 8312: + _object1.remove(); + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene830::process(Event &event) { + if (BF_GLOBALS._player._enabled && (event.eventType == EVENT_BUTTON_DOWN) && + (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && !_field18A4) { + _stripManager.start(8306, &BF_GLOBALS._stripProxy); + event.handled = true; + } + + if (BF_GLOBALS._player._enabled && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + // Check if the cursor is on an exit + if (_seExit.contains(event.mousePos)) { + 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); + } + } +} + +void Scene830::dispatch() { + SceneExt::dispatch(); + + if (!_action && _field18A6 && (BF_GLOBALS._player._position.y > 160)) { + if (!_field18A4) { + _stripManager.start(8305, &BF_GLOBALS._player); + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 192, 145); + } else if ((BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS._player.disableControl(); + SceneItem::display2(830, 27); + _field18A6 = 0; + _sceneMode = 830; + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x - 10, BF_GLOBALS._player._position.y - 10); + } else { + BF_GLOBALS._player.disableControl(); + _field18A6 = 0; + _sceneMode = 831; + ADD_PLAYER_MOVER(BF_GLOBALS._player._position.x + 40, BF_GLOBALS._player._position.y + 40); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + ADD_MOVER_NULL(_lyle, SCREEN_WIDTH, SCREEN_HEIGHT); + if (_lyle._position.y < 160) + _sceneMode = 12; + } + } + } +} + +/*-------------------------------------------------------------------------- + * Scene 840 - Boat Rentals + * + *--------------------------------------------------------------------------*/ + +void Scene840::Object2::postInit(SceneObjectList *OwnerList) { + FocusObject::postInit(OwnerList); + + if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) != 1) { + _rentalKeys.postInit(); + _rentalKeys.setVisage(840); + _rentalKeys.setStrip(2); + _rentalKeys.setFrame(3); + _rentalKeys.setPosition(Common::Point(120, 132)); + _rentalKeys.fixPriority(255); + _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL); + } + + if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) != 1) { + _waveKeys.postInit(); + _waveKeys.setVisage(840); + _waveKeys.setStrip(2); + _waveKeys.setFrame(2); + _waveKeys.setPosition(Common::Point(201, 91)); + _waveKeys.fixPriority(255); + _waveKeys.setDetails(840, 53, 8, -1, 2, NULL); + } + + _v1B4 = _v1B6 = 0; +} + +void Scene840::Object2::remove() { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + _rentalKeys.remove(); + _waveKeys.remove(); + BF_GLOBALS._player.disableControl(); + + scene->_sceneMode = 8412; + scene->setAction(&scene->_sequenceManager1, scene, 8412, &BF_GLOBALS._player, NULL); +} + +void Scene840::Object2::process(Event &event) { + if (BF_GLOBALS._player._enabled) { + if (_bounds.contains(event.mousePos)) { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + + if ((event.eventType == EVENT_BUTTON_DOWN) && (cursorId == CURSOR_WALK) && (event.btnState == 3)) { + BF_GLOBALS._events.setCursor(CURSOR_USE); + event.handled = true; + } + } else if (event.mousePos.y < 168) { + BF_GLOBALS._events.setCursor(_img); + if (event.eventType == EVENT_BUTTON_DOWN) { + event.handled = true; + remove(); + } + } + } + + FocusObject::process(event); +} + +bool Scene840::Object2::startAction(CursorType action, Event &event) { + switch (action) { + case CURSOR_LOOK: + if ((event.mousePos.y > 43) && (event.mousePos.y < 92)) { + if (event.mousePos.x < 135) { + SceneItem::display2(840, 54); + return true; + } else if (event.mousePos.x < 183) { + SceneItem::display2(840, 57); + return true; + } + } else if ((event.mousePos.y > 91) && (event.mousePos.y < 132)) { + if (event.mousePos.x > 182) { + SceneItem::display2(840, 58); + return true; + } else if (event.mousePos.x > 134) { + SceneItem::display2(840, 57); + return true; + } + } + break; + case INV_WAVE_KEYS: + if ((BF_GLOBALS._dayNumber != 4) || (BF_GLOBALS._bookmark != bEndDayThree)) + SceneItem::display(840, 47); + else { + BF_GLOBALS._uiElements.addScore(50); + + if (BF_INVENTORY.getObjectScene(INV_RENTAL_KEYS) == 1) { + // Replace rental keys + _rentalKeys.postInit(); + _rentalKeys.setVisage(840); + _rentalKeys.setStrip(2); + _rentalKeys.setFrame(3); + _rentalKeys.setPosition(Common::Point(120, 132)); + _rentalKeys.fixPriority(255); + _rentalKeys.setDetails(840, 52, 8, -1, 2, NULL); + } + + if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) { + // Replace wave keys + _waveKeys.postInit(); + _waveKeys.setVisage(840); + _waveKeys.setStrip(2); + _waveKeys.setFrame(2); + _waveKeys.setPosition(Common::Point(201, 91)); + _waveKeys.fixPriority(255); + _waveKeys.setDetails(840, 53, 8, -1, 2, NULL); + } + + BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0); + BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 0); + } + return true; + default: + break; + } + + return FocusObject::startAction(action, event); +} + +bool Scene840::Object2::RentalKeys::startAction(CursorType action, Event &event) { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) { + SceneItem::display2(840, 9); + } else { + SceneItem::display2(840, 55); + BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 1); + BF_GLOBALS._uiElements.addScore(30); + + scene->_object2._v1B4 = 1; + remove(); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene840::Object2::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); + BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 1); + BF_GLOBALS._uiElements.addScore(50); + scene->_object2._v1B6 = 1; + remove(); + } else { + SceneItem::display2(840, 9); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene840::Object6::startAction(CursorType action, Event &event) { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + scene->_object1.postInit(); + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8410; + scene->setAction(&scene->_sequenceManager1, scene, 8410, &scene->_object1, &BF_GLOBALS._player, NULL); + return true; + case CURSOR_USE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8411; + scene->setAction(&scene->_sequenceManager1, scene, 8411, &BF_GLOBALS._player, NULL); + return true; + case INV_WAVE_KEYS: + case INV_RENTAL_KEYS: + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8417; + scene->setAction(&scene->_sequenceManager1, scene, 8417, &BF_GLOBALS._player, NULL); + } else { + SceneItem::display2(840, 47); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene840::Carter::startAction(CursorType action, Event &event) { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_TALK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + + if ((BF_GLOBALS._player._position.x != 219) || (BF_GLOBALS._player._position.y != 129)) { + Common::Point pt(219, 129); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + } else { + scene->signal(); + } + return true; + case INV_RENTAL_COUPON: { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 6; + + Common::Point pt(219, 129); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + return true; + } + case INV_NICKEL: + ++BF_GLOBALS._v4CEB6; + BF_GLOBALS._player.disableControl(); + + if (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1) { + if (!BF_GLOBALS.getFlag(fGotPointsForCombo)) { + BF_GLOBALS._uiElements.addScore(50); + BF_GLOBALS.setFlag(fGotPointsForCombo); + } + } + + scene->_sceneMode = 8407; + scene->setAction(&scene->_sequenceManager1, scene, 8407, &BF_GLOBALS._player, NULL); + return true; + case INV_CARTER_NOTE: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8402; + + if (!BF_GLOBALS._v4CEB6) { + scene->setAction(&scene->_sequenceManager1, scene, 8402, &BF_GLOBALS._player, &scene->_carter, NULL); + } else { + scene->setAction(&scene->_sequenceManager1, scene, 8414, &BF_GLOBALS._player, &scene->_carter, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +/*--------------------------------------------------------------------------*/ + +bool Scene840::Coins::startAction(CursorType action, Event &event) { + Scene840 *scene = (Scene840 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 8404; + scene->setAction(&scene->_sequenceManager1, scene, BF_GLOBALS.getFlag(onDuty) ? 8415 : 8404, + &BF_GLOBALS._player, NULL); + return true; + default: + return NamedHotspot::startAction(action, event); + } +} + +bool Scene840::Exit::startAction(CursorType action, Event &event) { + ADD_PLAYER_MOVER_NULL(BF_GLOBALS._player, 315, 150); + return true; +} + +/*--------------------------------------------------------------------------*/ + +Scene840::Scene840(): PalettedScene() { + _field1ABC = 1; + _field1ABE = 0; + _field1AC0 = 0; + _field1AC2 = 0; + _field1AC4 = 0; + _field1AC6 = (BF_GLOBALS._dayNumber > 3) ? 1 : 0; +} + +void Scene840::synchronize(Serializer &s) { + PalettedScene::synchronize(s); + + s.syncAsSint16LE(_field1ABA); + s.syncAsSint16LE(_field1ABC); + s.syncAsSint16LE(_field1ABE); + s.syncAsSint16LE(_field1AC0); + s.syncAsSint16LE(_field1AC2); + s.syncAsSint16LE(_field1AC4); + s.syncAsSint16LE(_field1AC6); +} + +void Scene840::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(OwnerList); + BF_GLOBALS._sound1.changeSound(41); + loadScene(840); + _field1ABA = 0; + + if (BF_GLOBALS._dayNumber == 0) { + // Debugging mode setup + BF_GLOBALS._dayNumber = 4; + BF_INVENTORY.setObjectScene(INV_NICKEL, 1); + BF_INVENTORY.setObjectScene(INV_RENTAL_COUPON, 1); + } + + setZoomPercents(0, 90, 110, 100); + _exit.setDetails(Rect(310, 133, 320, 167), 840, -1, -1, -1, 1, NULL); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_jakeUniformSpeaker); + _stripManager.addSpeaker(&_carterSpeaker); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player._moveDiff.x = BF_GLOBALS.getFlag(onDuty) ? 8 : 7; + + _doors.postInit(); + _doors.setVisage(840); + _doors.setStrip(3); + _doors.setPosition(Common::Point(157, 81)); + _doors.setDetails(840, 0, 1, 2, 1, NULL); + + _carter.postInit(); + _carter.setVisage(843); + _carter.setStrip(6); + _carter.fixPriority(110); + _carter.setPosition(Common::Point(262, 128)); + _carter.changeZoom(-1); + + _item14.setDetails(1, 840, 29, 30, 31, 1); + _item2.setDetails(Rect(6, 5, 85, 31), 840, 16, 14, 12, 1, NULL); + _item3.setDetails(Rect(91, 7, 102, 26), 840, 17, 14, 12, 1, NULL); + _item4.setDetails(Rect(6, 49, 80, 67), 840, 18, 15, 13, 1, NULL); + _item5.setDetails(Rect(80, 29, 100, 65), 840, 19, 15, 13, 1, NULL); + _item6.setDetails(Rect(104, 32, 127, 78), 840, 20, 15, 13, 1, NULL); + _item7.setDetails(Rect(1, 106, 35, 166), 840, 21, 15, 13, 1, NULL); + _item9.setDetails(Rect(205, 17, 251, 60), 840, 23, 15, 13, 1, NULL); + _item10.setDetails(Rect(199, 56, 236, 80), 840, 24, 14, 12, 1, NULL); + _item11.setDetails(Rect(256, 94, 319, 118), 840, 25, 15, 13, 1, NULL); + _item18.setDetails(6, 840, 38, 39, 40, 1); + _carter.setDetails(840, 3, 4, 5, 1, NULL); + _item8.setDetails(Rect(259, 4, 319, 87), 840, 22, 15, 13, 1, NULL); + _item15.setDetails(2, 840, 32, 33, 34, 1); + _coins.setDetails(3, 840, -1, 6, 7, 1); + _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); + + 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); + _field1AC0 = 1; + } + + _sceneMode = BF_GLOBALS.getFlag(onDuty) ? 8401 : 8400; + setAction(&_sequenceManager1, this, _sceneMode, &BF_GLOBALS._player, NULL); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.postInit(); + _lyle.setAction(&_sequenceManager2, NULL, 8405, &_lyle, NULL); + } +} + +void Scene840::signal() { + switch (_sceneMode) { + case 1: + // Talking to Carter + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + _sceneMode = 3; + + switch (BF_GLOBALS._dayNumber) { + case 1: + if (_field1ABA == 1) { + _stripManager.start(BF_GLOBALS.getFlag(onDuty) ? 8430 : 8406, this); + } else if (!BF_GLOBALS.getFlag(onDuty)) { + _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8400 : 8406, this); + } else if (BF_GLOBALS._bookmark < bStartOfGame) { + _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8429 : 8430, this); + } else if (BF_GLOBALS._bookmark < bCalledToDomesticViolence) { + _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8402 : 8401, this); + } else { + _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8404 : 8403, this); + } + break; + case 2: + _stripManager.start(!BF_GLOBALS._v4CEB6 ? 8405 : 8430, this); + break; + case 3: + if (!BF_GLOBALS._v4CEB6) { + _stripManager.start(BF_GLOBALS.getFlag(fWithLyle) ? 8409 : 8411, this); + } else if (_field1ABA == 1) { + _stripManager.start(8406, this); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this); + } else { + _stripManager.start(8413, this); + } + + BF_GLOBALS.setFlag(fTalkedCarterDay3); + break; + case 4: + if (!BF_GLOBALS._v4CEB6) { + if (BF_GLOBALS.getFlag(fTalkedCarterDay3)) { + if (BF_GLOBALS.getFlag(fWithLyle)) + _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this); + else + _stripManager.start(8413, this); + } else if (BF_GLOBALS.getFlag(fWithLyle)) { + _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8431 : 8409, this); + } else { + _stripManager.start(8411, this); + } + } else if (_field1ABA == 1) { + _stripManager.start(8406, this); + } else if (!BF_GLOBALS.getFlag(fWithLyle)) { + _stripManager.start(8413, this); + } else { + _stripManager.start(BF_GLOBALS.getFlag(fCarterMetLyle) ? 8415 : 8414, this); + } + break; + case 5: + _stripManager.start((_field1ABA == 1) ? 8406 : 8413, this); + break; + default: + break; + } + + _field1ABA = 1; + break; + case 2: + BF_GLOBALS._sceneManager.changeScene(830); + BF_GLOBALS._sound1.changeSound(10); + break; + case 3: + case 8404: + case 8416: + BF_GLOBALS._player.enableControl(); + break; + case 4: + _sceneMode = 8403; + _object6.postInit(); + _object6.setDetails(840, -1, 8, 9, 2, NULL); + setAction(&_sequenceManager1, this, 8403, &_carter, &_object6, NULL); + break; + case 5: + _sceneMode = 8408; + setAction(&_sequenceManager1, this, 8408, &BF_GLOBALS._player, &_carter, &_doors, NULL); + _field1AC2 = 1; + break; + case 6: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + + if ((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) { + _stripManager.start(8440, this); + _sceneMode = 3; + } else if (BF_GLOBALS._sceneObjects->contains(&_object6)) { + _stripManager.start(8442, this); + _sceneMode = 3; + } else if (_field1AC6) { + _sceneMode = 4; + _stripManager.start(BF_GLOBALS.getFlag(fWithLyle) ? 8424 : 8410, this); + } else { + _sceneMode = 3; + _stripManager.start(8436, this); + } + break; + case 8400: + case 8401: + BF_GLOBALS._player._strip = 7; + BF_GLOBALS._player._frame = 1; + BF_GLOBALS._player.enableControl(); + break; + case 8402: + BF_GLOBALS._player.enableControl(); + BF_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); + _sceneMode = 3; + _field1AC0 = 1; + _stripManager.start(8441, this); + break; + case 8407: + if (((BF_GLOBALS._dayNumber == 4) && (BF_GLOBALS._bookmark >= bEndDayThree)) || + (BF_INVENTORY.getObjectScene(INV_WAVE_KEYS) == 1)) { + _sceneMode = 8416; + setAction(&_sequenceManager1, this, 8416, &BF_GLOBALS._player, NULL); + } else { + _stripManager.start(_field1ABE + 8419, this); + _sceneMode = 5; + + if (++_field1ABE == 4) + _field1ABE = 1; + } + break; + case 8408: + if (_field1AC0) { + BF_GLOBALS._player.enableControl(); + } else { + _sceneMode = 8409; + setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); + } + break; + case 8409: + _field1AC2 = 0; + _sceneMode = 3; + _stripManager.start(8423, this); + break; + case 8410: + BF_GLOBALS._player.enableControl(); + _object1.remove(); + 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); + break; + case 8412: + if (_object2._v1B6) { + _sceneMode = 8409; + setAction(&_sequenceManager1, this, 8409, &BF_GLOBALS._player, &_carter, &_doors, NULL); + } else if (!_object2._v1B4) { + BF_GLOBALS._player.enableControl(); + } else { + _sceneMode = 3; + _field1AC0 = 1; + + if (BF_GLOBALS._dayNumber == 5) { + _stripManager.start(8425, this); + } else { + _stripManager.start(BF_GLOBALS.getFlag(INV_NICKEL) ? 8417 : 8416, this); + } + } + break; + case 8413: + BF_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); + BF_INVENTORY.setObjectScene(INV_WAVE_KEYS, 0); + BF_INVENTORY.setObjectScene(INV_RENTAL_KEYS, 0); + BF_GLOBALS._player.enableControl(); + break; + } +} + +void Scene840::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + 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 Scene840::dispatch() { + SceneExt::dispatch(); + + if (_field1ABC && (BF_GLOBALS._player._position.x > 310) && !_action) { + _field1ABC = 0; + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + ADD_PLAYER_MOVER(350, 150); + + if (BF_GLOBALS.getFlag(fWithLyle)) { + _lyle.setAction(&_sequenceManager2, NULL, 8406, &_lyle, 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 new file mode 100644 index 0000000000..84a11805a2 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -0,0 +1,230 @@ +/* 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_BLUEFORCE_SCENES8_H +#define TSAGE_BLUEFORCE_SCENES8_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene800: public SceneExt { + /* Actions */ + class Action1 : public Action { + public: + virtual void signal(); + }; + + /* Items */ + class Item1: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Item2: public SceneHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Doorway: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Car1: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Motorcycle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Car2: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + +public: + Action1 _action1; + SequenceManager _sequenceManager; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + SpeakerGameText _gameTextSpeaker; + Doorway _doorway; + Car1 _car1; + Motorcycle _motorcycle; + Lyle _lyle; + Car2 _car2; + NamedObject _object6; + Item1 _item1; + Item2 _item2; + SceneText _text; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void dispatch(); +}; + +class Scene830: public PalettedScene { + /* Items */ + class SouthEastExit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class NoteBoard: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Lyle: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Door: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object4: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Object5: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + +public: + SequenceManager _sequenceManager; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + NamedObject _object1, _lyle, _object6; + Door _door; + Object4 _object4; + Object5 _object5; + SouthEastExit _seExit; + NoteBoard _noteBoard; + NamedHotspot _item2, _item4, _item5; + NamedHotspot _item6, _item7, _item8; + ASoundExt _sound1; + int _field18A4, _field18A6, _field18A8, _field18AA, _field18AC; + + Scene830(); + 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(); +}; + +class Scene840: public PalettedScene { + /* Items */ + class Coins: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Exit: public NamedHotspot { + public: + virtual bool startAction(CursorType action, Event &event); + }; + + /* Objects */ + class Object2: public FocusObject { + class RentalKeys: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class WaveKeys: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + public: + RentalKeys _rentalKeys; + WaveKeys _waveKeys; + int _v1B4, _v1B6; + + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void remove(); + virtual void process(Event &event); + virtual bool startAction(CursorType action, Event &event); + }; + class Object6: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + class Carter: public NamedObject { + public: + virtual bool startAction(CursorType action, Event &event); + }; + +public: + SequenceManager _sequenceManager1, _sequenceManager2; + NamedObject _object1; + Object2 _object2; + NamedObject _doors; + Object6 _object6; + Carter _carter; + NamedObject _lyle; + Coins _coins; + NamedHotspot _item2, _item3, _item4, _item5, _item6; + NamedHotspot _item7, _item8, _item9, _item10, _item11; + NamedHotspot _item12, _item13, _item14, _item15; + NamedHotspot _item16, _item17, _item18; + Exit _exit; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerJakeUniform _jakeUniformSpeaker; + SpeakerCarter _carterSpeaker; + int _field1ABA, _field1ABC, _field1ABE, _field1AC0; + int _field1AC2, _field1AC4, _field1AC6; + + Scene840(); + virtual void synchronize(Serializer &s); + virtual void postInit(SceneObjectList *OwnerList = NULL); + virtual void signal(); + virtual void process(Event &event); + virtual void dispatch(); +}; + + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_scenes9.cpp b/engines/tsage/blue_force/blueforce_scenes9.cpp new file mode 100644 index 0000000000..a449600b63 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes9.cpp @@ -0,0 +1,1677 @@ +/* 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/blue_force/blueforce_scenes9.h" +#include "tsage/globals.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +/*-------------------------------------------------------------------------- + * Scene 900 - Outside Warehouse + * + *--------------------------------------------------------------------------*/ + +bool Scene900::Item1::startAction(CursorType action, Event &event) { + if (action == CURSOR_LOOK) { + SceneItem::display2(900, 6); + return true; + } else { + return SceneHotspot::startAction(action, event); + } +} + +bool Scene900::Item4::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9001; + Common::Point pt(0, 117); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, scene); + + return true; +} + +/*--------------------------------------------------------------------------*/ +bool Scene900::Object1::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_GLOBALS._v4CEC0 == 0) { + return NamedObject::startAction(action, event); + } else { + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._v4CEC0 == 2) { + scene->_sceneMode = 9006; + BF_GLOBALS._v4CEC0 = 1; + scene->setAction(&scene->_sequenceManager1, scene, 9006, &BF_GLOBALS._player, this, NULL); + } else { + BF_GLOBALS._v4CEC0 = 2; + if (scene->_object3._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); + } + } + return true; + } + break; + case INV_WAREHOUSE_KEYS: + if (BF_GLOBALS._v4CEC0 == 2) { + SceneItem::display2(900, 14); + } else { + if (BF_GLOBALS._v4CEC0 == 0) { + if (!BF_GLOBALS.getFlag(fGotPointsForUnlockGate)) { + BF_GLOBALS.setFlag(fGotPointsForUnlockGate); + BF_GLOBALS._uiElements.addScore(30); + } + BF_GLOBALS._v4CEC0 = 1; + } else { + if (!BF_GLOBALS.getFlag(fGotPointsForLockGate)) { + if (BF_GLOBALS._bookmark == bEndDayThree) { + BF_GLOBALS.setFlag(fGotPointsForLockGate); + BF_GLOBALS._uiElements.addScore(30); + } + } + BF_GLOBALS._v4CEC0 = 0; + } + scene->_sceneMode = 9004; + BF_GLOBALS._player.disableControl(); + scene->setAction(&scene->_sequenceManager1, scene, 9004, &BF_GLOBALS._player, NULL); + } + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene900::Object2::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_USE: + if (BF_GLOBALS._v4CEC0 == 2) { + if (_flag) { + SceneItem::display2(900, 1); + } else { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._walkRegions.proc2(26); + scene->_sceneMode = 9007; + scene->setAction(&scene->_sequenceManager1, scene, 9007, &BF_GLOBALS._player, &scene->_object2, this, NULL); + } + return true; + } else + return NamedObject::startAction(action, event); + break; + case INV_WAREHOUSE_KEYS: + if (BF_GLOBALS._v4CEC0 == 2) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9012; + scene->setAction(&scene->_sequenceManager1, scene, 9012, &BF_GLOBALS._player, &scene->_object2, NULL); + } else + SceneItem::display2(900, 5); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene900::Object3::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + SceneItem::display2(900, 8); + return true; + case CURSOR_USE: + SceneItem::display2(900, 9); + return true; + case INV_HOOK: + if (_flag) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9010; + scene->setAction(&scene->_sequenceManager1, scene, 9010, &BF_GLOBALS._player, &scene->_object5, this, NULL); + } else + SceneItem::display2(900, 23); + return true; + case INV_FISHING_NET: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&scene->_action2); + return true; + case INV_DOG_WHISTLE: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.setAction(&scene->_action3); + return true; + default: + return NamedObject::startAction(action, event); + } +} + +bool Scene900::Object6::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 + 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); + } + } + } + } + return true; + } else + return NamedObject::startAction(action, event); +} + +bool Scene900::Object7::startAction(CursorType action, Event &event) { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + if (action == CURSOR_USE) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 9016; + scene->setAction(&scene->_sequenceManager1, scene, 9016, &BF_GLOBALS._player, NULL); + return true; + } else + return NamedObject::startAction(action, event); +} + +/*--------------------------------------------------------------------------*/ +void Scene900::Action1::signal() { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if (scene->_object3._flag == 0) { + scene->_object3.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); + } else { + _actionIndex = 4; + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_object3.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); + if (BF_GLOBALS._randomSource.getRandomNumber(3) == 1) + scene->_sound1.play(92); + else + scene->_sound1.play(44); + if ((BF_GLOBALS._player._position.x > 750) || (scene->_field1976 != 0)) + _actionIndex = 7; + break; + case 2: + scene->_object3.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); + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 6: + _actionIndex = 0; + // No break on purpose + case 4: + setDelay(30); + break; + case 5: { + scene->_object3.setStrip(4); + Common::Point pt(940, 145); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 7: + _actionIndex = 7; + setDelay(5); + if (BF_GLOBALS._player._position.x < 790) + _actionIndex = 2; + if (scene->_field1976 != 0) + _actionIndex = 8; + break; + case 8: + scene->_object3.setStrip(1); + scene->_object3.setFrame(7); + scene->_object3.animate(ANIM_MODE_6, NULL); + break; + case 9: + scene->_field1976 = 0; + scene->_object3._flag = 0; + _actionIndex = 7; + scene->_object3.setStrip(1); + scene->_object3.setFrame(1); + scene->_object3.animate(ANIM_MODE_5, this); + break; + default: + break; + } +} + +void Scene900::Action2::signal() { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_field1976 = 1; + if (scene->_object3._action->getActionIndex() == 8) + _actionIndex = 0; + setDelay(5); + break; + case 1: + scene->_object5.postInit(); + scene->_object5.setVisage(902); + 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); + 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); + } + SceneItem::display2(900, 10); + scene->_object3._flag = 1; + scene->_object3.fixPriority(130); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene900::Action3::signal() { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + if ((BF_GLOBALS._player._position.x < 790) && (!BF_GLOBALS._player._mover)) { + Common::Point pt(821, 136); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, 0); + } + if (scene->_object3._action->getActionIndex() != 7) { + _actionIndex = 0; + } + setDelay(5); + break; + case 1: + if (scene->_object3._strip == 3) { + _actionIndex = 3; + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + } else + scene->_object3.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); + Common::Point pt(775, 107); + NpcMover *mover = new NpcMover(); + scene->_object3.addMover(mover, &pt, this); + break; + } + case 3: + scene->_object3.remove(); + scene->_object3._flag = 1; + SceneItem::display2(900, 24); + if (!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) { + BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); + BF_GLOBALS._uiElements.addScore(10); + } + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene900::Action4::signal() { + Scene900 *scene = (Scene900 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + scene->_field1976 = 1; + if (scene->_object3._action->getActionIndex() != 8) + _actionIndex = 0; + setDelay(5); + break; + case 1: + scene->setAction(&scene->_sequenceManager1, scene, 9005, &BF_GLOBALS._player, &scene->_object1, NULL); + break; + case 2: + scene->setAction(&scene->_sequenceManager1, scene, 9008, &BF_GLOBALS._player, &scene->_object3, NULL); + break; + case 3: + BF_GLOBALS._deathReason = 5; + BF_GLOBALS._sceneManager.changeScene(666); + remove(); + break; + default: + break; + } +} + +/*--------------------------------------------------------------------------*/ + +Scene900::Scene900(): PalettedScene() { + _field1974 = _field1976 = 0; +} + +void Scene900::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(900); + + if (BF_GLOBALS._sceneManager._previousScene == 910) + BF_GLOBALS._sound1.changeSound(91); + _field1974 = 0; + _field1976 = 0; + BF_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; + 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); + } + if (BF_GLOBALS._sceneManager._previousScene == 910) { + _sceneBounds.moveTo(640, 0); + BF_GLOBALS._v4CEC0 = 2; + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 900); + _object3._flag = 1; + } + if (BF_INVENTORY.getObjectScene(INV_FISHING_NET) == 900) + _object3._flag = 1; + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + _stripManager.addSpeaker(&_lyleHatSpeaker); + + _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); + } else { + _object3.setAction(&_action1); + _object3.fixPriority(130); + if (BF_GLOBALS._dayNumber == 4) { + _object3.setPosition(Common::Point(879, 120)); + _object3.setStrip(2); + } else { + _object3.setPosition(Common::Point(864, 117)); + _object3.setStrip(6); + _object3.setFrame(6); + } + } + + _object1.postInit(); + _object1.setVisage(900); + _object1.setStrip(2); + + if (BF_GLOBALS._v4CEC0 == 2) + _object1.setPosition(Common::Point(758, 127)); + else { + BF_GLOBALS._walkRegions.proc1(24); + _object1.setPosition(Common::Point(804, 132)); + } + + if (BF_GLOBALS._dayNumber == 5) + BF_GLOBALS._v4CEC8 = 0; + + if ((BF_GLOBALS._v4CEC8 == 0) && (BF_GLOBALS.getFlag(fWithLyle))) { + _object4.postInit(); + _object4.setVisage(900); + _object4.setStrip(3); + _object4.fixPriority(1); + _object4.setPosition(Common::Point(866, 117)); + } + + _object2.postInit(); + _object2.setVisage(900); + + if (BF_GLOBALS._v4CEC8 == 0) + _object2.setStrip(4); + else + _object2.setStrip(1); + + _object2.setPosition(Common::Point(847, 45)); + _object2._flag = 1; + + if ((BF_GLOBALS._sceneManager._previousScene == 880) || (BF_GLOBALS._sceneManager._previousScene != 910)) { + BF_GLOBALS._walkRegions.proc1(26); + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._bookmark == bFinishedWGreen) { + _sceneMode = 9013; + _lyle.postInit(); + _lyle._moveDiff.y = 7; + _lyle._flags |= 0x1000; + _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 { + _object2._flag = 0; + _object2.setFrame(_object2.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); + } else + setAction(&_sequenceManager1, this, 9002, &BF_GLOBALS._player, &_object2, NULL); + } + + _object1.setDetails(900, 0, -1, 1, 1, 0); + _object2.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); +} + +void Scene900::signal() { + static uint32 v50E8B = 0; + + switch (_sceneMode++) { + case 1: + BF_GLOBALS._sceneManager.changeScene(910); + break; + case 3: + BF_GLOBALS._walkRegions.proc1(24); + _sceneMode = 9004; + setAction(&_sequenceManager1, this, 9006, &BF_GLOBALS._player, &_object1, 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)) + BF_GLOBALS.setFlag(fLeftTraceIn900); + else + BF_GLOBALS.clearFlag(fLeftTraceIn900); + + BF_GLOBALS._sceneManager.changeScene(880); + break; + case 9002: + BF_GLOBALS._walkRegions.proc1(26); + BF_GLOBALS._player.enableControl(); + break; + case 9004: + if (BF_GLOBALS._v4CEC0 == 0) + SceneItem::display2(900, 3); + else + SceneItem::display2(900, 4); + BF_GLOBALS._player.enableControl(); + break; + case 9005: + if (_object3._flag == 0) + BF_GLOBALS._player.setAction(&_action4); + else + BF_GLOBALS._player.enableControl(); + break; + case 9006: + BF_GLOBALS._walkRegions.proc1(24); + BF_GLOBALS._player.enableControl(); + break; + case 9007: + if (BF_GLOBALS.getFlag(fWithLyle)) { + Common::Point pt(862, 119); + PlayerMover *mover = new PlayerMover(); + _lyle.addMover(mover, &pt, NULL); + _sceneMode = 1; + addFader((const byte *)&v50E8B, 5, this); + } else + BF_GLOBALS._sceneManager.changeScene(910); + break; + case 9008: + BF_GLOBALS._deathReason = 5; + BF_GLOBALS._sceneManager.changeScene(666); + break; + case 9010: + _sound1.play(92); + if (BF_GLOBALS._v4CEC0 == 2) { + _sceneMode = 9008; + setAction(&_sequenceManager1, this, 9008, &BF_GLOBALS._player, &_object3, NULL); + } else { + BF_GLOBALS._player._strip = 7; + _action1.setActionIndex(9); + _object3.signal(); + if ((!BF_GLOBALS.getFlag(fGotPointsForFreeDog)) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS.setFlag(fGotPointsForFreeDog); + BF_GLOBALS._uiElements.addScore(50); + } + BF_INVENTORY.setObjectScene(INV_FISHING_NET, 1); + SceneItem::display2(900, 11); + BF_GLOBALS._player.enableControl(); + } + break; + case 9012: + if (_object2._flag == 0) { + SceneItem::display2(900, 12); + _object2._flag = 1; + if ((!BF_GLOBALS.getFlag(fGotPointsForLockWarehouse)) && (BF_GLOBALS._bookmark == bEndDayThree)) { + BF_GLOBALS.setFlag(fGotPointsForLockWarehouse); + BF_GLOBALS._uiElements.addScore(30); + } + } else { + SceneItem::display2(900, 13); + _object2._flag = 0; + if (!BF_GLOBALS.getFlag(fGotPointsForUnlockWarehouse)) { + BF_GLOBALS.setFlag(fGotPointsForUnlockWarehouse); + BF_GLOBALS._uiElements.addScore(30); + } + } + BF_GLOBALS._player.enableControl(); + break; + case 9013: + _lyleHatSpeaker._xp = 75; + _jakeJacketSpeaker._xp = 210; + _lyle.setAction(&_sequenceManager2, &_lyle, 9015, &_lyle, NULL); + BF_GLOBALS._player.enableControl(); + break; + case 9016: + if ((BF_GLOBALS._clip1Bullets == 0) && (BF_GLOBALS._clip2Bullets == 0)){ + BF_GLOBALS._clip1Bullets = 8; + BF_GLOBALS._clip1Bullets = 8; + SceneItem::display2(900, 25); + } else if (BF_GLOBALS._clip1Bullets == 0) { + BF_GLOBALS._clip1Bullets = 8; + SceneItem::display2(900, 26); + } else if (BF_GLOBALS._clip2Bullets == 0) { + BF_GLOBALS._clip2Bullets = 8; + SceneItem::display2(900, 26); + } else + SceneItem::display2(900, 27); + + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene900::process(Event &event) { + SceneExt::process(event); + + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (_item4.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + BF_GLOBALS._events.setCursor(surface); + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } +} + +void Scene900::dispatch() { + SceneExt::dispatch(); + + if (BF_GLOBALS.getFlag(fWithLyle) && _lyle.isNoMover()) { + _lyle.updateAngle(BF_GLOBALS._player._position); + } + + if (!_action) { + if ((BF_GLOBALS._player._position.x <= 20) && (BF_GLOBALS._player._position.y < 130)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 9001; + setAction(&_sequenceManager1, this, 9001, &BF_GLOBALS._player, NULL); + } + } +} + +void Scene900::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_field1974); + s.syncAsSint16LE(_field1976); +} + +/*-------------------------------------------------------------------------- + * Scene 920 - Inside Warehouse: Secret Room + * + *--------------------------------------------------------------------------*/ +// Crate +bool Scene920::Item1::startAction(CursorType action, Event &event) { + Scene920 *scene = (Scene920 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_LOOK: + if ((BF_GLOBALS.getFlag(fCrateOpen)) && (BF_GLOBALS._player._visage == 921)) { + BF_GLOBALS._player.disableControl(); + scene->_object2.postInit(); + scene->_sceneMode = 9204; + if (!BF_GLOBALS.getFlag(fGotPointsForBoots)) { + BF_GLOBALS._uiElements.addScore(30); + BF_GLOBALS.setFlag(fGotPointsForBoots); + } + scene->setAction(&scene->_sequenceManager1, scene, 9204, &BF_GLOBALS._player, &scene->_object2, NULL); + return true; + } else + return NamedHotspot::startAction(action, event); + break; + case CURSOR_USE: + 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))) { + 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); + BF_GLOBALS.clearFlag(fCrateOpen); + } + } else { + scene->_sceneMode = 9205; + scene->setAction(&scene->_sequenceManager1, scene, 9205, &BF_GLOBALS._player, NULL); + } + } else { + scene->_sceneMode = 9202; + scene->setAction(&scene->_sequenceManager1, scene, 9202, &BF_GLOBALS._player, &scene->_object1, NULL); + BF_GLOBALS.setFlag(fCrateOpen); + } + return true; + break; + default: + return NamedHotspot::startAction(action, event); + break; + } +} + +// North Exit +bool Scene920::Item8::startAction(CursorType action, Event &event) { + Scene920 *scene = (Scene920 *)BF_GLOBALS._sceneManager._scene; + + BF_GLOBALS._player.disableControl(); + if (BF_GLOBALS._player._visage == 921) { + scene->_sceneMode = 10; + scene->setAction(&scene->_sequenceManager1, scene, 9206, &BF_GLOBALS._player, NULL); + // TO BE CHECKED: Original code uses a variable to store the address of scene instance. + // As it's used later a coordinates to create a playermover, I don't understand. + // On the other hand, it's not really important as just after the hero leaves the scene + // so the variable is no longer used. + // scene->_oldCoord = &scene; + _field10 = 1; + } else { + scene->_sceneMode = 9201; + scene->setAction(&scene->_sequenceManager1, scene, 9201, &BF_GLOBALS._player, NULL); + } + return true; +} + +void Scene920::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(920); + + _stripManager.addSpeaker(&_gameTextSpeaker); + _stripManager.addSpeaker(&_jakeJacketSpeaker); + if (BF_GLOBALS._dayNumber == 0) + 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)); + } + + _object1.postInit(); + _object1.setVisage(922); + if (BF_GLOBALS.getFlag(fCrateOpen)) { + _object1.setStrip(3); + _object1.setFrame(5); + } + + _object1.setPosition(Common::Point(158, 107)); + _object1.setPriority(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); + _item7.setDetails(4, 920, 9, 10, 11, 1); + _item5.setDetails(3, 920, 6, 7, 8, 1); + _crate.setDetails(2, 920, 3, 4, 5, 1); + _item3.setDetails(1, 920, 3, 4, 5, 1); + _item2.setDetails(Rect(0, 0, 320, 200), 920, 0, 1, 2, 1, NULL); + + BF_GLOBALS._player.disableControl(); + _sceneMode = 9200; + setAction(&_sequenceManager1, this, 9200, &BF_GLOBALS._player, NULL); +} + +void Scene920::signal() { + switch (_sceneMode) { + case 10: + _sceneMode = 9201; + setAction(&_sequenceManager1, this, 9201, &BF_GLOBALS._player, NULL); + break; + case 9201: + if (BF_GLOBALS.getFlag(fCrateOpen)) + BF_GLOBALS.setFlag(fLeftTraceIn920); + else + BF_GLOBALS.clearFlag(fLeftTraceIn920); + BF_GLOBALS._sceneManager.changeScene(910); + break; + case 9204: + _object2.remove(); + BF_GLOBALS.setFlag(fSawGuns); + BF_GLOBALS._player.enableControl(); + break; + case 9206: { + BF_GLOBALS._player.enableControl(); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &_oldCoord, NULL); + break; + } + case 9207: + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._uiElements.addScore(30); + BF_INVENTORY.setObjectScene(15, 1); + BF_GLOBALS._bookmark = bEndDayThree; + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} +void Scene920::process(Event &event) { + SceneExt::process(event); + if (BF_GLOBALS._player._enabled && !_focusObject && (event.mousePos.y < (BF_INTERFACE_Y - 1))) { + if (_exitN.contains(event.mousePos)) { + GfxSurface surface = _cursorVisage.getFrame(EXITFRAME_N); + BF_GLOBALS._events.setCursor(surface); + } else { + CursorType cursorId = BF_GLOBALS._events.getCursor(); + BF_GLOBALS._events.setCursor(cursorId); + } + } + if ((event.eventType == EVENT_BUTTON_DOWN) && (BF_GLOBALS._events.getCursor() == CURSOR_WALK) && (BF_GLOBALS._player._visage == 921)) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 9206; + setAction(&_sequenceManager1, this, 9206, &BF_GLOBALS._player, NULL); + _oldCoord = event.mousePos; + event.handled = true; + } +} + +void Scene920::dispatch() { + SceneExt::dispatch(); + if ((_action == 0) && (BF_GLOBALS._player._position.y < 75)) { + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._sceneManager.changeScene(910); + } +} + +void Scene920::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_oldCoord.x); + s.syncAsSint16LE(_oldCoord.y); +} + +/*-------------------------------------------------------------------------- + * Scene 930 - Inside the caravan + * + *--------------------------------------------------------------------------*/ +/* Objects */ +bool Scene930::Object1::startAction(CursorType action, Event &event) { +// Small box + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + bool result; + + if ((action == CURSOR_USE) && (!BF_GLOBALS.getFlag(93))) { + scene->setAction(&scene->_action2); + result = true; + } else + result = NamedObject::startAction(action, event); + + return result; +} + +bool Scene930::Object2::startAction(CursorType action, Event &event) { + 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); + remove(); + scene->_box.remove(); + return true; +} + +bool Scene930::Object3::startAction(CursorType action, Event &event) { +// Boots + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + if (action != CURSOR_USE) + return NamedObject::startAction(action, event); + + if (scene->_v141C == 0) + scene->setAction(&scene->_action1); + return true; +} + +bool Scene930::Object4::startAction(CursorType action, Event &event) { +// Boot window + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_LOOK: + if (BF_GLOBALS._bookmark >= bFlashBackTwo) { + _lookLineNum = 94; + return NamedObject::startAction(action, event); + } else { + BF_GLOBALS._player.disableControl(); + NamedObject::startAction(action, event); + BF_GLOBALS._bookmark = bFlashBackTwo; + scene->_sceneMode = 2; + scene->signal(); + return true; + } + break; + case CURSOR_USE: + if (BF_GLOBALS._bookmark >= bFlashBackTwo) { + _lookLineNum = 71; + NamedObject::startAction(action, event); + scene->subF3D6F(); + remove(); + } else + NamedObject::startAction(action, event); + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} + +bool Scene930::Object5::startAction(CursorType action, Event &event) { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + switch (action) { + case CURSOR_WALK: + return true; + case CURSOR_USE: + if (BF_INVENTORY.getObjectScene(55) == 1) + return NamedObject::startAction(action, event); + if (scene->_v141A == 0) { + animate(ANIM_MODE_4, getFrameCount() - 1, 1, NULL); + scene->_v141A = 1; + _lookLineNum = 76; + _useLineNum = 78; + } else { + BF_GLOBALS._uiElements.addScore(50); + BF_INVENTORY.setObjectScene(55, 1); + setFrame2(getFrameCount()); + _lookLineNum = 92; + _useLineNum = -1; + } + return true; + default: + return NamedObject::startAction(action, event); + break; + } +} +/* Items */ +bool Scene930::Item1::startAction(CursorType action, Event &event) { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + if ((action == CURSOR_WALK) || (action == CURSOR_USE)) { + BF_GLOBALS._player.disableControl(); + scene->_sceneMode = 1; + scene->setAction(&scene->_sequenceManager1, scene, 9301, &BF_GLOBALS._player, NULL); + return true; + } else + return NamedHotspot::startAction(action, event); +} + +/* Actions */ +void Scene930::Action1::signal() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + BF_GLOBALS._player.disableControl(); + scene->_v141C = 1; + break; + case 1: { + Common::Point pt(50, 142); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, this); + break; + } + case 2: + BF_GLOBALS._player.changeAngle(270); + setDelay(10); + break; + case 3: + BF_GLOBALS._player.changeZoom(110); + BF_GLOBALS._player.setVisage(931); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_4, 4, 1, this); + break; + case 4: + scene->_boots.setFrame(2); + 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); + } + SceneItem::display(0, 312); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} +void Scene930::Action2::signal() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + setDelay(10); + BF_GLOBALS._player.disableControl(); + break; + case 1: { + Common::Point pt(176, 137); + PlayerMover *mover = new PlayerMover(); + BF_GLOBALS._player.addMover(mover, &pt, this); + break; + } + case 2: + setDelay(10); + break; + 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_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + scene->subF3C07(); + BF_GLOBALS._player.enableControl(); + remove(); + break; + default: + break; + } +} + +void Scene930::Action3::signal() { + Scene930 *scene = (Scene930 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex++) { + case 0: + BF_GLOBALS._player.disableControl(); + BF_GLOBALS._player.animate(ANIM_MODE_4, 4, -1, this); + break; + case 1: + scene->_boots.setFrame(1); + BF_GLOBALS._player.animate(ANIM_MODE_6, this); + break; + case 2: + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player.setStrip(6); + BF_GLOBALS._player.setFrame(1); + scene->_v141C = 0; + remove(); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.enableControl(); + break; + default: + break; + } +} + +void Scene930::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(930); + + BF_GLOBALS._sound1.changeSound(85); + if (BF_GLOBALS._dayNumber == 0) + BF_GLOBALS._dayNumber = 1; + setZoomPercents(83, 75, 140, 100); + _v141A = 0; + _v141C = 0; + if (BF_INVENTORY.getObjectScene(54) != 1) { + _box.postInit(); + _box.setVisage(930); + _box.setStrip(1); + _box.setPosition(Common::Point(223, 21)); + _box.setDetails(930, 66, 67, 68, 1, NULL); + } + _boots.postInit(); + _boots.setVisage(930); + _boots.setStrip(2); + _boots.setPosition(Common::Point(9, 161)); + _boots.fixPriority(120); + _boots.setDetails(930, 62, 63, 64, 1, NULL); + + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(368); + BF_GLOBALS._player.setObjectWrapper(new SceneObjectWrapper()); + BF_GLOBALS._player.animate(ANIM_MODE_1, NULL); + BF_GLOBALS._player.setPosition(Common::Point(170, 92)); + BF_GLOBALS._player.fixPriority(80); + BF_GLOBALS._player.changeZoom(-1); + BF_GLOBALS._player.enableControl(); + + _item1.setDetails( 1, 930, 0, 1, 2, 1); + _item2.setDetails( 2, 930, 4, 5, 6, 1); + _item3.setDetails( 3, 930, 8, 9, 10, 1); + _item4.setDetails( 4, 930, 12, 13, 14, 1); + _item5.setDetails( 5, 930, 16, 17, 18, 1); + _item6.setDetails( 20, 930, 20, 21, 22, 1); + _item7.setDetails( 6, 930, 23, 24, 25, 1); + _item8.setDetails( 7, 930, 26, 27, 28, 1); + _item21.setDetails( 8, 930, 89, 90, 91, 1); + _item9.setDetails( 9, 930, 29, 30, 31, 1); + _item20.setDetails(10, 930, 86, 87, 88, 1); + _item10.setDetails(11, 930, 33, 34, 35, 1); + _item11.setDetails(12, 930, 37, 38, 39, 1); + _item13.setDetails(13, 930, 40, 41, 42, 1); + _item14.setDetails(14, 930, 44, 45, 46, 1); + _item15.setDetails(15, 930, 48, 49, 50, 1); + _item16.setDetails(16, 930, 52, 53, 54, 1); + _item17.setDetails(17, 930, 56, 57, 58, 1); + _item12.setDetails(18, 930, 59, 60, 61, 1); + _item18.setDetails(19, 930, 80, 81, 82, 1); + _item19.setDetails(21, 930, 83, 84, 85, 1); + + if (BF_GLOBALS._sceneManager._previousScene != 935) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager1, this, 9300, &BF_GLOBALS._player, NULL); + } else { + _v141C = 1; + BF_GLOBALS._player.animate(ANIM_MODE_NONE); + BF_GLOBALS._player.setPosition(Common::Point(50, 142)); + BF_GLOBALS._player.setVisage(931); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(9); + BF_GLOBALS._player.fixPriority(-1); + BF_GLOBALS._player.enableControl(); + BF_GLOBALS._player.changeZoom(110); + _boots.setFrame(2); + showBootWindow(); + } + +} + +void Scene930::signal() { + static uint32 v50EC4 = 0; + + switch (_sceneMode++) { + case 1: + BF_GLOBALS._sceneManager.changeScene(550); + break; + case 2: + _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_FONT, 4, SET_BG_COLOR, 1, SET_FG_COLOR, 19, SET_EXT_BGCOLOR, 9, + SET_EXT_FGCOLOR, 13, LIST_END); + signal(); + break; + case 3: + _sceneMode = 4; + addFader((const byte *)&v50EC4, 5, this); + break; + case 4: + BF_GLOBALS._sceneManager.changeScene(935); + break; + default: + BF_GLOBALS._player.enableControl(); + break; + } +} + +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::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::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); + } else { + _object5.setFrame(_object5.getFrameCount()); + _object5.setDetails(930, 76, 77, 78); + } + + _object5.fixPriority(260); + _object5.setPosition(Common::Point(147, 128)); +} + +void Scene930::synchronize(Serializer &s) { + SceneExt::synchronize(s); + s.syncAsSint16LE(_v141A); + s.syncAsSint16LE(_v141C); +} + +/*-------------------------------------------------------------------------- + * Scene 935 - Hidden in the wardrobe + * + *--------------------------------------------------------------------------*/ + +void Scene935::Action1::signal() { + Scene935 *scene = (Scene935 *)BF_GLOBALS._sceneManager._scene; + static uint32 v50ECC = 0, v50EEA = 0, v50EEE = 0, v50F26 = 0, v50F2A = 0, v50F62 = 0, v50F66 = 0, v50F6A = 0; + + switch (_actionIndex++) { + case 0: + scene->addFader((const byte *)&v50ECC, 100, this); + break; + 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); + setDelay(3); + break; + case 2: + scene->addFader((const byte *)&v50EEE, 5, this); + break; + case 3: + scene->_visualSpeaker.removeText(); + scene->_visualSpeaker._textPos.y = scene->_sceneBounds.top + 80; + scene->_visualSpeaker._color1 = 252; + scene->_visualSpeaker._color1 = 251; + scene->_visualSpeaker.setText("Jake! Hide in the closet!"); + setDelay(3); + break; + 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); + setDelay(3); + break; + case 5: + scene->addFader((const byte *)&v50F2A, 5, this); + break; + case 6: + scene->_visualSpeaker.removeText(); + scene->_visualSpeaker._textPos.y = scene->_sceneBounds.top + 150; + scene->_visualSpeaker._color1 = 250; + scene->_visualSpeaker._color1 = 249; + scene->_visualSpeaker.setText("Jake! Hide in the closet!"); + setDelay(3); + break; + 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); + setDelay(3); + break; + case 8: + scene->addFader((const byte *)&v50F66, 5, this); + break; + case 9: + scene->_visualSpeaker.removeText(); + setDelay(3); + break; + case 10: + scene->_sceneMode = 1; + scene->add2Faders((const byte *)&v50F6A, 5, 935, scene); + remove(); + break; + default: + break; + } +} + +void Scene935::postInit(SceneObjectList *OwnerList) { + PalettedScene::postInit(); + loadScene(935); + + BF_GLOBALS._interfaceY = 200; + BF_GLOBALS._player.disableControl(); + _visualSpeaker._textMode = ALIGN_CENTER; + _visualSpeaker._hideObjects = false; + _visualSpeaker._color1 = 254; + _visualSpeaker._color2 = 253; + _visualSpeaker._textPos.y = _sceneBounds.top + 18; + _visualSpeaker._textWidth = 300; + _visualSpeaker._textPos.x = _sceneBounds.left + 10; + setAction(&_action1); + BF_GLOBALS._sound1.fadeSound(67); +} + +void Scene935::remove() { + BF_GLOBALS._sound1.fadeOut2(NULL); + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + PalettedScene::remove(); +} + +void Scene935::signal() { + static uint32 v50EC8 = 0; + + switch (_sceneMode) { + case 1: + _object1.postInit(); + if (BF_GLOBALS._sceneManager._previousScene == 810) { + BF_GLOBALS._player.disableControl(); + _sceneMode = 9352; + setAction(&_sequenceManager, this, 9350, &_object1, NULL); + } else if (BF_GLOBALS._sceneManager._previousScene == 930) { + _object3.postInit(); + _object3.setVisage(938); + _object3.fixPriority(255); + _object3.setPosition(Common::Point(260, -4)); + BF_GLOBALS._player.disableControl(); + _sceneMode = 0; + setAction(&_sequenceManager, this, 9354, &_object1, &_object3, NULL); + } else { + _sceneMode = 9351; + setAction(&_sequenceManager, this, 9350, &_object1, NULL); + } + break; + case 2: + BF_GLOBALS._sound1.play(68); + _sceneMode = 0; + addFader((const byte *)&v50EC8, 5, this); + break; + case 3: + _sceneMode = 2; + _object1.animate(ANIM_MODE_6, NULL); + signal(); + break; + case 9351: + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 9351, &_object1, NULL); + if (BF_GLOBALS._sceneManager._previousScene == 910) + _sceneMode = 9353; + break; + case 9352: + BF_GLOBALS._player.disableControl(); + _sceneMode = 2; + setAction(&_sequenceManager, this, 9352, &_object1, NULL); + break; + case 9353: + _object2.postInit(); + BF_GLOBALS._player.disableControl(); + _sceneMode = 3; + setAction(&_sequenceManager, this, 9353, &_object1, &_object2, NULL); + break; + default: + BF_GLOBALS._sceneManager.changeScene(BF_GLOBALS._sceneManager._previousScene); + break; + } +} + +void Scene935::dispatch() { + SceneExt::dispatch(); +} + +/*-------------------------------------------------------------------------- + * Scene 940 - ? + * + *--------------------------------------------------------------------------*/ + +bool Scene940::Item1::startAction(CursorType action, Event &event) { + return true; +} + +void Scene940::Action1::signal() { + Scene940 *scene = (Scene940 *)BF_GLOBALS._sceneManager._scene; + + switch (_actionIndex) { + case 0: + _actionIndex = 2; + setDelay(60); + break; + case 2: + _actionIndex = 941; + if (BF_GLOBALS.getFlag(fBackupAt340)) + scene->_stripManager.start(9408, this); + else + scene->_stripManager.start(9400, this); + break; + case 5: + setActionIndex(948); + setDelay(90); + scene->_object2.remove(); + scene->_object3.remove(); + scene->_object4.remove(); + scene->_object5.remove(); + scene->_object6.remove(); + scene->_object7.remove(); + scene->_object8.remove(); + scene->_object9.remove(); + scene->_object10.remove(); + break; + case 99: + BF_GLOBALS._sound1.play(117); + BF_GLOBALS._sceneManager.changeScene(100); + remove(); + break; + case 941: + scene->_gameTextSpeaker1._textWidth = 312; + _actionIndex = 944; + setAction(&scene->_sequenceManager1, this, 941, &BF_GLOBALS._player, NULL); + break; + case 942: + _actionIndex = 955; + setAction(&scene->_sequenceManager1, this, 942, &scene->_object2, NULL); + break; + case 943: + _actionIndex = 946; + setAction(&scene->_sequenceManager1, this, 943, &scene->_object3, NULL); + break; + case 944: + scene->_object4.setAction(&scene->_sequenceManager2, NULL, 944, &scene->_object4, &scene->_object5); + _actionIndex = 945; + setDelay(3); + break; + case 945: + scene->_object6.setAction(&scene->_sequenceManager3, NULL, 945, &scene->_object6, &scene->_object10, NULL); + _actionIndex = 943; + setDelay(3); + break; + case 946: + _actionIndex = 942; + setAction(&scene->_sequenceManager1, this, 946, &scene->_object7, &scene->_object8, NULL); + break; + case 947: + _actionIndex = 5; + setAction(&scene->_sequenceManager1, this, 947, &scene->_object1, &scene->_object11, &scene->_object12, &scene->_object13, NULL); + break; + case 948: + scene->_gameTextSpeaker1._textPos.x = scene->_sceneBounds.left + 10; + scene->_object17.postInit(); + scene->_object17.hide(); + scene->_object18.postInit(); + scene->_object18.hide(); + _actionIndex = 960; + setAction(&scene->_sequenceManager1, this, 948, &scene->_object11, &scene->_object12, &scene->_object13, &scene->_object1, &scene->_object14, NULL); + break; + case 949: + _actionIndex = 950; + setAction(&scene->_sequenceManager1, this, 949, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object12, &scene->_object13, &scene->_object15, NULL); + scene->_object11.setAction(&scene->_sequenceManager2, NULL, 952, &scene->_object11, NULL); + break; + case 950: + _actionIndex = 951; + setAction(&scene->_sequenceManager1, this, 950, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object13, &scene->_object16, NULL); + scene->_object12.setAction(&scene->_sequenceManager3, NULL, 953, &scene->_object12, NULL); + break; + case 951: + scene->_object13.setAction(&scene->_sequenceManager4, NULL, 954, &scene->_object13, NULL); + scene->_object11.setAction(&scene->_sequenceManager2, NULL, 952, &scene->_object11, NULL); + scene->_stripManager.start(9407, this); + setActionIndex(99); + break; + case 955: + scene->_object2.remove(); + _actionIndex = 956; + setAction(&scene->_sequenceManager1, this, 955, &BF_GLOBALS._player, NULL); + break; + case 956: + _actionIndex = 947; + setAction(&scene->_sequenceManager1, this, 956, &scene->_object3, NULL); + scene->_object11.postInit(); + scene->_object11.setVisage(943); + scene->_object11.setStrip(1); + scene->_object11.setPosition(Common::Point(-8, 178)); + scene->_object12.postInit(); + scene->_object12.setVisage(942); + scene->_object12.setStrip(1); + scene->_object12.setPosition(Common::Point(-41, 181)); + scene->_object13.postInit(); + scene->_object13.setVisage(944); + scene->_object13.setStrip(2); + scene->_object13.setPosition(Common::Point(-74, 179)); + scene->_object1.postInit(); + scene->_object1.setVisage(948); + scene->_object1.setStrip(2); + scene->_object1.setPosition(Common::Point(-107, 180)); + scene->_object14.postInit(); + scene->_object14.setVisage(949); + scene->_object14.setStrip(1); + scene->_object14.setFrame(3); + scene->_object14.setPosition(Common::Point(234, 75)); + scene->_object15.postInit(); + scene->_object15.setVisage(949); + scene->_object15.setStrip(1); + scene->_object15.setFrame(2); + scene->_object15.setPosition(Common::Point(144, 76)); + scene->_object16.postInit(); + scene->_object16.setVisage(949); + scene->_object16.setStrip(1); + scene->_object16.setFrame(1); + scene->_object16.setPosition(Common::Point(45, 77)); + break; + case 960: + _actionIndex = 949; + setAction(&scene->_sequenceManager1, this, 960, &scene->_object11, &scene->_object17, &scene->_object18, &scene->_object1, &scene->_object14, NULL); + break; + default: + break; + } +} + +void Scene940::postInit(SceneObjectList *OwnerList) { + SceneExt::postInit(); + loadScene(940); + + BF_GLOBALS._sound1.play(115); + BF_GLOBALS._dayNumber = 6; + BF_GLOBALS._interfaceY = 200; + BF_GLOBALS._uiElements._active = false; + + _gameTextSpeaker2._speakerName = "SENTTEXT"; + _gameTextSpeaker2._color1 = 104; + _gameTextSpeaker2._textMode = ALIGN_CENTER; + _stripManager.addSpeaker(&_gameTextSpeaker1); + _stripManager.addSpeaker(&_gameTextSpeaker2); + BF_GLOBALS._player.postInit(); + BF_GLOBALS._player.setVisage(941); + BF_GLOBALS._player.setStrip(1); + BF_GLOBALS._player.setFrame(7); + BF_GLOBALS._player.setPosition(Common::Point(563, 80)); + BF_GLOBALS._player.disableControl(); + _object3.postInit(); + _object3.setVisage(944); + _object3.setStrip(3); + _object3.setFrame(3); + _object3.setPosition(Common::Point(626, 78)); + _object3.fixPriority(0); + _object2.postInit(); + _object2.setVisage(944); + _object2.setStrip(3); + _object2.setFrame(6); + _object2.setPosition(Common::Point(378, 136)); + _object2.setZoom(80); + _object2.fixPriority(0); + _object4.postInit(); + _object4.setVisage(945); + _object4.setStrip(6); + _object4.setPosition(Common::Point(361, 70)); + _object4.setZoom(80); + _object4.fixPriority(0); + _object5.postInit(); + _object5.setVisage(945); + _object5.setStrip(7); + _object5.setPosition(Common::Point(366, 39)); + _object5.setZoom(80); + _object5.fixPriority(3); + _object6.postInit(); + _object6.setVisage(945); + _object6.setStrip(4); + _object6.setPosition(Common::Point(432, 70)); + _object6.setZoom(65); + _object6.fixPriority(0); + _object7.postInit(); + _object7.setVisage(945); + _object7.setStrip(1); + _object7.setPosition(Common::Point(423, 131)); + _object7.setZoom(65); + _object7.fixPriority(0); + _object8.postInit(); + _object8.setVisage(945); + _object8.setStrip(2); + _object8.setPosition(Common::Point(420, 99)); + _object8.setZoom(65); + _object8.fixPriority(3); + _object9.postInit(); + _object9.setVisage(945); + _object9.setStrip(3); + _object9.setPosition(Common::Point(458, 65)); + _object9.setZoom(55); + _object9.fixPriority(0); + _object10.postInit(); + _object10.setVisage(945); + _object10.setStrip(3); + _object10.setFrame(2); + _object10.setPosition(Common::Point(465, 118)); + _object10.setZoom(55); + _object10.fixPriority(0); + _item1.setBounds(Rect(0, 0, 320, 200)); + BF_GLOBALS._sceneItems.push_back(&_item1); + _sceneBounds.moveTo(320, 0); + _gameTextSpeaker1._textPos.x = _sceneBounds.left + 10; + _gameTextSpeaker1._color1 = 16; + _gameTextSpeaker1._textWidth = 265; + setAction(&_action1); +} + +void Scene940::remove() { + // clearScren(); + BF_GLOBALS._scrollFollower = &BF_GLOBALS._player; + SceneExt::remove(); + BF_GLOBALS._uiElements._active = true; +} + +} // End of namespace BlueForce +} // End of namespace TsAGE diff --git a/engines/tsage/blue_force/blueforce_scenes9.h b/engines/tsage/blue_force/blueforce_scenes9.h new file mode 100644 index 0000000000..f4f2c6e779 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_scenes9.h @@ -0,0 +1,318 @@ +/* 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_BLUEFORCE_SCENES9_H +#define TSAGE_BLUEFORCE_SCENES9_H + +#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" +#include "tsage/scenes.h" +#include "tsage/globals.h" +#include "tsage/sound.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class Scene900: public PalettedScene { + /* Items */ + class Item1: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + class Item4: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + /* Objects */ + class Object1: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object2: public NamedObjectExt { + public: + bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObjectExt { + public: + bool startAction(CursorType action, Event &event); + }; + class Object6: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object7: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + + /* Actions */ + class Action1 : public Action { + public: + void signal(); + }; + class Action2 : public Action { + public: + void signal(); + }; + class Action3 : public Action { + public: + void signal(); + }; + class Action4 : public Action { + public: + void signal(); + }; + +public: + SequenceManager _sequenceManager1, _sequenceManager2; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + SpeakerLyleHat _lyleHatSpeaker; + Item1 _item1; + Object1 _object1; + Object2 _object2; + Object3 _object3; + NamedHotspot _item2; + NamedHotspot _item3; + NamedObject _object4; + NamedObject _object5; + Object6 _lyle; + Object7 _object7; + Item4 _item4; + ASoundExt _sound1; + Action1 _action1; + Action2 _action2; + Action3 _action3; + Action4 _action4; + int _field1974; + int _field1976; + + Scene900(); + void postInit(SceneObjectList *OwnerList = NULL); + void signal(); + void process(Event &event); + void dispatch(); + void synchronize(Serializer &s); +}; + +class Scene920: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + class Item8: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + +public: + SequenceManager _sequenceManager1; + SpeakerGameText _gameTextSpeaker; + SpeakerJakeJacket _jakeJacketSpeaker; + + Item1 _crate; + NamedHotspot _item2; + NamedHotspot _item3; + NamedHotspot _item4; + NamedHotspot _item5; + NamedHotspot _item6; + NamedHotspot _item7; + NamedObject _object1; + NamedObject _object2; + NamedObject _object3; + Item8 _exitN; + Common::Point _oldCoord; + + void postInit(SceneObjectList *OwnerList = NULL); + void signal(); + void process(Event &event); + void dispatch(); + void synchronize(Serializer &s); +}; + +class Scene930: public PalettedScene { + /* Objects */ + class Object1: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object2: public FocusObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object3: public NamedObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object4: public FocusObject { + public: + bool startAction(CursorType action, Event &event); + }; + class Object5: public FocusObject { + public: + bool startAction(CursorType action, Event &event); + }; + /* Items */ + class Item1: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + /* Actions */ + class Action1 : public Action { + public: + void signal(); + }; + class Action2 : public Action { + public: + void signal(); + }; + class Action3 : public Action { + public: + void signal(); + }; + + void showBootWindow(); + void subF3C07(); + void subF3D6F(); +public: + SequenceManager _sequenceManager1; + Object1 _box; + Object2 _object2; + Object3 _boots; + Object4 _bootsWindow; + Object5 _object5; + + Item1 _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; + NamedHotspot _item14; + NamedHotspot _item15; + NamedHotspot _item16; + NamedHotspot _item17; + NamedHotspot _item18; + NamedHotspot _item19; + NamedHotspot _item20; + NamedHotspot _item21; + + Action1 _action1; + Action2 _action2; + Action3 _action3; + + SpeakerGameText gameTextSpeaker; + + int _v141A; + int _v141C; + + void postInit(SceneObjectList *OwnerList = NULL); + void signal(); + void dispatch(); + void synchronize(Serializer &s); +}; + +class Scene935: public PalettedScene { + /* Actions */ + class Action1 : public Action { + public: + void signal(); + }; + +public: + SequenceManager _sequenceManager; + NamedObject _object1; + NamedObject _object2; + NamedObject _object3; + Action1 _action1; + VisualSpeaker _visualSpeaker; + + void postInit(SceneObjectList *OwnerList = NULL); + void remove(); + void signal(); + void dispatch(); +}; + +class Scene940: public SceneExt { + /* Items */ + class Item1: public NamedHotspot { + public: + bool startAction(CursorType action, Event &event); + }; + /* Actions */ + class Action1 : public Action { + public: + void signal(); + }; + +public: + SequenceManager _sequenceManager1; + SequenceManager _sequenceManager2; + SequenceManager _sequenceManager3; + SequenceManager _sequenceManager4; + NamedObject _object1; + NamedObject _object2; + NamedObject _object3; + NamedObject _object4; + NamedObject _object5; + NamedObject _object6; + NamedObject _object7; + NamedObject _object8; + NamedObject _object9; + NamedObject _object10; + NamedObject _object11; + NamedObject _object12; + NamedObject _object13; + NamedObject _object14; + NamedObject _object15; + NamedObject _object16; + NamedObject _object17; + NamedObject _object18; + Item1 _item1; + Action1 _action1; + + SpeakerGameText _gameTextSpeaker1; + SpeakerGameText _gameTextSpeaker2; + + void postInit(SceneObjectList *OwnerList = NULL); + void remove(); +}; + +} // End of namespace BlueForce +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_speakers.cpp b/engines/tsage/blue_force/blueforce_speakers.cpp new file mode 100644 index 0000000000..0f506c7122 --- /dev/null +++ b/engines/tsage/blue_force/blueforce_speakers.cpp @@ -0,0 +1,970 @@ +/* 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/blue_force/blueforce_speakers.h" +#include "tsage/scenes.h" +#include "tsage/tsage.h" +#include "tsage/graphics.h" +#include "tsage/staticres.h" + +namespace TsAGE { + +namespace BlueForce { + +VisualSpeaker::VisualSpeaker(): Speaker() { + _textWidth = 312; + _color1 = 19; + _hideObjects = false; + _removeObject1 = false; + _removeObject2 = false; + _xp = 160; + _fontNumber = 4; + _color2 = 82; + _offsetPos = Common::Point(4, 170); + _numFrames = 0; +} + +void VisualSpeaker::remove() { + if (_removeObject2) + _object2.remove(); + if (_removeObject1) + _object1.remove(); + + Speaker::remove(); +} + +void VisualSpeaker::synchronize(Serializer &s) { + Speaker::synchronize(s); + + s.syncAsByte(_removeObject1); + s.syncAsByte(_removeObject2); + s.syncAsSint16LE(_xp); + s.syncAsSint16LE(_numFrames); + s.syncAsSint16LE(_offsetPos.x); + s.syncAsSint16LE(_offsetPos.y); +} + +void VisualSpeaker::proc12(Action *action) { + Speaker::proc12(action); + _textPos = Common::Point(_offsetPos.x + BF_GLOBALS._sceneManager._scene->_sceneBounds.left, + _offsetPos.y + BF_GLOBALS._sceneManager._scene->_sceneBounds.top); + _numFrames = 0; +} + +void VisualSpeaker::setText(const Common::String &msg) { + _objectList.draw(); + BF_GLOBALS._sceneObjects->draw(); + + _sceneText._color1 = _color1; + _sceneText._color2 = _color2; + _sceneText._color3 = _color3; + _sceneText._width = _textWidth; + _sceneText._fontNumber = _fontNumber; + _sceneText._textMode = _textMode; + _sceneText.setup(msg); + + // Get the string bounds + GfxFont f; + f.setFontNumber(_fontNumber); + Rect bounds; + f.getStringBounds(msg.c_str(), bounds, _textWidth); + + // Set the position for the text + switch (_textMode) { + case ALIGN_LEFT: + case ALIGN_JUSTIFIED: + _sceneText.setPosition(_textPos); + break; + case ALIGN_CENTER: + _sceneText.setPosition(Common::Point(_textPos.x + (_textWidth - bounds.width()) / 2, _textPos.y)); + break; + case ALIGN_RIGHT: + _sceneText.setPosition(Common::Point(_textPos.x + _textWidth - bounds.width(), _textPos.y)); + break; + default: + break; + } + + // Ensure the text is in the foreground + _sceneText.fixPriority(256); + + // Count the number of words (by spaces) in the string + const char *s = msg.c_str(); + int spaceCount = 0; + while (*s) { + if (*s++ == ' ') + ++spaceCount; + } + + _numFrames = spaceCount * 3 + 2; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGameText::SpeakerGameText(): VisualSpeaker() { + _speakerName = "GAMETEXT"; + _color1 = 8; + _color2 = 19; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSutter::SpeakerSutter() { + _speakerName = "SUTTER"; + _color1 = 20; + _color2 = 22; + _textMode = ALIGN_CENTER; +} + +void SpeakerSutter::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(329); + _object1.setStrip2(2); + _object1.fixPriority(254); + _object1.changeZoom(100); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(329); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerDoug::SpeakerDoug(): VisualSpeaker() { + _color1 = 32; + _speakerName = "DOUG"; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJakeNoHead::SpeakerJakeNoHead(): VisualSpeaker() { + _color1 = 13; + _speakerName = "JAKE_NO_HEAD"; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerHarrison::SpeakerHarrison(): VisualSpeaker() { + _color1 = 32; + _speakerName = "HARRISON"; +} + +void SpeakerHarrison::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(325); + _object1.setStrip2(7); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.fixPriority(255); + _object2.setVisage(325); + _object2.setStrip2(6); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 277, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJake::SpeakerJake(): VisualSpeaker() { + _color1 = 13; + _color2 = 7; + _speakerName = "JAKE"; +} + +void SpeakerJake::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(1001); + _object1.setStrip2(2); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(1001); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJakeJacket::SpeakerJakeJacket(): VisualSpeaker() { + _color1 = 13; + _color2 = 7; + _speakerName = "JAKEJACKET"; +} + +void SpeakerJakeJacket::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(1001); + _object1.setStrip2(4); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(1001); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJakeUniform::SpeakerJakeUniform(): VisualSpeaker() { + _color1 = 13; + _color2 = 7; + _speakerName = "JAKEUNIFORM"; +} + +void SpeakerJakeUniform::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(1001); + _object1.setStrip2(3); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(1001); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 45, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJailer::SpeakerJailer(): VisualSpeaker() { + _color1 = 13; + _color2 = 7; + _speakerName = "JAILER"; +} + +void SpeakerJailer::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(395); + _object1.setStrip(6); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(395); + _object2.setStrip(5); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGreen::SpeakerGreen(): VisualSpeaker() { + _color1 = 96; + _color2 = 99; + _speakerName = "GREEN"; +} + +void SpeakerGreen::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(373); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerPSutter::SpeakerPSutter(): VisualSpeaker() { + _color1 = 20; + _color2 = 22; + _speakerName = "PSUTTER"; +} + +void SpeakerPSutter::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(335); + _object2.setStrip2(3); + _object2.fixPriority(200); + _object2.setPosition(Common::Point(202, 48)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJakeRadio::SpeakerJakeRadio(): VisualSpeaker() { + _color1 = 13; + _color2 = 7; + _speakerName = "JAKE_RADIO"; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerLyleHat::SpeakerLyleHat(): VisualSpeaker() { + _color1 = 29; + _color2 = 89; + _xp = 75; + _speakerName = "LYLEHAT"; +} + +void SpeakerLyleHat::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(278); + _object1.setStrip2(4); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(278); + _object2.setStrip2(2); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + _xp, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJordan::SpeakerJordan(): VisualSpeaker() { + _color1 = 96; + _color2 = 93; + _speakerName = "JORDAN"; +} + +void SpeakerJordan::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(344); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 78)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSkip::SpeakerSkip(): VisualSpeaker() { + _color1 = 80; + _color2 = 82; + _speakerName = "SKIP"; +} + +void SpeakerSkip::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(345); + _object1.setStrip2(4); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 282, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(345); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 282, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerSkipB::SpeakerSkipB(): VisualSpeaker() { + _color1 = 80; + _color2 = 82; + _speakerName = "SKIPB"; +} + +void SpeakerSkipB::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(347); + _object1.setStrip2(2); + _object1.setFrame2(3); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 37, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(347); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 37, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerCarter::SpeakerCarter(): VisualSpeaker() { + _color1 = 89; + _color2 = 95; + _speakerName = "CARTER"; +} + +void SpeakerCarter::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(844); + _object1.setStrip2(8); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(78, 166)); + + _object2.postInit(); + _object2.setVisage(844); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(78, 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerDriver::SpeakerDriver(): VisualSpeaker() { + _color1 = 43; + _color2 = 70; + _speakerName = "DRIVER"; +} + +void SpeakerDriver::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(416); + _object1.setStrip2(8); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 263, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(416); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 263, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerShooter::SpeakerShooter(): VisualSpeaker() { + _color1 = 43; + _color2 = 70; + _speakerName = "SHOOTER"; +} + +void SpeakerShooter::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(418); + _object1.setStrip2(7); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 268, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(418); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 268, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJim::SpeakerJim(): VisualSpeaker() { + _color1 = 32; + _speakerName = "JIM"; +} + +void SpeakerJim::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(385); + _object1.setStrip(7); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(262, 166)); + + _object2.postInit(); + _object2.setVisage(385); + _object2.setStrip2(6); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(262, 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerDezi::SpeakerDezi(): VisualSpeaker() { + _color1 = 21; + _speakerName = "DEZI"; +} + +void SpeakerDezi::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(385); + _object2.setStrip2(5); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(252, 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerJake385::SpeakerJake385(): VisualSpeaker() { + _color1 = 13; + _speakerName = "JAKE_385"; +} + +void SpeakerJake385::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(1001); + _object1.setStrip2(BF_GLOBALS.getFlag(onDuty) ? 3 : 4); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(42, 166)); + + _object2.postInit(); + _object2.setVisage(1001); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(42, 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerLaura::SpeakerLaura(): VisualSpeaker() { + _color1 = 97; + _color2 = 105; + _speakerName = "LAURA"; +} + +void SpeakerLaura::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(345); + _object2.setStrip2(2); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 38, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerLauraHeld::SpeakerLauraHeld(): VisualSpeaker() { + _color1 = 97; + _color2 = 105; + _speakerName = "LAURAHELD"; +} + +void SpeakerLauraHeld::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(374); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 120, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 120)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerEugene::SpeakerEugene(): VisualSpeaker() { + _color1 = 20; + _color2 = 22; + _speakerName = "EUGENE"; +} + +void SpeakerEugene::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(465); + _object1.setStrip2(3); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(465); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerWeasel::SpeakerWeasel(): VisualSpeaker() { + _color1 = 8; + _color2 = 5; + _speakerName = "WEASEL"; +} + +void SpeakerWeasel::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(464); + _object1.setStrip2(3); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(464); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerBilly::SpeakerBilly(): VisualSpeaker() { + _color1 = 20; + _color2 = 22; + _speakerName = "BILLY"; +} + +void SpeakerBilly::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(463); + _object1.setStrip2(7); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(463); + _object2.setStrip2(6); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 40, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 167)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerDrunk::SpeakerDrunk(): VisualSpeaker() { + _color1 = 21; + _speakerName = "DRUNK"; +} + +void SpeakerDrunk::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(556); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 52, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGiggles::SpeakerGiggles(): VisualSpeaker() { + _color1 = 32; + + _speakerName = "GIGGLES"; +} + +void SpeakerGiggles::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(557); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerFBI::SpeakerFBI(): VisualSpeaker() { + _color1 = 27; + _color2 = 89; + + _speakerName = "FBI"; +} + +void SpeakerFBI::setText(const Common::String &msg) { + _removeObject2 = true; + + _object2.postInit(); + _object2.setVisage(837); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 267, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerNico::SpeakerNico(): VisualSpeaker() { + _color1 = 105; + _color2 = 102; + + _speakerName = "NICO"; +} + +void SpeakerNico::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(905); + _object1.setStrip2(2); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(905); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 262, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerDA::SpeakerDA(): VisualSpeaker() { + _color1 = 82; + _color2 = 80; + + _speakerName = "DA"; +} + +void SpeakerDA::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(915); + _object1.setStrip2(8); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 84, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(915); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 84, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGrandma::SpeakerGrandma(): VisualSpeaker() { + _color1 = 20; + _color2 = 23; + + _speakerName = "GRANDMA"; +} + +void SpeakerGrandma::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(274); + _object1.setStrip2(4); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 43, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(274); + _object2.setStrip2(3); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 43, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerLyle::SpeakerLyle(): VisualSpeaker() { + _color1 = 29; + _color2 = 89; + + _speakerName = "LYLE"; +} + +void SpeakerLyle::setText(const Common::String &msg) { + _removeObject1 = _removeObject2 = true; + + _object1.postInit(); + _object1.setVisage(278); + _object1.setStrip2(3); + _object1.fixPriority(254); + _object1.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 75, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + _object2.postInit(); + _object2.setVisage(278); + _object2.setStrip2(1); + _object2.fixPriority(255); + _object2.setPosition(Common::Point(BF_GLOBALS._sceneManager._scene->_sceneBounds.left + 75, + BF_GLOBALS._sceneManager._scene->_sceneBounds.top + 166)); + + VisualSpeaker::setText(msg); + _object2.fixCountdown(8, _numFrames); +} + +/*--------------------------------------------------------------------------*/ + +SpeakerGranText::SpeakerGranText(): VisualSpeaker() { + _color1 = 20; + _color2 = 23; + + _speakerName = "GRANTEXT"; +} + +/*--------------------------------------------------------------------------*/ + +SpeakerLyleText::SpeakerLyleText(): VisualSpeaker() { + _color1 = 29; + _color2 = 89; + + _speakerName = "LYLETEXT"; +} + +} // 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 new file mode 100644 index 0000000000..932c3c311f --- /dev/null +++ b/engines/tsage/blue_force/blueforce_speakers.h @@ -0,0 +1,344 @@ +/* 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_BLUEFORCE_SPEAKERS_H +#define TSAGE_BLUEFORCE_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/blue_force/blueforce_logic.h" + +namespace TsAGE { + +namespace BlueForce { + +using namespace TsAGE; + +class VisualSpeaker: public Speaker { +public: + NamedObject _object1; + CountdownObject _object2; + bool _removeObject1, _removeObject2; + int _xp; + int _numFrames; + Common::Point _offsetPos; +public: + VisualSpeaker(); + + virtual Common::String getClassName() { return "VisualSpeaker"; } + virtual void synchronize(Serializer &s); + virtual void remove(); + virtual void proc12(Action *action); + virtual void setText(const Common::String &msg); +}; + +class SpeakerGameText: public VisualSpeaker { +public: + SpeakerGameText(); + + virtual Common::String getClassName() { return "SpeakerGameText"; } +}; + +class SpeakerSutter: public VisualSpeaker { +public: + SpeakerSutter(); + + virtual Common::String getClassName() { return "SpeakerSutter"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerDoug: public VisualSpeaker { +public: + SpeakerDoug(); + + virtual Common::String getClassName() { return "SpeakerDoug"; } +}; + +class SpeakerJakeNoHead: public VisualSpeaker { +public: + SpeakerJakeNoHead(); + + virtual Common::String getClassName() { return "SpeakerJakeNoHead"; } +}; + +class SpeakerHarrison: public VisualSpeaker { +public: + SpeakerHarrison(); + + virtual Common::String getClassName() { return "SpeakerHarrison"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJake: public VisualSpeaker { +public: + SpeakerJake(); + + virtual Common::String getClassName() { return "SpeakerJake"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJakeJacket: public VisualSpeaker { +public: + SpeakerJakeJacket(); + + virtual Common::String getClassName() { return "SpeakerJakeJacket"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJakeUniform: public VisualSpeaker { +public: + SpeakerJakeUniform(); + + virtual Common::String getClassName() { return "SpeakerJakeUniform"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJailer: public VisualSpeaker { +public: + SpeakerJailer(); + + virtual Common::String getClassName() { return "SpeakerJailer"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerGreen: public VisualSpeaker { +public: + SpeakerGreen(); + + virtual Common::String getClassName() { return "SpeakerGreen"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerPSutter: public VisualSpeaker { +public: + SpeakerPSutter(); + + virtual Common::String getClassName() { return "SpeakerPSutter"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJakeRadio: public VisualSpeaker { +public: + SpeakerJakeRadio(); + + virtual Common::String getClassName() { return "SpeakerJakeRadio"; } +}; + +class SpeakerLyleHat: public VisualSpeaker { +public: + SpeakerLyleHat(); + + virtual Common::String getClassName() { return "SpeakerLyleHat"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJordan: public VisualSpeaker { +public: + SpeakerJordan(); + + virtual Common::String getClassName() { return "SpeakerJordan"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerSkip: public VisualSpeaker { +public: + SpeakerSkip(); + + virtual Common::String getClassName() { return "SpeakerSkip"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerSkipB: public VisualSpeaker { +public: + SpeakerSkipB(); + + virtual Common::String getClassName() { return "SpeakerSkipB"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerCarter: public VisualSpeaker { +public: + SpeakerCarter(); + + virtual Common::String getClassName() { return "SpeakerCarter"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerDriver: public VisualSpeaker { +public: + SpeakerDriver(); + + virtual Common::String getClassName() { return "SpeakerDriver"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerShooter: public VisualSpeaker { +public: + SpeakerShooter(); + + virtual Common::String getClassName() { return "SpeakerShooter"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJim: public VisualSpeaker { +public: + SpeakerJim(); + + virtual Common::String getClassName() { return "SpeakerJim"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerDezi: public VisualSpeaker { +public: + SpeakerDezi(); + + virtual Common::String getClassName() { return "SpeakerDezi"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerJake385: public VisualSpeaker { +public: + SpeakerJake385(); + + virtual Common::String getClassName() { return "SpeakerJake385"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerLaura: public VisualSpeaker { +public: + SpeakerLaura(); + + virtual Common::String getClassName() { return "SpeakerLaura"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerLauraHeld: public VisualSpeaker { +public: + SpeakerLauraHeld(); + + virtual Common::String getClassName() { return "SpeakerLaura"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerEugene: public VisualSpeaker { +public: + SpeakerEugene(); + + virtual Common::String getClassName() { return "SpeakerEugene"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerWeasel: public VisualSpeaker { +public: + SpeakerWeasel(); + + virtual Common::String getClassName() { return "SpeakerWeasel"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerBilly: public VisualSpeaker { +public: + SpeakerBilly(); + + virtual Common::String getClassName() { return "SpeakerBilly"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerDrunk: public VisualSpeaker { +public: + SpeakerDrunk(); + + virtual Common::String getClassName() { return "SpeakerDrunk"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerGiggles: public VisualSpeaker { +public: + SpeakerGiggles(); + + virtual Common::String getClassName() { return "SpeakerGiggles"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerFBI: public VisualSpeaker { +public: + SpeakerFBI(); + + virtual Common::String getClassName() { return "FBI"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerNico: public VisualSpeaker { +public: + SpeakerNico(); + + virtual Common::String getClassName() { return "NICO"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerDA: public VisualSpeaker { +public: + SpeakerDA(); + + virtual Common::String getClassName() { return "DA"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerGrandma: public VisualSpeaker { +public: + SpeakerGrandma(); + + virtual Common::String getClassName() { return "SpeakerGrandma"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerLyle: public VisualSpeaker { +public: + SpeakerLyle(); + + virtual Common::String getClassName() { return "SpeakerLyle"; } + virtual void setText(const Common::String &msg); +}; + +class SpeakerGranText: public VisualSpeaker { +public: + SpeakerGranText(); + + virtual Common::String getClassName() { return "SpeakerGranText"; } +}; + +class SpeakerLyleText: public VisualSpeaker { +public: + SpeakerLyleText(); + + virtual Common::String getClassName() { return "SpeakerLyleText"; } +}; + +} // End of namespace BlueForce + +} // End of namespace TsAGE + +#endif diff --git a/engines/tsage/blue_force/blueforce_ui.cpp b/engines/tsage/blue_force/blueforce_ui.cpp index e27c744486..fb4008d2c1 100644 --- a/engines/tsage/blue_force/blueforce_ui.cpp +++ b/engines/tsage/blue_force/blueforce_ui.cpp @@ -21,6 +21,7 @@ */ #include "tsage/blue_force/blueforce_ui.h" +#include "tsage/blue_force/blueforce_dialogs.h" #include "tsage/blue_force/blueforce_logic.h" #include "tsage/tsage.h" #include "tsage/core.h" @@ -29,8 +30,15 @@ namespace TsAGE { namespace BlueForce { +void StripProxy::process(Event &event) { + if (_action) + _action->process(event); +} + +/*--------------------------------------------------------------------------*/ + void UIElement::synchronize(Serializer &s) { - AltSceneObject::synchronize(s); + BackgroundSceneObject::synchronize(s); s.syncAsSint16LE(_field88); s.syncAsSint16LE(_enabled); s.syncAsSint16LE(_frameNum); @@ -55,7 +63,7 @@ void UIElement::setEnabled(bool flag) { void UIQuestion::process(Event &event) { if (event.eventType == EVENT_BUTTON_DOWN) { - int currentCursor = GLOBALS._events.getCursor(); + CursorType currentCursor = GLOBALS._events.getCursor(); GLOBALS._events.hideCursor(); showDescription(currentCursor); @@ -63,12 +71,13 @@ void UIQuestion::process(Event &event) { } } -void UIQuestion::showDescription(int lineNum) { - if (lineNum == 8) { - // Unknown object description +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, lineNum); + SceneItem::display2(9001, (int)cursor); } } @@ -79,17 +88,44 @@ void UIQuestion::setEnabled(bool flag) { } } +void UIQuestion::showItem(int resNum, int rlbNum, int frameNum) { + GfxDialog::setPalette(); + + // Get the item to display + GfxSurface objImage = surfaceFromRes(resNum, rlbNum, frameNum); + Rect imgRect; + imgRect.resize(objImage, 0, 0, 100); + 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); + + // Draw the image + BF_GLOBALS.gfxManager().copyFrom(objImage, imgRect); + + // Wait for a press + BF_GLOBALS._events.waitForPress(); + + // Restore the old area + BF_GLOBALS.gfxManager().copyFrom(*savedArea, imgRect); + delete savedArea; +} + /*--------------------------------------------------------------------------*/ void UIScore::postInit(SceneObjectList *OwnerList) { int xp = 266; - _digit3.setup(1, 6, 1, 266, 180, 255); + _digit3.setup(1, 6, 1, xp, 180, 255); + _digit3.reposition(); xp += 7; - _digit2.setup(1, 6, 1, 266, 180, 255); + _digit2.setup(1, 6, 1, xp, 180, 255); + _digit2.reposition(); xp += 7; - _digit1.setup(1, 6, 1, 266, 180, 255); + _digit1.setup(1, 6, 1, xp, 180, 255); + _digit1.reposition(); xp += 7; - _digit0.setup(1, 6, 1, 266, 180, 255); + _digit0.setup(1, 6, 1, xp, 180, 255); + _digit0.reposition(); } void UIScore::draw() { @@ -101,37 +137,46 @@ void UIScore::draw() { void UIScore::updateScore() { int score = BF_GLOBALS._uiElements._scoreValue; - - _digit3.setFrame(score / 1000); score %= 1000; - _digit2.setFrame(score / 100); score %= 100; - _digit1.setFrame(score / 10); score %= 10; - _digit0.setFrame(score); + + _digit3.setFrame(score / 1000 + 1); score %= 1000; + _digit2.setFrame(score / 100 + 1); score %= 100; + _digit1.setFrame(score / 10 + 1); score %= 10; + _digit0.setFrame(score + 1); } /*--------------------------------------------------------------------------*/ UIInventorySlot::UIInventorySlot(): UIElement() { _objIndex = 0; + _object = NULL; } void UIInventorySlot::synchronize(Serializer &s) { UIElement::synchronize(s); s.syncAsSint16LE(_objIndex); + SYNC_POINTER(_object); } void UIInventorySlot::process(Event &event) { if (event.eventType == EVENT_BUTTON_DOWN) { event.handled = true; - if (_objIndex == 66) { - // Handle showing gun and ammo - warning("TODO: show gun"); - } else if (_objIndex != 0) { - GLOBALS._events.setCursor((CursorType)_objIndex); + if (_objIndex == INV_AMMO_BELT) { + // Handle showing ammo belt + showAmmoBelt(); + + } else if (_objIndex != INV_NONE) { + _object->setCursor(); } } } +void UIInventorySlot::showAmmoBelt() { + AmmoBeltDialog *dlg = new AmmoBeltDialog(); + dlg->execute(); + delete dlg; +} + /*--------------------------------------------------------------------------*/ UIInventoryScroll::UIInventoryScroll() { @@ -144,9 +189,30 @@ void UIInventoryScroll::synchronize(Serializer &s) { } void UIInventoryScroll::process(Event &event) { - if (event.eventType == EVENT_BUTTON_DOWN) { - warning("TODO: UIInventoryScroll::process"); + switch (event.eventType) { + case EVENT_BUTTON_DOWN: + // Draw the button as selected + toggle(true); + event.handled = true; + break; + case EVENT_BUTTON_UP: + // Restore unselected version + toggle(false); + + // Scroll the inventory as necessary + BF_GLOBALS._uiElements.scrollInventory(_isLeft); + event.handled = true; + break; + default: + break; + } +} + +void UIInventoryScroll::toggle(bool pressed) { + if (_enabled) { + setFrame(pressed ? (_frameNum + 1) : _frameNum); + BF_GLOBALS._uiElements.draw(); } } @@ -155,7 +221,7 @@ void UIInventoryScroll::process(Event &event) { UICollection::UICollection(): EventHandler() { _clearScreen = false; _visible = false; - _field4E = 0; + _cursorChanged = false; } void UICollection::setup(const Common::Point &pt) { @@ -169,10 +235,16 @@ void UICollection::hide() { _visible = false; } +void UICollection::show() { + _visible = true; + draw(); +} + void UICollection::erase() { if (_clearScreen) { Rect tempRect(0, BF_INTERFACE_Y, SCREEN_WIDTH, SCREEN_HEIGHT); - GLOBALS._screenSurface.fillRect(tempRect, 0); + BF_GLOBALS._screenSurface.fillRect(tempRect, 0); + BF_GLOBALS._sceneManager._scene->_backSurface.fillRect(tempRect, 0); _clearScreen = false; } } @@ -183,30 +255,89 @@ void UICollection::resetClear() { void UICollection::draw() { if (_visible) { - // Draw the elements + // Draw the elements onto the background for (uint idx = 0; idx < _objList.size(); ++idx) _objList[idx]->draw(); - // Update the screen - g_system->updateScreen(); + // 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)); + _clearScreen = 1; } } /*--------------------------------------------------------------------------*/ +UIElements::UIElements(): UICollection() { + _cursorVisage.setVisage(1, 5); + g_saver->addLoadNotifier(&UIElements::loadNotifierProc); +} + +void UIElements::synchronize(Serializer &s) { + UICollection::synchronize(s); + + s.syncAsSint16LE(_slotStart); + s.syncAsSint16LE(_scoreValue); + s.syncAsByte(_active); + + int count = _itemList.size(); + s.syncAsSint16LE(count); + if (s.isLoading()) { + // Load in item list + _itemList.clear(); + + for (int idx = 0; idx < count; ++idx) { + int itemId; + s.syncAsSint16LE(itemId); + _itemList.push_back(itemId); + } + } else { + // Save item list + for (int idx = 0; idx < count; ++idx) { + int itemId = _itemList[idx]; + s.syncAsSint16LE(itemId); + } + } +} + void UIElements::process(Event &event) { - if (_clearScreen && BF_GLOBALS._player._field8E && (BF_GLOBALS._sceneManager._sceneNumber != 50)) { + if (_clearScreen && BF_GLOBALS._player._enabled && (BF_GLOBALS._sceneManager._sceneNumber != 50)) { if (_bounds.contains(event.mousePos)) { + // Cursor inside UI area + if (!_cursorChanged) { + if (BF_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); + } + _cursorChanged = true; + } + + // Pass event to any element that the cursor falls on + for (int idx = (int)_objList.size() - 1; idx >= 0; --idx) { + if (_objList[idx]->_bounds.contains(event.mousePos) && _objList[idx]->_enabled) { + _objList[idx]->process(event); + if (event.handled) + break; + } + } - } else if (_field4E) { - BF_GLOBALS._events.hideCursor(); - BF_GLOBALS._events.setCursor((CursorType)1); - _field4E = 0; + if (event.eventType == EVENT_BUTTON_DOWN) + event.handled = true; + + } else if (_cursorChanged) { + // Cursor outside UI area, so reset as necessary + BF_GLOBALS._events.setCursor(BF_GLOBALS._events.getCursor()); + _cursorChanged = false; SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; - if (scene->_eventHandler) { - error("TODO: UIElements::process _eventHandler"); + if (scene->_focusObject) { + GfxSurface surface = _cursorVisage.getFrame(7); + BF_GLOBALS._events.setCursor(surface); } } } @@ -216,7 +347,7 @@ void UIElements::setup(const Common::Point &pt) { _slotStart = 0; _itemList.clear(); _scoreValue = 0; - _field820 = 1; + _active = true; UICollection::setup(pt); hide(); @@ -224,6 +355,7 @@ void UIElements::setup(const Common::Point &pt) { add(&_object1); // Set up the inventory slots + int xp = 0; for (int idx = 0; idx < 4; ++idx) { UIElement *item = NULL; switch (idx) { @@ -241,14 +373,16 @@ void UIElements::setup(const Common::Point &pt) { break; } - item->setup(9, 1, idx, idx * 63 + 2, 4, 255); + xp = idx * 63 + 2; + item->setup(9, 1, idx, xp, 4, 255); add(item); } // Setup bottom-right hand buttons - int xp = 62; + xp += 62; _question.setup(1, 4, 7, xp, 16, 255); _question.setEnabled(false); + add(&_question); xp += 21; _scrollLeft.setup(1, 4, 1, xp, 16, 255); @@ -271,11 +405,13 @@ void UIElements::setup(const Common::Point &pt) { } void UIElements::add(UIElement *obj) { - // Add object + // Add object assert(_objList.size() < 12); _objList.push_back(obj); - obj->setPosition(Common::Point(_bounds.left + obj->_bounds.left, _bounds.top + obj->_bounds.top)); + obj->setPosition(Common::Point(_bounds.left + obj->_position.x, _bounds.top + obj->_position.y)); + obj->reposition(); + GfxSurface s = obj->getFrame(); s.draw(obj->_position); } @@ -285,10 +421,10 @@ void UIElements::add(UIElement *obj) { */ void UIElements::updateInventory() { _score.updateScore(); - updateInvList(); + updateInvList(); // Enable scroll buttons if the player has more than four items - if (_itemCount > 4) { + if (_itemList.size() > 4) { _scrollLeft.setEnabled(true); _scrollRight.setEnabled(true); } else { @@ -297,28 +433,31 @@ void UIElements::updateInventory() { } // Handle cropping the slots start within inventory - int last = (_itemList.size() - 1) / 4 + 1; + int lastPage = (_itemList.size() - 1) / 4 + 1; if (_slotStart < 0) - _slotStart = last - 1; - else if (_slotStart > (last - 1)) + _slotStart = lastPage - 1; + else if (_slotStart > (lastPage - 1)) _slotStart = 0; // Handle refreshing slot graphics UIInventorySlot *slotList[4] = { &_slot1, &_slot2, &_slot3, &_slot4 }; - + + // Loop through the inventory objects SynchronizedList<InvObject *>::iterator i; int objIndex = 0; - for (i = BLUE_INVENTORY._itemList.begin(); i != BLUE_INVENTORY._itemList.end(); ++i, ++objIndex) { + for (i = BF_INVENTORY._itemList.begin(); i != BF_INVENTORY._itemList.end(); ++i, ++objIndex) { InvObject *obj = *i; + // Check whether the object is in any of the four inventory slots for (int slotIndex = 0; slotIndex < 4; ++slotIndex) { - int idx = _slotStart + slotIndex; + int idx = _slotStart * 4 + slotIndex; int objectIdx = (idx < (int)_itemList.size()) ? _itemList[idx] : 0; if (objectIdx == objIndex) { UIInventorySlot *slot = slotList[slotIndex]; slot->_objIndex = objIndex; + slot->_object = obj; slot->setVisage(obj->_visage); slot->setStrip(obj->_strip); slot->setFrame(obj->_frame); @@ -326,7 +465,8 @@ void UIElements::updateInventory() { } } - if (_field820) + // Refresh the display if necessary + if (_active) draw(); } @@ -347,19 +487,30 @@ void UIElements::updateInvList() { } /** - * Updates an inventory slot with the item to be displayed - -void UIElements::updateInvSlot(UIInventorySlot *slot, int objIndex) { - slot->_objIndex = objIndex; - int itemId = (objIndex < (int)_itemList.size()) ? _itemList[objIndex] : 0; - InvObject *obj = BF_GLOBALS._inventory->_itemList[itemId + 2]; - - // TODO: Validate usage of fields - slot->setVisage(obj._displayResNum); - slot->setStrip(obj._rlbNum); - slot->setFrame(obj._cursorNum); -} -*/ + * Set the game score + */ +void UIElements::addScore(int amount) { + _scoreValue += amount; + BF_GLOBALS._sound2.play(0); + updateInventory(); +} + +/* + * Scroll the inventory slots + */ +void UIElements::scrollInventory(bool isLeft) { + if (isLeft) + --_slotStart; + else + ++_slotStart; + + updateInventory(); +} + +void UIElements::loadNotifierProc(bool postFlag) { + if (postFlag && BF_GLOBALS._uiElements._active) + BF_GLOBALS._uiElements.show(); +} } // End of namespace BlueForce diff --git a/engines/tsage/blue_force/blueforce_ui.h b/engines/tsage/blue_force/blueforce_ui.h index 15e7a760d9..601b97a9fe 100644 --- a/engines/tsage/blue_force/blueforce_ui.h +++ b/engines/tsage/blue_force/blueforce_ui.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "tsage/core.h" +#include "tsage/graphics.h" #include "tsage/sound.h" namespace TsAGE { @@ -33,7 +34,12 @@ namespace BlueForce { using namespace TsAGE; -class UIElement: public AltSceneObject { +class StripProxy: public EventHandler { +public: + virtual void process(Event &event); +}; + +class UIElement: public BackgroundSceneObject { public: int _field88; bool _enabled; @@ -49,7 +55,8 @@ public: // This class implements the Question mark button class UIQuestion: public UIElement { private: - void showDescription(int lineNum); + void showDescription(CursorType item); + void showItem(int resNum, int rlbNum, int frameNum); public: virtual void process(Event &event); void setEnabled(bool flag); @@ -64,13 +71,16 @@ public: virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void draw(); - + void updateScore(); }; class UIInventorySlot: public UIElement { +private: + void showAmmoBelt(); public: int _objIndex; + InvObject *_object; UIInventorySlot(); virtual Common::String getClassName() { return "UIInventorySlot"; } @@ -79,6 +89,8 @@ public: }; class UIInventoryScroll: public UIElement { +private: + void toggle(bool pressed); public: bool _isLeft; @@ -96,12 +108,13 @@ public: Rect _bounds; bool _visible; bool _clearScreen; - int _field4E; + bool _cursorChanged; Common::Array<UIElement *> _objList; UICollection(); void setup(const Common::Point &pt); void hide(); + void show(); void resetClear(); void draw(); }; @@ -109,7 +122,6 @@ public: class UIElements: public UICollection { private: void add(UIElement *obj); - void updateInventory(); void updateInvList(); public: UIElement _object1; @@ -118,14 +130,23 @@ public: UIInventorySlot _slot1, _slot2, _slot3, _slot4; UIInventoryScroll _scrollLeft, _scrollRight; ASound _sound; - int _itemCount, _slotStart, _scoreValue; - bool _field820; + int _slotStart, _scoreValue; + bool _active; Common::Array<int> _itemList; + Visage _cursorVisage; + UIElements(); + virtual Common::String getClassName() { return "UIElements"; } + virtual void synchronize(Serializer &s); virtual void postInit(SceneObjectList *OwnerList = NULL) { error("Wrong init() called"); } virtual void process(Event &event); void setup(const Common::Point &pt); + void updateInventory(); + void addScore(int amount); + void scrollInventory(bool isLeft); + + static void loadNotifierProc(bool postFlag); }; } // End of namespace BlueForce |