aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage/blue_force
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tsage/blue_force')
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.cpp434
-rw-r--r--engines/tsage/blue_force/blueforce_dialogs.h92
-rw-r--r--engines/tsage/blue_force/blueforce_logic.cpp1064
-rw-r--r--engines/tsage/blue_force/blueforce_logic.h260
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.cpp705
-rw-r--r--engines/tsage/blue_force/blueforce_scenes0.h89
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.cpp320
-rw-r--r--engines/tsage/blue_force/blueforce_scenes1.h54
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.cpp1720
-rw-r--r--engines/tsage/blue_force/blueforce_scenes2.h284
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.cpp5425
-rw-r--r--engines/tsage/blue_force/blueforce_scenes3.h774
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.cpp1659
-rw-r--r--engines/tsage/blue_force/blueforce_scenes4.h267
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.cpp2547
-rw-r--r--engines/tsage/blue_force/blueforce_scenes5.h406
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.cpp507
-rw-r--r--engines/tsage/blue_force/blueforce_scenes6.h124
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.cpp277
-rw-r--r--engines/tsage/blue_force/blueforce_scenes7.h103
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.cpp1397
-rw-r--r--engines/tsage/blue_force/blueforce_scenes8.h230
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.cpp1677
-rw-r--r--engines/tsage/blue_force/blueforce_scenes9.h318
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.cpp970
-rw-r--r--engines/tsage/blue_force/blueforce_speakers.h344
-rw-r--r--engines/tsage/blue_force/blueforce_ui.cpp273
-rw-r--r--engines/tsage/blue_force/blueforce_ui.h35
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